Probleme mit Dll Injection
-
Hallo,
ich versuche gerade testweise eine Dll in mein eigenes Programm zu laden. Es scheint auch alles zu klappen bis zum Aufruf einer Funktion aus der Dll:
#include <windows.h> __declspec(dllexport) int __stdcall Funktion(DWORD) { MessageBox(0, "Hallo", "", 0); return 0; } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; }Wie gesagt, Prozess öffnen und in den "fremden" Prozess schreiben funktioniert. In dem folgenden struct speicher ich die Adressen der Funktionen, den Dll-Namen
und den Namen der Funktion die aufgerufen werden soll.struct injection_data { HMODULE (WINAPI *fpLoadLibrary)(LPCSTR); FARPROC (WINAPI *fpGetProcAddress)(HMODULE, LPCSTR); BOOL (WINAPI *fpFreeLibrary)(HMODULE); char dllpath[256]; char entrypoint[256]; DWORD dwErrLine; DWORD entryparam; }; injection_data IData; IData.fpLoadLibrary = (HMODULE (WINAPI *)(LPCSTR)) GetProcAddress(hModule, "LoadLibraryA"); IData.fpGetProcAddress = (FARPROC (WINAPI *)(HMODULE, LPCSTR)) GetProcAddress(hModule, "GetProcAddress"); IData.fpFreeLibrary = (BOOL (WINAPI *)(HMODULE)) GetProcAddress(hModule, "FreeLibrary"); strcpy(IData.dllpath, "dll.dll"); strcpy(IData.entrypoint, "Funktion"); /* ... */Das ist die Funktion, die im fremden Prozess aufgerufen wird:
static int __stdcall injection_sub(struct injection_data *idata) { HINSTANCE hLibrary = idata->fpLoadLibrary(idata->dllpath); if(hLibrary == 0) { idata->dwErrLine = __LINE__ - 1; return -1; } int (WINAPI *fpEntryFunc)(DWORD); fpEntryFunc = (int (__stdcall *)(DWORD)) idata->fpGetProcAddress(hLibrary, idata->entrypoint); /* Hier ist der Fehler, fpEntryFunc = 0 */ if (fpEntryFunc == 0) { idata->dwErrLine = __LINE__ - 1; return -1; } int rc = fpEntryFunc(idata->entryparam); idata->fpFreeLibrary(hLibrary); return rc; }Weiß von euch jemand wieso GetProcAdress da nicht klappt?
-
Prüf mal, welchen Exportnamen "Funktion" in der DLL hat.
-
Hallo,
danke für den Tipp, das war der Fehler. Die Funktion heißt "_Z8Funktionm@4".
Kann ich auf den Funktionsnamen denn irgendwie Einfluss nehmen?2. Frage
Wenn ich MessageBox innerhalb der DllMain() aufrufe - wieso wird die dann beim laden nicht angezeigt?
-