Ich habe extra geschrieben, dass FindNextHook ohne Parameter und besondere Aufrufkonvention notiert wird, damit kein Stackframe generiert wird. Das bedeutet aber auch, dass ebp nicht neu gesetzt wird, man muss also relativ zu esp zugreifen.
In meinem Beispielcode ist aber auch ein Fehler. Falls man eine Nachbearbeitung der Parameter durchführen will, ist es nicht mehr so einfach wie beim Jump (ich habe bisher nur diesen verwendet, daher bitte ich den Fehler zu entschuldigen). Denn die Rückkehradresse wird so ja erst nach den ersten Befehlen gepusht, was tödlich sein kann, falls die ersten Befehle irgend etwas am Stack verändern. Die richtige Variante sähe ungefähr so aus:
Delphi-Quellcode:
procedure FindNextFileReplace;
asm
push [esp+8]
push [esp+8]
call @@GetReturnAdress
@@GetReturnAdress:
add [esp], 14
//4 Byte: Opcode, ModR/M, SIB, Immediate
nop
nop
nop
nop
nop
jmp offset FindNextFile + 5
//5 Byte
jmp MyFindNextFile
end;
Das ist alles aus dem Kopf getippt und nicht getestet.
Die Länge der Befehle am Anfang der Routine musst du von Hand abzählen, um die Position der Nops zu erhalten.