Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dynamische Memory Adressen - Startpunkt herausfinden (https://www.delphipraxis.net/185926-dynamische-memory-adressen-startpunkt-herausfinden.html)

brechi 24. Jul 2015 17:28

AW: Dynamische Memory Adressen - Startpunkt herausfinden
 
Das Problem wird doch sein dass die Adresse eines Zustandes (z.B. HP, Munition) nicht relativ zur Basiadresse des Moduls berechnet werden kann sondern ein Pointer darauf zeigt (z.B. Speicher auf dem Heap).

Im Spiel sieht das dann so aus:

Delphi-Quellcode:
mov eax, $00401234 // --> absolut, kann relativ zum Modulbase berechnet werden
mov ebx, [eax] // Pointer vom reserviertem Speicherbereich lesen (das was in ebx steht ist dann das was du haben willst und für ReadProcessMemory brauchst)
mov ecx, [ebx] // Wert lesen, z.B. HP
Was du also machen musst, ist die absolute Adresse rauszufinden, und dann 2x ReadProcessMemory auszuführen um den Wert zu erhalten.

1x $00401234 lesen -> entspricht [eax] bzw. [$00401234]
1x von der Adresse lesen die dort Stand -> entspricht [ebx]

Wenn du jetzt rückwärts versucht daran zu kommen, wirst du nur ebx erhalten. Und der Wert ändern sich bei dir logischerweise immer.

Wenn du das Spiel debuggen kannst, ist es am einfachsten einen Hardware-Read-Breakpoint zu setzen bzw. ein Memory Breakpoint OnAccess auf den Speicherbereich von ebx (den du ermittelt hast, und der sicht immer ändert).
Dann bleibt der Debugger dort stehen wo auf [ebx] zugegriffen wird. Dann musst du halt den Code davor analysieren bis du auf einen festen Speicherbereich ($00401234) stößt und danach über mehrmaliges ReadProcessMemory den Wert auslesen.

milos 24. Jul 2015 18:55

AW: Dynamische Memory Adressen - Startpunkt herausfinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja habe schon länger die Pointer Adressen rumliegen, leider sind die nach dem Update geändert worden und muss die genauen nochmal suchen ^^

Ich habe es jedoch nicht wirklich hinbekommen von den Pointer Adressen schlussendlich zu meinem Ziel zu gelangen. :/
Im Anhang ist ein Screenshot von der Pointer Adresse in Cheat Engine.
Muss ich nun, damit ich zum Ziel komme in Delphi das wirklich so lösen?

- Auslesen von "client.dll"+04B337A8, sollte mir laut Cheat Engine (Bild im Anhang) ja 04C099E0 geben.
- Danach dem letzten ergebniss $68 welche mir dann 04192880 zurück gibt
- Immer so weiter bis ich ganz oben und dann bei meinem Ziel "041929CC" bin?

Hab das gestern mal so ausprobiert, bin aber verzweifelt und habs aufgegeben. :/

Hab es etwa so ausprobiert:
Delphi-Quellcode:
class function TGameUtils.FollowPointerAddr(AStartPointer: Integer;
  Offsets: array of Cardinal) : integer;
var
  c: Integer;
  Address : Int64;
  R : Int64;
  Bytesread: NativeUInt;
begin
  Address := ClientBaseAddress + AStartPointer;

  for c := 0 to Length(Offsets)-1 do
  begin
    ReadProcessMemory(GameHandle, ptr(Address), @Address, SizeOf(R), Bytesread);
  end;
  ReadProcessMemory(GameHandle, ptr(Address), @Result, 4, Bytesread);
end;


Caption := IntToHex(TGameUtils.FollowPointerAddr($04B337A8,[$68, $48, $154, $3c, $14c]),8);
Hoffe einer kann mir da weiterhelfen, bin nämlich wirklich schon am verzweifeln ^^

Freundliche Grüsse

brechi 24. Jul 2015 20:41

AW: Dynamische Memory Adressen - Startpunkt herausfinden
 
Also ich würde sagen es ist sehr unwahrscheinlich.

"04B337A8" sind > 70MB, das wird nichtmehr in der client.dll liegen, sich also wahrscheinlch immer ändern.

Wenn du das Spiel neu startest, zeigt CheatEngine dir immer die gleichen Offsets an den Pointer suchst?

Wenn das immer gleich ist, dann sollte das so gehen...

Prüf auch mal was du da ausliest an Adressen und ob Bytesread = 4 ist.

Edit: Aus dem Bild sollte man die offsets auch kürzen können: "$04B337A8, [$68, $48, $14C]".

milos 24. Jul 2015 22:06

AW: Dynamische Memory Adressen - Startpunkt herausfinden
 
Oh, habe es endlich hinbekommen, auch wenn ich das letzte mal eigentlich alles genau gleich gemacht habe bzw. machen wollte.

Ja die offsets sind immer gleich, nach einem Update sind sie aber geändert, hab ich schon mit erleben dürfen :D

Jedoch ist Bytesread = 8 und nicht 4, ist da was schief gelaufen?

Danke nochmal an alle Helfer, ihr seid Spitze :D
Freundliche Grüsse


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz