API Hooking - Programm stürzt ab



  • EDIT: Bitte Beitrag in ein eigenes Thema verschieben, der Beitrag wurde als anscheinend als Antwort geposted, obwohl ich ein neues Thema erstellt habe? 😕

    Hallo,

    aktuell beschäftige ich mich mit dem Hooken von API-Funktionen. Für den Anfang möchte ich in meinem eigenen Programm die Funktion MessageBoxA hooken. Dazu verwende ich die OpenSource-Bibliothek Chrom Library.

    Wenn ich das Programm ausführe funktioniert der Hook und statt dem originalen Text wird auch der Text der gehookten Funktion ausgegeben, aber danach stürzt die Anwendung ab, woran liegt das?

    Aktuell sieht der Quellcode so aus:

    #include <iostream>
    #include <windows.h>
    #include "chrom.h"
    
    // Prototyp für die Funktion MessageBoxA
    typedef int (*MsgBoxFunc)(HWND, LPCSTR, LPCSTR, UINT);
    
    Hook MsgBoxHook;
    
    int HookedFunc(HWND, LPCSTR, LPCSTR, UINT)
    {
        int result;
    
        // Hook zurücksetzen
        MsgBoxHook.Reset();
    
        // Originale Funktion aufrufen
        MsgBoxFunc orig = (MsgBoxFunc)MsgBoxHook.original_function;
        result = orig(NULL, "Hooked", NULL, 0);
    
        // Hook erneut setzen
        MsgBoxHook.Place_Hook();
    
        return result;
    }
    
    int main()
    {
        MsgBoxFunc pFunc;
    
        HMODULE hMod = LoadLibrary("User32.dll");
    
        if (!hMod)
            std::cout << "Konnte die DLL nicht laden!" << std::endl;
    
        pFunc = (MsgBoxFunc)GetProcAddress(hMod, "MessageBoxA");
    
        if (pFunc == 0)
            std::cout << "Konnte die Funktion nicht laden!";
    
        // Aufruf der originalen Funktion ohne Hook
        pFunc(NULL, "Message", NULL, 0);
    
        // Hook initialisieren und starten
        MsgBoxHook.Initialize("MessageBoxA", "User32.dll", (void*)HookedFunc);
        MsgBoxHook.Start();
    
        // Aufruf der gehookten Funktion
        pFunc(NULL, "Message", NULL, 0);
    
        // <-- Absturz des Programms
    
        std::cout << "Dieser Text wird nicht mehr ausgegeben!";
    
        return 0;
    }
    

    Ich hoffe der Quelltext ist ausreichend kommentiert 😉

    mfg Coder



  • Wie wärs mal mit debuggen?!

    Google -> Immunity Debugger download

    btw. wenn du 0 Ahnung von Assembler hast dann lass es einfach gleich sein.

    Verwende nicht irgendso eine LIB schreib deinen hook Kram selber ist echt nicht so schwer zu verstehen.

    google -> vivid abstraction

    Da gibt es ein Function Hooking Tutorial was gut zu verstehen ist.



  • Echt schade wie man hier im Forum gleich angefahren wird und welche Mutmaßungen hier gleich über einen angestellt werden...

    DEBUGGEN?! schrieb:

    btw. wenn du 0 Ahnung von Assembler hast dann lass es einfach gleich sein.

    Verwende nicht irgendso eine LIB schreib deinen hook Kram selber ist echt nicht so schwer zu verstehen.

    google -> vivid abstraction

    Da gibt es ein Function Hooking Tutorial was gut zu verstehen ist.

    Ich habe durchaus Erfahrung mit Assembler und bereits eigene Anwendungen geschrieben die mittels Read- und WriteProcessMemory() Funktionen aus der WinAPI hooken.
    Die Aufgabenstellung besagt jedoch die Chrom-Library zu verwenden, daran kann ich nichts ändern. (liegt unter anderem daran, dass diese Lib die oben genannten Funktionen nicht benötigt, sondern den Speicher mittels memcpy() überschreibt)

    DEBUGGEN?! schrieb:

    Wie wärs mal mit debuggen?!

    Wenn ich das Programm debugge stürzt es sofort beim Aufruf von MsgBoxHook.Start() ab. Wenn ich als Buildtarget Release auswähle stürzt es hingegen erst ab, nachdem die gehookte Funktion verlassen wird. Weiß jemand woran das liegt?

    mfg



  • Mit Debuggen meint er, dass du den Prozess deiner Anwendung mittels z.B. OllyDbg analysieren sollst.

    Hast du als Compileroption eingestellt, dass per default die stdcall Aufrufkonvention verwendet wird? Wenn nicht, dann sind deine Funktionen alle als cdecl deklariert. Und MessageBoxA ist eine WINAPI deklarierte funktion (stdcall). Dadurch wird der Stack korruptet.



  • Die Aufrufkonventionen schrieb:

    Mit Debuggen meint er, dass du den Prozess deiner Anwendung mittels z.B. OllyDbg analysieren sollst.

    Hast du als Compileroption eingestellt, dass per default die stdcall Aufrufkonvention verwendet wird? Wenn nicht, dann sind deine Funktionen alle als cdecl deklariert. Und MessageBoxA ist eine WINAPI deklarierte funktion (stdcall). Dadurch wird der Stack korruptet.

    Mit Stackkorrupt meine ich, dass du eine stdcall Funktion hooken willst, deine neue Funktion aber cdecl ist. Dadurch kommt der Crash.



  • Noch mal Aufrufkonvention schrieb:

    Die Aufrufkonventionen schrieb:

    Mit Debuggen meint er, dass du den Prozess deiner Anwendung mittels z.B. OllyDbg analysieren sollst.

    Hast du als Compileroption eingestellt, dass per default die stdcall Aufrufkonvention verwendet wird? Wenn nicht, dann sind deine Funktionen alle als cdecl deklariert. Und MessageBoxA ist eine WINAPI deklarierte funktion (stdcall). Dadurch wird der Stack korruptet.

    Mit Stackkorrupt meine ich, dass du eine stdcall Funktion hooken willst, deine neue Funktion aber cdecl ist. Dadurch kommt der Crash.

    Jop, du hattest recht, es lag an der Aufrufkonvention, jetzt funktioniert es.

    Dankeschön 😃



  • Wichtig ist halt, dass du weißt wieso. Das lässt sich mittels OllyDbg herausfinden.

    StdCall Funktionen verwenden z.B. ein ret N anstatt nur das ret wie bei cdecl funktionen. somit würde deine neue funktion die argumente der funktion im stackframe nicht mit freigeben und der caller würde mit falschen werten seines stackframes weiterarbeiten. auch kann es zu crashs kommen wenn bestimmte register nicht zwischengespeichert wurden, da dann ebenfalls mit falschen weitergearbeitet werden würde.

    hier mal ein wiki artikel dazu.
    http://en.wikipedia.org/wiki/X86_calling_conventions



  • Wie gesagt is wohl bei dir die calling convention das Problem.
    Die Doku zu MessageBox() auf MSDN sagt:

    int WINAPI MessageBox(
      _In_opt_  HWND hWnd,
      _In_opt_  LPCTSTR lpText,
      _In_opt_  LPCTSTR lpCaption,
      _In_      UINT uType
    );
    

    WINAPI ist definiert in WinDef.h und steht für __stdcall.

    Daher müssen deine Definition so aussehen :

    typedef int (WINAPI *MsgBoxFunc)(HWND, LPCSTR, LPCSTR, UINT);
    
    int WINAPI HookedFunc(HWND, LPCSTR, LPCSTR, UINT)
    

Anmelden zum Antworten