Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Globaler API-Hook funktioniert nicht

  Alt 14. Mai 2008, 21:43
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat