CallBack Funktion in injected dll



  • hi,
    ich habe eine dll die nur eine callback funktion beinhaltet.
    die callback funktion soll mir Tastatureingaben abfangen.

    Diese Dll injeziere ich in ein leere Anwendung die nur einen Dialog darstellt der nichts ausführt.

    wenn ich die dll über die Anwendung mit LoadLibrary("MeineDll.dll") lade, wird die callbackfunktion einwandfrei ausgeführt und es werden alle tasten auf der tastatur anerkannt.

    Wenn ich jetzt aber die dll durch eine andere Anwendung injeziere, wird zwar die dll in den anderen process geladen & einmal ausgeführt. die callback funktion jedoch wird nicht ausgeführt.

    wo liegt da das problem?
    weis jemand rat.

    gruß lowfly



  • LowFly schrieb:

    Wenn ich jetzt aber die dll durch eine andere Anwendung injeziere, wird zwar die dll in den anderen process geladen & einmal ausgeführt. die callback funktion jedoch wird nicht ausgeführt.

    Du musst schon sagen "WIE" Du das machst... sonst kann man Dir schlecht helfen...



  • ok,
    die Injectmethode sieht wie folgt aus.

    th32ProcessID wird via CreateToolhelp32Snapshot / Process32First / Process32Next ermittelt
    lpszDllPath ist der komplette Pfad zur dll.

    HMODULE	InjectByLoadLibraryA(DWORD th32ProcessID, LPCSTR lpszDllPath)
    {
    	HANDLE hThread;
    	void*   pLibRemote;   
    	DWORD   hLibModule;   // Base address of loaded module (==HMODULE);
    
    	HMODULE hKernel32 = ::GetModuleHandleA("kernel32.dll");
    
    	HANDLE hProcess = OpenProcessForRemoteExecute(th32ProcessID);
    
    	pLibRemote = ::VirtualAllocEx( hProcess, NULL, (::strlen(lpszDllPath) + 1) * sizeof(char),
    								   MEM_COMMIT, PAGE_READWRITE );
    
    	::WriteProcessMemory( hProcess, pLibRemote, (LPVOID)lpszDllPath,
    						  (::strlen(lpszDllPath) + 1) * sizeof(char), NULL );
    
    	LPTHREAD_START_ROUTINE lpfn = (LPTHREAD_START_ROUTINE)::GetProcAddress(hKernel32, "LoadLibraryA");
    	if (lpfn == NULL)
    		return NULL;
    
    	hThread = ::CreateRemoteThread( hProcess, NULL, 0,lpfn,pLibRemote, 0, NULL );
    
    	::WaitForSingleObject( hThread, INFINITE );
    
    	::GetExitCodeThread( hThread, &hLibModule );
    
    	::VirtualFreeEx( hProcess, pLibRemote, 0, MEM_RELEASE );
    	::CloseHandle( hThread );
    
    	return (HMODULE)hLibModule;
    }
    

    der code in der dll sieht wie folgt aus.

    HHOOK xKeyHookHandle = NULL;
    
    LRESULT CALLBACK xKeyboardHook( int code, WPARAM wParam, LPARAM lParam );
    __declspec(dllexport) BOOL SetMyHook(HWND hWnd);
    
    __declspec(dllexport) BOOL SetMyHook(HWND hWnd)
    {
    
    	DWORD ValveProc = GetWindowThreadProcessId(hWnd,NULL);
    
    	xKeyHookHandle = SetWindowsHookEx(WH_KEYBOARD,
    			    xKeyboardHook,
    			    NULL,
    			    ValveProc);
    
    	if(xKeyHookHandle != NULL)
    		 return TRUE;
    	else
    		return FALSE; 
    }
    
    LRESULT CALLBACK xKeyboardHook( int code, WPARAM wParam, LPARAM lParam )
    {
        if(lParam &0x80000000 || lParam &0x40000000)
            return CallNextHookEx( xKeyHookHandle, code, wParam, lParam );
    
        // Check welcher Key gedrückt wird
        switch (wParam)
        {
            case VKEY_LEFT:
                add_log("Left pressed!");
            break;
    
            case VKEY_UP:
                add_log("Up pressed!");
            break;
    
            case VKEY_RIGHT:
                add_log("Right pressed!");
            break;
    
    		case VKEY_DOWN:
                add_log("Down pressed!");
            break;
    
        }
    
        return CallNextHookEx( xKeyHookHandle, code, wParam, lParam );
    }
    
    BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD  dwReason, LPVOID lpReserved)
    {
    
    	HWND hWindow;
    
    	switch(dwReason)
    	{
    
    		case DLL_PROCESS_ATTACH:
    
    			DisableThreadLibraryCalls(hInstance);
    
    			/////////////////////////////////////////////////////
    			//Fülle die m_LogStruc bevor StartLog ausgeführt wird
    			m_LogStruc.FileName = "KeyHookLog.txt";
    			m_LogStruc.LogStartText = "Key Hook";
    			StartLog();
    
    			hWindow = HandleToWindow("TestInject.exe");
    
    			if(!SetMyHook(hWindow))
    				add_log("Handle auf Tasttatur fehlgeschlagen ->0x%x",xKeyHookHandle);
    			else
    				add_log("Handle erfolgreich ->0x%x ",xKeyHookHandle);
    
    				return true; //
    		break;
    
    		case DLL_THREAD_ATTACH:
    
    		break; //
           				//
    
    		case DLL_THREAD_DETACH:
    
    		break;
    
    		case DLL_PROCESS_DETACH:
    
    		break;
    
    	}//end switch(dwReason)
    
        return false;
    
    }
    

    es ist zu 100% sicher das mir HandleToWindow("TestInject.exe") das richtige Handle zurückgibt.

    noch mal zur besseren verständigung.
    wenn ich in der OnInitDialog() Funktion der TestInject.exe die zu injezierende dll via LoadLibrary(...) lade funzt das einwandfrei und es wird mir in die logfile "Left pressed" usw. geschrieben.

    Wenn ich jetzt aber die zu injezierende dll durch eine andere anwendung via InjectByLoadLibraryA lade. Wird mir die Dll in den Process injeziert(ich seh die dll wenn ich mir die Module der injezierten anwendung anschaue), AUCH schreibt es mir in die LogFile zb. Handle erfolgreich -> 0xad2587ff es werden auch andere funktionen ausgeführt aber eben nur einmal und nicht dauerhaft.

    das ist dann auch der grund weshalb ich glaube das die CallBack funktion nicht angesprochen wird.


Anmelden zum Antworten