C++ frage Pointer Addieren

06/18/2011 17:51 Exera-kun#1
Wie der name ja eigetlich schon sag würde ich mal gerne wissen wie pointer addiert

Wen ich Google finde ich nix was mir weiter hilft

Thx in Vorraus

~Mfg~
06/18/2011 17:58 xNopex#2
Inwiefern addieren? Die Pointer selber, oder das, auf das die Pointer zeigen?

Ersteres:
Code:
int* ptr1 = &someValue;
int* ptr2 = &someOtherValue;
int* ptr3 = (int*)(int(ptr1) + int(ptr2)); //Keine Ahnung, wo das genau jetzt hinzeigt
int* ptr4 = &someValue + 100; //Keine Ahnung, wo das genau hinzeigt
Zweiteres:
Code:
int* ptr1 = &someValue;
int* ptr2 = &someOtherValue;
int result = (*ptr1) + (*ptr2);
06/18/2011 18:01 Exera-kun#3
Verstehe es immer noch nicht ganz

Das auf den pointer zeigt

Um z.b den wert von den pointer zu erhalten


BaseAdress 0x108BC94
offset1 0xBC
offset2 0x190
offset3 0x4
offset4 0x0
offset5 0x20

Wie würde es aussen mit den offset und der addy
Die ich oben angegeben hab

Beispiel damit wäre sehr nätt
06/18/2011 18:04 xNopex#4
Code:
unsigned int base = 0x108BC94;
unsigned int a1 = base + 0xBC;
void* ptr1 = reinterpret_cast<void*>(a1);
06/18/2011 18:09 Exera-kun#5
unsigned int base = 0x108BC94;
unsigned int a1 = base + 0xBC;
unsigned int a2 = a1 + 0x190;
void* ptr1 = reinterpret_cast<void*>(a2);

Wäre das richtig
06/18/2011 18:13 xNopex#6
Syntaktisch schon. Kommt darauf an, was du brauchst. Brauchst du einen Pointer, der auf (baseAddress+0x24C) zeigt, dann ja. Sonst nein.
06/18/2011 18:17 Exera-kun#7
Naja kenn mich nicht so besonders mit pointer aus glaub aber soll bassadress + 0x24C zeigen

BaseAdress 0x108BC94
offset1 0xBC
offset2 0x190
offset3 0x4
offset4 0x0
offset5 0x20

Ingame ist der adresse des pointer so 33xxxxx - 34xxxxx
06/18/2011 18:34 Xenox3#8
@Exera- kun

Das bringt überhaupt nix wenn du angibst was für einen wert die addr ingame besitzt :D
06/18/2011 18:38 Exera-kun#9
oohh xD

Naja trotzdem komm ich nicht weiter
06/18/2011 20:33 RunzelEier#10
du hast einen level 5 pointer, also nützt es dir nichts die base address mit offsets zu adddieren.
schau worauf deine baseaddresse zeigt.
addiere das erste offset zu dem worauf die baseaddresse zeigt.
schau worauf das zeigt.
addiere das zweite offset zu dem worauf die baseaddresse zeigt plus das offset, worauf das zeigt.
ab dem punkt wirds unübersichtlich xD

du musst immer gucken worauf die addresse + offset zeigt und darauf das offset addieren.

Edit:
ich beschäftige mich erst kurz mit pointern in C++, aber das müsste so aussehen.
correct me if im wrong
Code:
DWORD* base = 0x108BC94;
BYTE Offset1 = 0xBC;
WORD Offset2 = 0x190;
BYTE Offset3 = 0x4;
BYTE Offset4 = 0x0;
BYTE Offset5 = 0x20;
DWORD* Addresse;
Addresse = &base + Offset1; //Wert vom basepointer auslesen und erstes offset addieren
Addresse = &Addresse + Offset2; // wert von addresse + offset...
Addresse = &Addresse + Offset3;
Addresse = &Addresse; //Offset4 = 0
Addresse = &Addresse + Offset5;
06/18/2011 23:50 MrSm!th#11
Quote:
Originally Posted by xNopex View Post
Code:
unsigned int base = 0x108BC94;
unsigned int a1 = base + 0xBC;
void* ptr1 = reinterpret_cast<void*>(a1);
Nicht ganz, eigentlich müsste es folgendermaßen aussehen:

Code:
unsigned int base = 0x108BC94;
unsigned int a1 = *base + 0xBC;
void* ptr1 = reinterpret_cast<void*>(a1);
Im normalfall wird das Offset nämlich auf den Wert (also die Adresse der Variable) an der Stelle addiert.

