Einzelnen Beitrag anzeigen

Apollonius

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

Re: Globaler API-Hook funktioniert nicht

  Alt 17. Mai 2008, 15:31
In NextHook sollte es Jmp und nicht Call heißen. Wie ich bereits bemerkt habe, verändert die Rückkehradresse sonst den Stack. Außerdem solltest du die Veränderung an FindNextOld direkt beim Einrichten des Hooks vornehmen, sonst gibt es Probleme mit mehreren Threads.
Meine Lösung ist übrigens praktisch identisch mit Brechis.
Um nochmal zu deiner Frage zu meinem Code zurückzukommen:
add [esp], 14 verändert nicht esp selbst, sondern den Integer, auf den esp zeigt. Das ist zufällig die Zahl, welche zuoberst auf dem Stack liegt. Welche ist das in diesem Fall? Genau, die Adresse, die durch den Call auf den Stack geschoben wurde. Diese zeigte vorher auf @@GetReturnAddress und wird nun auf den Befehl nach dem Jump rejustiert (durch das Add stimmen die 14 Bytes übrigens nicht mehr - bei diesen Adress-Geschichten ist der Inline-Assembler leider immer ein bisschen pingelig, ich sehe ehrlich gesagt kein Problem darin, zu der Adresse einer Funktion 5 zu addieren). Ich gestehe allerdings, bezüglich des jmp offset FindNextFile + 5 nicht mitgedacht zu haben - wir verwenden hier mal wieder die Weiterleitungsfunktion und nicht jene in Kernel32.dll, aber du hast das ja schon richtig mit einer globalen Variablen korrigiert. Wir legen also für die originale FindNext-Funktion eine künstliche Rückkehradresse an. Im Prinzip ist das das selbe, was in Brechis Code mit zwei Routinen gemacht wird.
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