PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Simples HotPatch Api Hooking Beispiel (32bit only)



Hamtaro
22.02.2017, 22:35
https://git.free-hack.com/hamham/hotpatch_hooking

Ein kleines Beispiel welches zeigt wie man WinApis hooken kann, mittels der von Microsoft so beabsichtigten Hotpatch-Methode
(Eine bessere Erläuterung dazu hier https://blogs.msdn.microsoft.com/oldnewthing/20110921-00/?p=9583)

Kurz erklärt sind die ersten beiden Bytes der Api mov edi, edi, was überhaupt nichts macht. Und vor der Funktion sind mindestens 5 Bytes frei. Man überschreibt also die ersten beiden Bytes mit einem jmp $ - 5, also 5 zurück. Und in diese 5 bytes platziert man dann die lange jmp instruction zu deiner Hooking-Funktion. Das hat den kleinen Vorteil, dass man keine Trampolin-Func braucht sondern einfach (OriginaleAddresse + 2) aufrufen kann um den Jmp zu skippen.

Sollte so in jedem 32bit Prozess mit den allermeisten Windows Apis funktionieren.
Eine Ausnahme sind z. B. die syscall-wrapper in ntdll.dll, z. B. NtQuerySystemInformation.


Zu denen kann ich aber sonst irgendwann mal was posten.

wacked
26.02.2017, 17:27
Äh, man sollte zuerst den 0xE9 Sprung schreiben.


Stell dir vor das Program das du gerade patchen willst will genau in diesem Moment MessageBoxA ausführen.


NOP
NOP
NOP
NOP
NOP
MOV EDI, EDI 
whatever

ist der normale Code. Jetzt fängst du an zu patchen aber dein Thread (Thread A) wird unterbrochen.




NOP
NOP
NOP  <-- EIP
NOP
NOP
JMP -5
whatever

Der andere Thread B führt jetzt in einer Endlosschleife immer NOPs aus. Erstmal nicht schlimm, aber irgendwann wird ja auch B unterbrochen und du kannst weiter patchen.




JMP hook
JMP -5
whatever
Nur leider sieht es für B so aus:




0xE9 
0xAF
0xFE  <-- EIP
0x12
0x34
JMP -5
whatever
und dann versucht es einen Teil der Adresse als Befehl zu interpretieren. 


(Ich ignoriere hier jetzt mal instruction caches)