18.04.2015, 18:12
Hi Zurgrimm!
Ich habe dein Tool bisher noch ned getestet oder im Source begutachtet, da du aber offenbar Asm-Instruktionen auffängst, mal 'ne Frage, werden auch CALL's abgefangen, und die verschiedenen Varianten (NEAR, FAR, usw.)?
Ich frage, weil es mehrere Möglichkeiten hier gibt, viele Compiler optimieren z.B. ein:
CALL func
RET
zu:
JMP func
Wenn Du also nur JMP abfängst, aber ned CALL, kann es sein, dass Dir vieles durch den Lappen geht.
'func' ist in unserem Fall wohl die Randomize-Funktion
Desweiteren sind auch Aufrufe in folgenden Formen möglich:
JZ func
JNZ func
JC func
JNC func
etc.
Dies kann vom Compiler ebenso erzeugt werden.
JNZ .skip
CALL func
.skip: ...
wird zu:
JZ func
...
optimiert.
Achte auch drauf, dass indirekte Adressierungen erkannt werden, z.B. so was wie:
LEA EAX,func
CALL [EAX] bzw. JMP [EAX]
Als Tipp so generell, anstatt die ganzen Instruktionen einzeln zu tracen und gucken ob die auf 'func' zeigen, würde ich einfach checken, ob PC = func ist (also program counter), damit erwischste definitiv jedenfall dann alles.
Mit 'nem guten Debugger kannst da auch nach dem RET gucken dann von wo das aufgerufen wird (Stackframe) und so z.B. erkennen ob der Aufruf von einer Talentprobe kommt. So kannst auch dem Kampfsystem auf der Spur kommen, warum da noch nix angezeigt wird. Ich nehme an, dass da eher mit CALL gearbeitet wird. Warum das so wichtig ist, will ich mal an folgendem Asm-Code erläutern:
MOV AL, [ESI+0xC] // MU vom Char in ESI
MOV BL, 6 // 1W6
CALL func // Würfeln (was dein Logger ausgibt)
MOV DX,AX // Ergebnis vom Wurf sichern
MOV AL, [ESI+0XD] // KL vom Char im ESI
MOV BL, 6 // 1W6
CALL func // Würfeln
ADD DX,AX // Aktuellen Wurf vom vorherigen addieren
MOV AL, [ESI+0XF] // KK vom Char im ESI
MOV BL, 6 // 1W6
JMP func // Würfeln und Rücksprung zu anderer Funktion
Wenn Du jetzt nur JMP abfängst, dann übersiehste quasi die beiden CALLs und damit die Würfe, d.h. dein Logger würde nur die KK-Probe anzeigen aber ned die MU und KL-Probe, da diese per CALL aufgerufen werden.
Kann da übrigens, wenn's die Zeit erlaubt auch gerne ein bissel bei helfen.
Zurgrimm schrieb:Die Angaben in eckigen Klammern sind eher als Orientierung für mich gedacht. Dort steht, woher der Aufruf der Probenfunktion ursprünglich kam. "JMP" heißt einfach, dass die Probefunktion über einen "JMP"-Befehl aufgerufen wurde. Dadurch kann man später weitere Funktionen des Spiels identifizieren.
Ich habe dein Tool bisher noch ned getestet oder im Source begutachtet, da du aber offenbar Asm-Instruktionen auffängst, mal 'ne Frage, werden auch CALL's abgefangen, und die verschiedenen Varianten (NEAR, FAR, usw.)?
Ich frage, weil es mehrere Möglichkeiten hier gibt, viele Compiler optimieren z.B. ein:
CALL func
RET
zu:
JMP func
Wenn Du also nur JMP abfängst, aber ned CALL, kann es sein, dass Dir vieles durch den Lappen geht.
'func' ist in unserem Fall wohl die Randomize-Funktion
Desweiteren sind auch Aufrufe in folgenden Formen möglich:
JZ func
JNZ func
JC func
JNC func
etc.
Dies kann vom Compiler ebenso erzeugt werden.
JNZ .skip
CALL func
.skip: ...
wird zu:
JZ func
...
optimiert.
Achte auch drauf, dass indirekte Adressierungen erkannt werden, z.B. so was wie:
LEA EAX,func
CALL [EAX] bzw. JMP [EAX]
Als Tipp so generell, anstatt die ganzen Instruktionen einzeln zu tracen und gucken ob die auf 'func' zeigen, würde ich einfach checken, ob PC = func ist (also program counter), damit erwischste definitiv jedenfall dann alles.
Mit 'nem guten Debugger kannst da auch nach dem RET gucken dann von wo das aufgerufen wird (Stackframe) und so z.B. erkennen ob der Aufruf von einer Talentprobe kommt. So kannst auch dem Kampfsystem auf der Spur kommen, warum da noch nix angezeigt wird. Ich nehme an, dass da eher mit CALL gearbeitet wird. Warum das so wichtig ist, will ich mal an folgendem Asm-Code erläutern:
MOV AL, [ESI+0xC] // MU vom Char in ESI
MOV BL, 6 // 1W6
CALL func // Würfeln (was dein Logger ausgibt)
MOV DX,AX // Ergebnis vom Wurf sichern
MOV AL, [ESI+0XD] // KL vom Char im ESI
MOV BL, 6 // 1W6
CALL func // Würfeln
ADD DX,AX // Aktuellen Wurf vom vorherigen addieren
MOV AL, [ESI+0XF] // KK vom Char im ESI
MOV BL, 6 // 1W6
JMP func // Würfeln und Rücksprung zu anderer Funktion
Wenn Du jetzt nur JMP abfängst, dann übersiehste quasi die beiden CALLs und damit die Würfe, d.h. dein Logger würde nur die KK-Probe anzeigen aber ned die MU und KL-Probe, da diese per CALL aufgerufen werden.
Kann da übrigens, wenn's die Zeit erlaubt auch gerne ein bissel bei helfen.