Debuger frage!
-
Hi,
ich weiß zwar nicht ob ich hier richtig bin, aber ein extra Debuger Subforum gibts ja hier nicht (oder?) und da debugen eine Menge mit Asm zu tun hat, dachte ich ich schreib mal hier rein.
Also, ich habe mir einen Memory Editor zu gelegt um in Spielen, deren Speicher nach Adressen zu suchen, die z.B. Leben, Mana ect. beinhalten. Zu meiner Verteidigung, falls jetzt hier gleich einige schreien: Cheater bla bla... ich will diese Adressen nur auslesen um mir spaeter Statistiken und so anzufertigen.
Ok, ich habe jetzt nun wärend des spielens die Adresse gefunden, wo die Leben drin gespeichert werden, da es sich aber um eine dynamische speicher Adresse handelt, habe ich davon beim naechsten Spielstart nichts mehr. Mein Problem liegt jetzt darin, wie finde ich die Zeile von wo aus in die Adresse geschrieben wird?, bzw. koennte ich diesen "Ursprung" bei jeden Spielstart dahin verfolgen wo nun der entgültige Wert gespeichert wird, um ihn dann mit meinem Programm aus zu lesen?
Ich habe hier mal ein paar Bilder, die zeigen wo ich gerade haenge.
Hier die gefundenen Adressen die sich aber bei jeden Neustart aendern:
http://www.pictureupload.de/originals/pictures/260108171104_Gefunden_mit_editor.JPG
Hier die Ansicht, wenn ich auf die Adresse um zu sehen was diese Adresse schreibt:
http://www.pictureupload.de/originals/pictures/260108171248_Und_Nun.JPG
Ich kenn mich so ziemlich gar nicht mit Asm aus deswegen hoffe ich das mir hier jemand helfen kann, da ich mit dem zweiten Bild nichts anfangen kann.
Danke schon mal,
Gruß Tobi.
-
T0bi schrieb:
Also, ich habe mir einen Memory Editor zu gelegt um in Spielen, deren Speicher nach Adressen zu suchen, die z.B. Leben, Mana ect. beinhalten. Zu meiner Verteidigung, falls jetzt hier gleich einige schreien: Cheater bla bla... ich will diese Adressen nur auslesen um mir spaeter Statistiken und so anzufertigen.
Ja, ne, is klar.
T0bi schrieb:
[...]
Ich nehme mal an, das hat sich erledigt?
=>
T0bi schrieb:
Ich habe folgende Codezeile:
6F14BD48 MOV DWORD PTR [ESI+248], EAX
Wie koennte ich die Speicheradresse in meinem Programm berechnen, dass ich dann mit ReadProcessMemory() den Wert auslesen kann?
Mit dieser einen Zeile? Gar nicht.
Du kannst versuchen, zu schauen, wo, wie und mit welchem Wert esi gesetzt wird, bis du irgendwann einen Pointer an einer fixen Adresse findest, aber ich fuerchte, das waere ziemlich muehsam und koennte deine Faehigkeiten uebersteigen.
Das ist das Tolle an objektorientierten Frickelprogrammen: In den Assemblercodes findet man sich ohne die Quellcodes praktisch kaum zurecht.
Inwiefern es in Windows Moeglichkeiten gibt, Breakpoints in den Code des Programms einzufuegen und damit die Werte abzufangen, weis ich leider auch nicht.
-
Hinweis :
Such mal die Stelle im Programm wo die 'Gesundheits'-Adresse gespeichert wird.
-
cheat- äh statistik-fan schrieb:
Hinweis :
Such mal die Stelle im Programm wo die 'Gesundheits'-Adresse gespeichert wird.
meinst du die Offsetadresse die sich aus dem ESI+248 ergibt? oder iwe jetzt?
Gruß Tobi.
-
Genau die !
Falls die genaue Adresse nicht zu finden ist, dann probiere sie zu 'glätten' (i.e. statt nach 0x124802F8 zu suchen, nimm z.B. 0x12480000).
Danach kannste einen Doppelpointer zusammenfrickeln. Schließlich muß das Programm ja irgendwo diese Adresse speichern um selbst darauf zuzugreifen.
Spielefrickler kochen auch nur mit Wasser.
-
Fakt ist, das die Adresse an der Du mit
MOV DWORD PTR [ESI+248], EAX
den Inhalt von eax abspeicherst, mit nachfolgendem
LEA EAX, [ESI+248]
ins Register EAX geladen wird.
-
Ja die Offsetadresse zu finden is ja nicht so schwer, aber das problem is ja das diese sich immer wieder aendert und noch was ist komiisch der wert von eax der dahin verschoben wird entspricht nicht dem gresuchten wert.
Doch das eigentlich problem ist ja, wie kann ich nun ein C++ Programm schreiben das diese Offsetadresse immer automatisch findet?
-
T0bi schrieb:
Doch das eigentlich problem ist ja, wie kann ich nun ein C++ Programm schreiben das diese Offsetadresse immer automatisch findet?
Steht schon weiter oben :
Mußt nur die Stelle im Programm finden, an der die 'Offset'-Adresse gespeichert wird.
-
hae? Versteh ich nicht, diese stelle aendert sich doch aber mit jedem programm nestart
-
*möööp*
-
T0bi schrieb:
hae? Versteh ich nicht
Jetzt mal ernsthaft :
Ahnste wirklich nicht, warum die Stelle, an der das Programm die 'Offset'-Adresse speichert, für Statistikzwecke besonders geeignet sein könnte ?
-
Hm, ich moechte nur mal darauf hinweisen, dass ich den von unserem anonymen Freund angedeuteten Hinweis in ausfuehrlicherer Form bereits gegeben hatte. Wenn ihr weiter rumspielen wollt, tauscht doch bitte eMail- oder messenger-Adressen, dann kann ich hier dicht machen.
-
Ey leute ich hab echt nicht viel ahnung von Asm, bei mir brauch es da evtl. schon etwas mehr als ne simple erklaerung, ich will doch infach nun wissen wie ich mit meinem programm automatisch auf die offsetadresse komme...
-
T0bi schrieb:
Ey leute ich hab echt nicht viel ahnung von Asm, bei mir brauch es da evtl. schon etwas mehr als ne simple erklaerung, ich will doch infach nun wissen wie ich mit meinem programm automatisch auf die offsetadresse komme...
*seufz*
Ohne Ahnung von Assembler wirst du das selbst nicht hinbekommen. Viel mehr ist dazu wohl nicht zu sagen.
Mit "einfach" und "automatisch" ist da nichts. Eine Loesung muss speziell an das Programm angepasst werden und wuerde nach einem Update wahrscheinlich auch nicht mehr funktionieren.Wenn du nun einfach so mehr als eine allgemeine Erklaerung (evtl. speziellen Code oder eine Schritt-fuer-Schritt-Anleitung) erwartest, koennen wir uns ja erstmal ueber mein Honorar unterhalten.
-
nu ja ok ich weiss das es immer esi + 248 heisst wenn ich jetzt die stelle finde wo esi eubergeben wird wie könnte ich diese auslesen?
-
Wie ich bereits schrieb:
Wenn esi von einer festen Adresse ausgelesen wird eruebrigt sich die Frage, denke ich.
zB. "mov esi, [0x123456]"
Falls nicht, musst du weiter suchen, wo der Pointer, der auf die Adresse fuer esi zeigt, gesetzt wird, usw. bis du irgendwann einen Pointer an einer festen Adresse findest, den du als Basis nehmen kannst.
-
muss ich dann immer mit Breakpoints arbeiten, die mit "what writes this" arbeiten ? oder
-
So bekommst du deinen Pointer zum Auslesen deines Wertes.
Du kannst an die Sache zwar auch mit Breakpoints herangehen, das ist aber eine andere Geschichte.
-
Also ich habe jetzt echt ne halbe stunde nach dem Anfang der sache gesucht aber ich lass mich anscheint zu shcnell verwirren. Ich habe mal eine Text Datei hochgeladen wo der Speicherausschnitt zusehen ist.
Die beiden Pointer die auf die Offset Adresse verweisen sind:
- 6F14BD48 // Leben
- 6F14BF51 // ManaHabs auch noch mal in der Datei angemarkt.
http://www.file-upload.net/download-643093/Searching_for_ESI.txt.html
Waer nett von euch, wenn ihr mir mal Zeigen koenntet wie man das, da zurueck verfolgt. Ich dneke mal nen wirkliches Tutorial gibts dafuer nicht oder?, also waer echt voll toll.
Gruß Tobi.
-
Damit kann man leider kaum was anfangen.
Offenbar ist doch die Adresse im Code, an der die HP-Manipulation stattfindet, konstant. Also schnapp dir einen guten Debugger (vielleicht OllyDgb), setze an dieser Adresse einen Breakpoint in den Code und versuche anhand der call history nachzuvollziehen, welcher Code durchlaufen wurde. So wie es fuer mich aussieht, scheint esi in diesem Code-Ausschnitt ueber 2 call-Ebenen ueber ecx weitergereicht worden zu sein, wobei die der zuletzt aufrufende Code-Teil nicht mehr in diesem Ausschnitt liegt. Wirst also wohl ein Weilchen suchen muessen.