WinApi hooking führt zum "Buffer Overrun!", hilfe!



  • WO springst Du da bitte zu 77D50510?
    Und WO führst Du "move edi, edi", "push ebp" und "mov ebp,esp" aus?



  • Ok, ich habe das jetzt nach Martins Anleitung gemacht und es geht auch ohne abrauchen und so, ABER die MessageBoxA wird trotzdem ausgeführt. Ich hab mir das im Debugger angesehen und es sieht irgendwie so aus als ob sich die MessageBox in der Funktion selbst nochmal aufruft?

    Hier mal der Ausschnitt aus dem Debugger:

    77D5050B U>- E9 F0FABC88             JMP     00920000
    77D50510     833D 1C04D777 00        CMP     DWORD PTR DS:[77D7041C],0
    77D50517     74 24                   JE      SHORT USER32.77D5053D
    77D50519     64:A1 18000000          MOV     EAX,DWORD PTR FS:[18]
    77D5051F     6A 00                   PUSH    0
    77D50521     FF70 24                 PUSH    DWORD PTR DS:[EAX+24]
    77D50524     68 F40AD777             PUSH    USER32.77D70AF4
    77D50529     FF15 1812D177           CALL    DWORD PTR DS:[<&KERNEL32.InterlockedCompareExchange>]    ; kernel32.InterlockedCompareExchange
    77D5052F     85C0                    TEST    EAX,EAX
    77D50531     75 0A                   JNZ     SHORT USER32.77D5053D
    77D50533     C705 F00AD777 01000000  MOV     DWORD PTR DS:[77D70AF0],1
    77D5053D     6A 00                   PUSH    0
    77D5053F     FF75 14                 PUSH    DWORD PTR SS:[EBP+14]
    77D50542     FF75 10                 PUSH    DWORD PTR SS:[EBP+10]
    77D50545     FF75 0C                 PUSH    DWORD PTR SS:[EBP+C]
    77D50548     FF75 08                 PUSH    DWORD PTR SS:[EBP+8]
    77D5054B     E8 2D000000             CALL    USER32.MessageBoxExA
    77D50550     5D                      POP     EBP                                                      ; DivertIT.00401273
    77D50551     C2 1000                 RETN    10
    77D50554     90                      NOP
    77D50555     90                      NOP
    77D50556     90                      NOP
    77D50557     90                      NOP
    77D50558     90                      NOP
    77D50559 U>  8BFF                    MOV     EDI,EDI
    77D5055B     55                      PUSH    EBP
    77D5055C     8BEC                    MOV     EBP,ESP
    77D5055E     6A FF                   PUSH    -1
    77D50560     FF75 18                 PUSH    DWORD PTR SS:[EBP+18]                                    ; DivertIT.00401130
    77D50563     FF75 14                 PUSH    DWORD PTR SS:[EBP+14]
    77D50566     FF75 10                 PUSH    DWORD PTR SS:[EBP+10]
    77D50569     FF75 0C                 PUSH    DWORD PTR SS:[EBP+C]
    77D5056C     FF75 08                 PUSH    DWORD PTR SS:[EBP+8]
    77D5056F     E8 F1590100             CALL    USER32.MessageBoxTimeoutW
    77D50574     5D                      POP     EBP                                                      ; DivertIT.00401273
    77D50575     C2 1400                 RETN    14
    77D50578     90                      NOP
    77D50579     90                      NOP
    77D5057A     90                      NOP
    77D5057B     90                      NOP
    77D5057C     90                      NOP
    77D5057D U>  8BFF                    MOV     EDI,EDI
    77D5057F     55                      PUSH    EBP
    77D50580     8BEC                    MOV     EBP,ESP
    77D50582     6A FF                   PUSH    -1
    77D50584     FF75 18                 PUSH    DWORD PTR SS:[EBP+18]                                    ; DivertIT.00401130
    77D50587     FF75 14                 PUSH    DWORD PTR SS:[EBP+14]
    77D5058A     FF75 10                 PUSH    DWORD PTR SS:[EBP+10]
    77D5058D     FF75 0C                 PUSH    DWORD PTR SS:[EBP+C]
    77D50590     FF75 08                 PUSH    DWORD PTR SS:[EBP+8]
    77D50593     E8 505A0100             CALL    USER32.MessageBoxTimeoutA
    77D50598     5D                      POP     EBP                                                      ; DivertIT.00401273
    77D50599     C2 1400                 RETN    14
    

    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? Die stelle ist dann aber nich gehookt, das verstehe ich nicht ganz?



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


Anmelden zum Antworten