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?




Anmelden zum Antworten