Quote:
Originally Posted by RunzelEier View Post
Code:
DWORD* base = 0x108BC94;
BYTE Offset1 = 0xBC;
WORD Offset2 = 0x190;
BYTE Offset3 = 0x4;
BYTE Offset4 = 0x0;
BYTE Offset5 = 0x20;
DWORD* Addresse;
Addresse = [COLOR="Red"]&base[/COLOR] + Offset1; //Wert vom basepointer auslesen und erstes offset addieren
Addresse = &Addresse + Offset2; // wert von addresse + offset...
Addresse = &Addresse + Offset3;
Addresse = &Addresse; //Offset4 = 0
Addresse = &Addresse + Offset5;
Hier würdest du die Adresse deiner lokalen Variable base verwenden, was ja nicht das Ziel ist.
Tatsächlich wäre es auch hier:

Code:
Addresse = *base + Offset1;
Und das auch in jeder weiteren Zeile, in der du "&" benutzt.
06/19/2011 01:04 SmackJew#12
Quote:
Originally Posted by MrSm!th View Post
Nicht ganz, eigentlich müsste es folgendermaßen aussehen:

Code:
unsigned int base = 0x108BC94;
unsigned int a1 = *base + 0xBC;
void* ptr1 = reinterpret_cast<void*>(a1);
Hab mir jetzt den Thread nicht durchgelesen, aber wie willst du denn einen Nichtzeiger dereferenzieren?
06/19/2011 09:39 Exera-kun#13
Code:
 #include <windows.h>
#include <iostream>


//addressen//

DWORD* base = 0x108BC94;
BYTE Offset1 = 0xBC;
WORD Offset2 = 0x190;
BYTE Offset3 = 0x4;
BYTE Offset4 = 0x0;
BYTE Offset5 = 0x20;
DWORD* Addresse;
Addresse = *base + Offset1; //Wert vom basepointer auslesen und erstes offset addieren
Addresse = *Addresse + Offset2; // wert von addresse + offset...
Addresse = *Addresse + Offset3;
Addresse = *Addresse; //Offset4 = 0
Addresse = *Addresse + Offset5;


//addressen//

void write()
{
	HWND fenster_handle = NULL;
	DWORD process_id;
	do
	{
		fenster_handle = FindWindow(NULL,TEXT ("S4 Client"));
	}
	while (fenster_handle == NULL);
	GetWindowThreadProcessId( fenster_handle, &process_id);
	HANDLE prozess_hanlde = OpenProcess(PROCESS_ALL_ACCESS,TRUE,process_id);


for(;;)
{
	if(GetAsyncKeyState(VK_NUMPAD3))
	{
	
	*(long*)(*Addresse) = 10000000;

	 MessageBoxA(NULL, "!", "", MB_OK);

  }
 }
}

void Hack()
{
for(;;)
{ 
write();
}
}

BOOL WINAPI DllMain(HINSTANCE mod,DWORD DWORD_GRUND,LPVOID res)
{
	switch(DWORD_GRUND)
	{
	case 1:
		CreateThread(0,0,(LPTHREAD_START_ROUTINE)Hack,0,0,0);
		MessageBoxA(NULL,"Successfully Started!","SoulBeats",MB_OK);

		break;
	case 2:
		break;
	}
	return true;
}
Jetzt kommen 11 fehler einer davon ist int kann nicht zu dowrd kovertiert werden
06/19/2011 10:05 xNopex#14
Quote:
Hab mir jetzt den Thread nicht durchgelesen, aber wie willst du denn einen Nichtzeiger dereferenzieren?
Im Eifer des Gefechts hat MrSm!th einen kleinen Cast vergessen (Ich bin immer noch für nen Syntax-Prüfer-Addon, wenn es sowas gibt):
Code:
UINT* base = reinterpret_cast<UINT*>(0x108BC94);
UINT a1 = *base + 0xBC;
void* ptr1 = reinterpret_cast<void*>(a1);
So müsste das passen.

Quote:
einer davon ist int kann nicht zu dowrd kovertiert werden
[Only registered and activated users can see links. Click Here To Register...]
06/19/2011 11:09 MrSm!th#15
Quote:
Originally Posted by SmackJew View Post
Hab mir jetzt den Thread nicht durchgelesen, aber wie willst du denn einen Nichtzeiger dereferenzieren?
Mein Fehler, jo, da fehlt ein kleiner cast :o