Kleines ASM Problem

05/04/2008 10:12 CracKPod#1
Hey,

Ich wäre sehr froh darüber wenn mir jemand helfen könnte der sich mit ASM auskennt.

Ich habe folgendes Problem:

Ich möchte einen Bot für ein MMORPG schreiben. Dieses MMORPG hat einen Launcher (*.exe) und das eigentliche Spiel (*.dat) was der Launcher startet.
Die *.dat Datei wird anscheinend regelmäßig vom Launcher so verändert das sich einige der Adressen ändern.

-> Vorab sei gesagt: Die Pointer auf die Adressen ändern auch ihre Werte! <-

14:30 - Adresse ist richtig
--- Neustart etc.
15:00 - Adresse ist immer noch richtig (auch an anderen PC'S)
16:00 - Andere Adresse

Deswegen wollte ich jetzt folgendes machen:

Wenn ich im Spiel Energie Verliere:

Einen JMP zu einen CODECAVE dort den richtigen Befehl ausführen den ich im Original mit einem CALL ersetzt habe und dann am ende des Code Caves einfach RET. Vor oder direkt nachdem originalen Befehl packe Ich dann eine Anweisung in dieser Art:

Also:

Original ASM
Code:
[...]
MOV     EAX, EDI
MOV     DWORD PTR [EBX+4C], EAX <-- Original ASM
MOV     EDX, DWORD PTR [EBX+48]
[...]
Editiertes ASM:
Code:
[...]
MOV     EAX, EDI
MOV     CALL 77FA920B <-- Springe zu Code Cave
MOV     EDX, DWORD PTR [EBX+48]
[...]
Code Cave:
Code:
77FA9209 JMP 77FA9240 <- Springe zum Ende Des Code Caves
77FA920B <- Start
//Mein Code

MOV     DWORD PTR [0018586F], EAX <- Schreibe den Wert an eine statische Adresse (EAX = Leben)
MOV     DWORD PTR [EBX+4C], EAX <- Originale Anweisung ausführen

//Mein Code
77FA923F RET <- Springe zum originalen Speicherbereich
77FA9240 <- Ende des Code Caves
Das funktioniert auch alles (selbst wenn ich das hier jetzt Falsch aufgeschrieben habe).
Also das Spiel crashed nicht etc. aber etwas ist merkwürdig.
Der Wert der Adresse 0018586F (Also die statische Adresse) wird jetzt ab und zu der Wert des Lebens meines Charakters zugewiesen, (<- Das will ich!!), den Wert des Gegners (<- Nützlich.. will ich aber nicht!) und einen unbekannten wert.

Also wie kann ich das Problem beheben?
Scheint irgendwie so als hätte EAX oft einen anderen Wert, das heißt im Original wird "MOV DWORD PTR [EBX+4C], EAX" öfters aufgerufen von verschiedenen stellen im Code und da dort jetzt Call steht wird zu meinem Code Cave gesprungen und dort der neue Wert von EAX in meine statische Adresse geschrieben.

Kann mir jemand verraten wie ich das verhindere (falls es so stimmt) oder was ich besser machen kann?

Tut mir Leid falls ich voll die Scheiße gelabert habe aber das war alles mehr oder weniger Reverse Engineering ich habe mich noch nie mit ASM befasst und das war alle mehr oder weniger geraten und von der Funktionsweise der anderen Befehle abgeleitet.

MfG,
CracKPod

PS:
Falls es Fragen gibt fragt! Es kann durchaus sein das ich mir sehr undeutlich ausgedrückt habe.

PPS:
Falls jemand einen besseren Weg kennt nur zu , postet. Danke
05/04/2008 13:08 mr.rattlz#2
Wenn ich das beim Überfliegen richtig verstanden habe sollte es eigentlich genügen, wenn du einen Breakpoint auf den Punkt setzt, der von verschiedenen Adressen aufgerufen wird und dir dann ansiehst, wo der Codeteil liegt, von dem du die Daten haben willst.