WinApi hooking führt zum "Buffer Overrun!", hilfe!
-
http://www.hackerboard.de/thread.php?threadid=36201&hilightuser=18020 << da hab ich detourhooking erklaert, dort befindet sich auch funktionierender Code
-
Hm, mein funktioniert ja jetzt auch, meine Funktion wird ausgeführt, aber die eigentlich gehookte MessageBoxA kommt trotzdem, weil sie sich in sich lebst noch einmal aufruft?
EDIT:
Ich habe mir mal dein code angesehen und eigentlicch machst du das selbe wie ich nur das ich statt alles mit _asm zu schreiben mit WriteProcessMemory() gearbeitet habe, dass ist doch eigentlich nicht weiter schlimm oder?
-
T0bi schrieb:
Also Zeile 1 ist der Sprung zu meiner Codestelle. dann nach lande ich zurück in Zeile 2, und dann wird noch mal MessageBoxA aufgerufen?
Nicht "noch mal" sondern "immer noch".
Die Funktion MessageBoxA ist simpel gesagt eine Adresse, die in Zeile 1 anfängt !!! (und bis incl. Zeile 19 geht).
-
Hm und wie koennte ich das nun "richtig" hooken? so das die MsgBox nicht kommt? Bzw. was mich noch interessiert, ist das bei allen Api Funktionen so?
EDIT:
Müsste ich evtl. dann für jeden Funktion die ich evtl. hooken will im Debugger schaun wie groß die ist? und dann x Bytes dahinter springen? bzw zum return der funktion?
-
T0bi schrieb:
Hm und wie koennte ich das nun "richtig" hooken? so das die MsgBox nicht kommt?
Ich bezweifle mal ob das überhaupt "richtig" ist. Ein Hook ist niemals richtig. Aber das ist nicht meine Sache sowas beurteilen zu müssen.
Du mußt Zeile -19- zu Zeile -2- "machen" und darfst dann aber den überschriebenen Code aus Zeile -1- nicht ! mehr ausführen.T0bi schrieb:
Müsste ich evtl. dann für jeden Funktion die ich evtl. hooken will im Debugger schaun wie groß die ist?
I.d.R. reicht es aus zu wissen, wieviele Parameter die Funktion hat. Details dazu gehören aber ins Assembler-Forum.
Finde mal raus, warum MessageBoxA ein "RETN 10 (hex)" am Ende hat.
-
kA ahnung wieso der return Wert 10 ist, evtl. ist es die definition fuer IDOK oder so?
-
Wenn Du die ursprüngliche Funktion nicht aufrufen willst, brauchst Du keinen Jump sondern einfach ein RETN 10 ganz am Anfang.
-
Ok.
Also RETN wird benutzt um eine Prozdure zu beenden das N steht für NEAR, weil die Prozedure ja auch nur ein paar Adressen weiter weg liegt und Wert hinter RETN ist ein optionaler stack Wert, was ich aber nicht ganz verstehe, soll das dann bedeuten er soll die obersten 14 Adressen return?Achja eine letzte Frage hätte ich da noch und zwar fange ich ja nun die MessageBoxA ab, in meiner eigenen Funktion möchte ih die Parameter auslesen und in eine Textdatei schreiben
int MyMessageBoxA( HWND hWnd, LPCTSTR szText, LPCTSTR szTitle, UINT uiState ) { std::ofstream secret; secret.open( "LastMessage.txt", std::ios::out ); secret << "Last read message:\n" << "Title : " /*<< szText*/ << "\n" << "Message: " << szTitle; secret.close( ); Beep( 1000, 500 ); return IDOK; }Den Wert aus szTitle kann ich wunderbar auslesen ohne probleme aber will ich den Wert von szText lesen, gibts nen Fehler:
Unhandled exception at 0x00404430 in DivertIT.exe: 0xC0000005: Access violation reading location 0x00000000.Versteh auch irgendwie nicht wieso er ander stelle 0x000000000 lesen will, ist der Pointer zu dem string nicht ok? Also im Speicher liegen beide Strings eigentlich neben einander, also das nicht etwa einer der beiden in einer geschützten speicherstelle liegt. Hm... wieso geht das nicht?
-
So kann man nicht Hooken! Du must einen eigenen Entry/Exit-Code schreiben... so wie Du das machst geht es nicht. Es ist auch sinnlos Dir zu helfen, da Du nicht in der Lage bist selber etwas initiative zu ergreifen.
Sag lieber was Du *eigentlich* willst!
-
Einfach nur die informationen aus den Parametern an mein eigenes Programm schicken, bzw. sie in einer Datei speichern. Und wie kann man den sonst noch hooken? Ich habe schon gegoogelt und bin halt nur auf die Beiträge in der Habo-Wiki gestoßen von Xalon, dort wirds ja auch nicht anders gemacht?!
-
Detours.