L
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.