AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Dynamische Memory Adressen - Startpunkt herausfinden

Dynamische Memory Adressen - Startpunkt herausfinden

Ein Thema von milos · begonnen am 19. Jul 2015 · letzter Beitrag vom 24. Jul 2015
Antwort Antwort
Seite 2 von 2     12
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#11

AW: Dynamische Memory Adressen - Startpunkt herausfinden

  Alt 24. Jul 2015, 18:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
508 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Dynamische Memory Adressen - Startpunkt herausfinden

  Alt 24. Jul 2015, 19:55
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
Miniaturansicht angehängter Grafiken
p6ov.jpeg  
Milos
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#13

AW: Dynamische Memory Adressen - Startpunkt herausfinden

  Alt 24. Jul 2015, 21:41
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]".

Geändert von brechi (24. Jul 2015 um 21:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
508 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Dynamische Memory Adressen - Startpunkt herausfinden

  Alt 24. Jul 2015, 23:06
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

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

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

Geändert von milos (25. Jul 2015 um 01:10 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr.
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