Wie rechnet man Pointer und Offsets zusammen?

11/06/2014 00:57 silas2222#1
Ich weiß das diese Frage tausende male bei Google zu finden, und trotzdem bin ich seit Stunden kein Stück weiter.

Also ich versuche von dem Base-Pointer (ich glaub das nennt man so xD) durch die ganzen Offsets zu der Adresse zu kommen, die ich brauche um die Variable per ReadProcessMemory(...) auszulesen. Das habe ich so versucht:
Code:
UINT_PTR address = (((((0x27FC8C+0x18)+0xb8)+0x80)+0x90)+0x10);
(Es empfiehlt sich das Angehängte Bild anzuschauen)
Also 0x27FC8C ist mein Base-Pointer und dann hab ich die ganzen Offsets (versucht) dazu zu rechnen.
Wenn ich als address gleich die ausgerechnete Adresse (0x17653050) von CE verwende funktioniert es, also liegt es an meiner Rechnung. Kann mir jemand sagen was an der Rechnung oben falsch ist bzw. was ich überhaupt machen muss.
11/06/2014 01:23 ​Tension#2
Ich versuch es mal zu erklären:
Du fängst mit einer statischen Adresse an zu welcher du ein Offset hinzufügst und dann als DWORD ausliest, zu dem neuen Wert fügst du wieder ein Offset hinzu und liest es wieder als DWORD aus und immer so weiter.

CE zeigt dir das ja z.B so an:
Code:
10 | 17653040+10 = 17653050
90 | [17653050+90] -> 17653040
80 | [174CC538+80] -> 17653050
B8 | [0707C1C0+B8] -> 174CC538
18 | [0027FC8C+18] -> 0707C1C0
In C könnte das so aussehen:
Code:
DWORD address_base = 0x0027FC8C;
DWORD address = 0;
ReadProcessMemory(ProcessHandle, (LPCVOID)(address_base+0x18), &address, sizeof(DWORD), 0);	//Offset 1 lesen
ReadProcessMemory(ProcessHandle, (LPCVOID)(address+0xB8), &address, sizeof(DWORD), 0);	//Offset 2 lesen
ReadProcessMemory(ProcessHandle, (LPCVOID)(address+0x80), &address, sizeof(DWORD), 0);	//Offset 3 lesen
ReadProcessMemory(ProcessHandle, (LPCVOID)(address+0x90), &address, sizeof(DWORD), 0);	//Offset 4 lesen
address += 0x10;	//Offset 4 hinzufügen
Natürlich könnte man dies auch mit einer Schleife machen.
11/10/2014 22:00 silas2222#3
(Antwort etwas verspätet )
Habs jetzt hinbekommen danke :D
11/11/2014 16:31 Slade100#4
silas kannst du sagen wie du es hinbekommen hast, denn ich hab ein problem unzwar ein pointer mit 6 offsets, ich habs zwar hingebkommen aber die lösung sieht nicht sehr übersichtlich aus(das ist nicht das problem), das problem ist die dll lässt sich nicht mehr injecten, bzw, ziemlich schwer( auf einem server klappts, auf einem andern nicht) daher weiß ich das der pointer richtig ist

btw meine lösung :

DWORD Absorb = *(DWORD*)0x0070EB04;
DWORD AbsorbP = (DWORD)(Absorb + 0xD8);
DWORD AbsorbP1 = *(DWORD*)AbsorbP;
DWORD AbsorbPt = (DWORD)(AbsorbP1 + 0x250);
DWORD AbsorbPt0 = *(DWORD*)AbsorbPt;
DWORD AbsorbPt1 = (DWORD)(AbsorbPt0 + 0x4);
DWORD AbsorbPt11 = *(DWORD*)AbsorbPt1;
DWORD AbsorbPt2 = (DWORD)(AbsorbPt11 + 0x248);
DWORD AbsorbPt22 = *(DWORD*)AbsorbPt2;
DWORD AbsorbPtr = (DWORD)(AbsorbPt22 + 0x6B0);