Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Klatsch und Tratsch (https://www.delphipraxis.net/34-klatsch-und-tratsch/)
-   -   Blog Gastartikel: API Hooking und DLL Injection (https://www.delphipraxis.net/154849-blog-gastartikel-api-hooking-und-dll-injection.html)

Zacherl 28. Sep 2010 02:40

Blog Gastartikel: API Hooking und DLL Injection
 
Hey,

ich habe gestern und heute 2 kleine Gastartikel in einem Blog verfasst. Gehalten sind beide Beiträge im Tutorial-Stil, um (hoffentlich) auch Anfängern in diesem Bereich einen einfachen Einstieg zu ermöglichen.

Fals ihr Lust habt und euch das Thema interessiert, könnt ihr die Artikel ja mal überfliegen und mir evenutell hilfreiche Tipps und Tricks zukommen lassen. Blogging und Verfassen von Tutorials sind absolutes Neuland für mich, also seid nachsichtig mit mir :mrgreen:

:arrow: http://opcodez.wordpress.com/2010/09...ing-die-erste/
:arrow: http://opcodez.wordpress.com/2010/09...king-teil-1-5/

Geplant sind zwei weitere Artikel zum Thema Exception Hooking (wird vom Blogbesitzer verfasst) und Hardware Breakpoint Hooks.

Viele Grüße
Zacherl

Zacherl 30. Sep 2010 19:37

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Ich nutze die Gelegenheit mal zum pushen:
:arrow: http://opcodez.wordpress.com/2010/09...it-exceptions/

lbccaleb 1. Okt 2010 20:39

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Danke. Wird es davon einmal eine PDF geben?

Zacherl 2. Okt 2010 03:53

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Ich überlege mir später eine kleine Tutorial-Serie rauszumachen, wenn die Artikel gut ankommen. Dann würde ich das ganze natürlich auch als PDF zur Verfügung stellen.

xZise 2. Okt 2010 09:08

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Moin, also ich muss ehrlich sagen das der erste Artikel nicht sehr verständlich ist. Das mag damit zusammen hängen das ich nicht sehr viel mit Assembler zu tun hatte (bisher nur ein Semester MIPS).

Ich bin eben etwas verwirrt welche Befehle wie veränderst.

Fabian

Zacherl 2. Okt 2010 14:34

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Danke schonmal für dein Feedback :)

Verstehst du den Abschnitt im Code nicht oder die Erklärung der Assembler Codes vom MessageBoxW Ausschnitt? Bei Letzterem wird ja eigentlich nur ein PUSH %adresse% und ein RET ganz an den Anfang der API geschrieben.

xZise 2. Okt 2010 14:55

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Hmmm schwer zu sagen,
also ich lese den Text zum dritten mal, und jetzt verstehe ich auch was du vor hast :D Was vielleicht hilfreich wäre, was du denn ersetzt, bzw. was das für eine wirkung hast: Also zuerst tust du so als wäre der EIP deine Callback Funktion und machst ein RETN.

Aber ein paar Fragen bleiben noch übrig:
  • Wieso weiß O_MessageBoxW, dass es die echte Funktion aufrufen soll?
  • Woher hast du den Wert bei: PUSH 408662 (Callback)?
  • Woher weiß die Funktion, wo die original Methode liegt?

MfG
Fabian

Zacherl 2. Okt 2010 15:44

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Zitat:

Zitat von xZise (Beitrag 1053348)
Wieso weiß O_MessageBoxW, dass es die echte Funktion aufrufen soll?

O_MessageBoxW zeigt ja auf einen neuen Buffer, den ich in der HookCodeInline Funktion alloziiere. Am Anfang dieses Buffers stehen zuerst die überschriebenen Originalinstructions (sonst würde die MessageBoxW Funktion ja nicht mehr vollständig funktionieren) und danach ein Sprung zur Originaladresse in der kernel32.dll. Hierbei werden die schon ausgeführten Instructions natürlich übersprungen, sodass wir praktisch bei MessageBoxW + 6 Bytes landen. Ruft man also O_MessageBoxW aus, wird unser Sprung zum Callback übersprungen und praktisch nur der original API Code ausgeführt.

Zitat:

Zitat von xZise (Beitrag 1053348)
Woher hast du den Wert bei: PUSH 408662 (Callback)?

In unserem Programm haben wir ja die Callback Funktion deklariert, welche an einer bestimmten Adresse im Speicher liegt. Diese Adresse hole ich mir mit Cardinal(@C_MessageBoxW) und schreibe sie dann ins PUSH.

Zitat:

Zitat von xZise (Beitrag 1053348)
Woher weiß die Funktion, wo die original Methode liegt?

Die original API bekommt man ja über GetProcAddress(LoadLibrary('kernel32.dll'), 'MessageBoxW'). Im Buffer von O_MessageBoxW befindet sich dann wie schon erwähnt der Jump zur Originaladresse (+ die Anzahl der schon überschriebenen / ausgeführten Bytes).

xZise 2. Okt 2010 16:11

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Zitat:

Zitat von Zacherl (Beitrag 1053357)
[...]
Zitat:

Zitat von xZise (Beitrag 1053348)
Woher weiß die Funktion, wo die original Methode liegt?

Die original API bekommt man ja über GetProcAddress(LoadLibrary('kernel32.dll'), 'MessageBoxW'). Im Buffer von O_MessageBoxW befindet sich dann wie schon erwähnt der Jump zur Originaladresse (+ die Anzahl der schon überschriebenen / ausgeführten Bytes).

Nein ich meinte eher, irgendwo rufst du doch "MessageBox(...)" auf. Diesen Aufruf hookst du doch. Dann springst du da in den Callback mit RETN, aber dadrin kommst du doch nicht zum original Aufruf wieder zurück, oder habe ich da was übersehen?

MfG
Fabian

Zacherl 2. Okt 2010 19:53

AW: Blog Gastartikel: API Hooking und DLL Injection
 
Also das Programm ruft irgendwo ganz normal MessageBoxW auf. Durch den Hook komme ich dann zum Callback. Jetzt darf ich im Callback halt nicht die originale MessageBoxW aufrufen, da diese direkt wieder zum Callback springen würde. Deshalb rufe ich O_MessageBoxW auf, die praktisch nur das Verhalten der originalen API kopiert bzw. zu dieser hinspringt, wobei der Jump zum Callback aber übergangen wird.

Der springende Punkt ist hier die globale Variable O_MessageBoxW :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz