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ß
yogleedit: 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.aspDu 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(); }