@yihaaa: Blödsinn. Ein Detour ist im Grunde eine Codecave.
Da MS Detours automatisch die zu sichernde Menge an Bytes erkennt brauchst du nichts weiter beim Detour selbst beachten.
Du setzt den Detour einfach auf AdresseDerFunktion+OffsetAnDemDuDenJumpHabenMöchte st.
Was du aber beachten musst, sind eventuelle Stackzugriffe und Register.
Du musst dann auf jeden Fall deine Funktion als naked definieren, damit sie keinen Stackframe erstellt! Außerdem darfst du keine lokalen Variablen verwenden!
Und wenn du die Register brauchst (da man normalerweise mit einem Detour etwas verändern möchte und das Rechnungen/Speicherzugriffe/Funktionsaufrufe hervorruft, braucht man die fast immer) musst du die vorher alle auf dem Stack sichern! (pushad und pushfd)
Wenn du inline ASM nutzt, kannst du auch manuell die Register sichern, die du nutzt und sparst so etwas Rechnerei.
Ach ja und natürlich musst du auf die Parameter auch per inline ASM zugreifen, da du keine Parameter deklarieren solltest (denn der Compiler geht bei der Codegenerierung davon aus, dass die Parameter beim Aufruf an der Stelle sind, an der er sie erwartet, was bei eine Detour mitten in der Funktion aber nicht der Fall sein wird).
Außerdem weiß ich nichtmal, ob das überhaupt ginge, da afaik dafür ein Stackframe benötigt wird, der ja nicht erstellt wird.
Bei __stdcall Funktionen ist das einfach, da greifst du auf eventuelle Parameter mit dem EBP Register zu.
Bei __cdecl Funktionen wirst du, da man mit esp arbeitet, selbst das richtige Offset für die Parameter berechnen müssen (welches durch jedes PUSHen und POPen (auch durch das Sichern der Register) beeinfusst wird).
Quote:
|
Wen du ein hook setzten willst musst du ja 5bytes (jmp+sprungweite) überschreiben. Nun musst du aber darauf achten das wen der Maschinenbefehl der an der addresse ist an der du hooken willst nun keine 5bytes groß ist sondern z.b. 6 bytes das du nicht nur 5 bytes ins trampolin sicherts sondern 6bytes. Andererseits wen der Maschienenbefehl nur 4bytes groß ist dan must du den nächsten Maschinenbefehl der z.b. 3bytes groß ist mit sichern also im trampolin platz für 7 bytes machen.
|
Das gilt auch für den Funktionsanfang und ist bei MS Detours belanglos.