HMODULE herausfinden?



  • Hallo,

    ich habe ein ziemlich verzwicktes Problem. Ich patche eine Funktione der User32.dll, indem ich die ersten fünf Bytes mit einem Call auf meine Funktion überschreibe. Das heißt jedes mal wenn ein Prozess die Funktion aufruft, wird erst zuerst meine Funktion aufgerufen, ich kann dann mein Zeug erledigen und dann wird erst die Originalfunktion ausgeführt.
    Zu meinem Problem: Bisher kann ich über "GetCurrentProcess();" immer nur den Prozess identifizieren in dem ich mich befinde, ich würde aber auch gerne herausbekommen ob mich eine Dll des Prozesses aufgerufen hat.
    Ich habe eine Funktion mit der man mit einem Pointer auf eine Funktion das Modul in der diese Funktion steht herausfinden kann, aber nicht die Dll die einen aufgerufen hat.
    Wisst ihr wie ich das anstellen könnte?

    // Returns the HMODULE that contains the specified memory address
    static HMODULE ModuleFromAddress(PVOID pv) 
    {
    	MEMORY_BASIC_INFORMATION mbi;
    
    	return ((::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) 
    	        ? (HMODULE) mbi.AllocationBase : NULL);
    }
    

    Gruß
    yogle



  • Wenn Du das HMODULE hast, kannst Du einfach GetModuleName mit diesem Handle aufrufen...



  • Hallo,

    ja ja, das ist mir natürlich schon klar. Ich bekomme aber so nicht das richtige
    Handle! Nur z.B. auf die User32.dll oder auf mein eigenen Prozess, aber kein Handle
    auf das mich aufrufende Modul!

    gruß
    yogle

    edit: hab mir mal madCodeHook angeschaut. Da gibt es genau so eine Funktion die ich
    benötige, nämlich "GetCallingModule", mit dem funzt einwandfrei. Er macht das
    irgendwie auch über "VirtualQuery" aber im Assemblercode lesen bin ich nicht
    so gut! 😉



  • Bist Du Dir sicher, dass der Pointer wirklich auf die Funktion zeigt!? Zeig doch mal wie Du auf diesen Pointer kommst! Das ist nämlich das komplizierte dran (und wird IMHO nicht immer lösbar sein).



  • Genau das ist nämlich das Problem 🙂
    Ich weiß nicht wie ich auf den Pointer kommen soll! Ich hab keine Ahnung.
    Irgendjemand meinte mal was von der Funktion "StackWalk" aber da blick ich nicht
    durch. Wie schon gesagt madCodeHook hats irgendwie über "VirtualQuery" hinbekommen.
    Aber ist nicht so schlimm wenn ich nicht selber hinbekomme, dann unterstütze ich
    madCodeHook halt ein bisschen. 🙂 Würde mich halt nur interessieren.

    Gruß
    yogle



  • Ganz grob gesagt: Es gibt keine Performante Lösung, wie man auf die Adresse des Aufrufen den kommt. Das einfachste wäre noch Assembler, dann ist es aber nicht mehr portabel.
    Du kannst natürlich auch StackWalk64 verwenden, dies ist aber nicht performant:
    http://www.codeproject.com/threads/StackWalker.asp

    Du kannst auch folgendes machen:

    #include <windows.h>
    #include <tchar.h>
    
    void __stdcall MyRealFunc(LPCVOID pCallerAddr)
    {
      MEMORY_BASIC_INFORMATION mbi;
      _tprintf(_T("Called from 0x%p\n"), pCallerAddr);
      if (VirtualQuery(pCallerAddr, &mbi, sizeof(mbi)) != 0)
      {
        _tprintf(_T("Module-Base 0x%p\n"), mbi.AllocationBase);
        TCHAR szMod[_MAX_PATH];
        if (GetModuleFileName((HMODULE) mbi.AllocationBase, szMod, _MAX_PATH) != 0)
          _tprintf(_T("Module: %s\n"), szMod);
      }
    }
    
    __declspec(naked) void MyFunc()
    {
      __asm push ebp  
      __asm mov  ebp,esp 
      __asm mov  eax, [esp+4]
      __asm push eax
      __asm call MyRealFunc
      __asm mov  esp,ebp
      __asm pop  ebp  
      __asm xor  eax,eax
      __asm ret
    }
    
    int _tmain()
    {
      MyFunc();
    }
    

Anmelden zum Antworten