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.
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.
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).