Na to jsem už taky narazil, ale i když bych měl mít všechno správně (co se týče samotnýho vložení dll), tak přesto se mi vůbec nechce zavolat odchycení zpráv WH_GETMESSAGE
Můj cíl je takovej - odchytit úplně všechny zprávy procesu (cílový aplikace) tak, abych si mohl dopsat vlastni HOOKPROC funkce v aplikaci (né v DLL)
Pokud někdo víte, tak by mě celkem zajímalo kde mám chybu.. bojuju s tím už druhej den
Samotný DLL
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
gs_hInstance = hinstDLL;
AttachMessage();
break;
case DLL_PROCESS_DETACH:
DetachMessage();
break;
}
return TRUE;
}
// vůbec se nechce zavolat (zkoušel jsem přes debug)
LRESULT CALLBACK MessageHook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
// misto 0 by měl být nejspíše "gs_messageHook" (zatím není podstatný)
return CallNextHookEx(0, nCode, wParam, lParam);
}
BOOL CALLBACK AttachMessage() // externi funkce
{
gs_messageHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MessageHook, gs_hInstance, 0);
if (gs_messageHook)
return TRUE;
return FALSE;
}
BOOL CALLBACK DetachMessage() // externi funkce
{
if (gs_messageHook)
UnhookWindowsHookEx(gs_messageHook);
gs_messageHook = nullptr;
return TRUE;
}
Aplikace
#define DLL_NAME "Test.dll" // dll, ktere se vklada do procesu
#define PROCESS_NAME L"Skype.exe" // pouze pro test (snaha odchytit vsechny zpravy toho procesu)
typedef DWORD (CALLBACK * FindProcessID)(const wstring);
typedef LPVOID (CALLBACK * Inject)(const DWORD, LPCSTR);
int main()
{
HMODULE hSpy = LoadLibraryA(DLL_NAME);
DWORD processId = ((FindProcessID)GetProcAddress(hSpy, "FindProcessID"))(PROCESS_NAME);
// dllMem obsahuje pametove misto, kam se vlozil string s nazvem DLL
LPVOID dllMem = ((Inject)GetProcAddress(hSpy, "Inject"))(processId, DLL_NAME);
// pokousim se dostat ven MessageHook, abych si vlastni telo mohl dopsat mimo DLL
FARPROC messageHook = GetProcAddress(hSpy, "MessageHook");
cin.get();
FreeLibrary(hSpy);
return EXIT_SUCCESS;
}
Funkce pro inject (umístěná v DLL)
LPVOID CALLBACK Inject(const DWORD processID, LPCSTR dllName)
{
if (!processID)
return FALSE;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
if (!hProcess)
return FALSE;
LPVOID loadLibraryA = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
if (loadLibraryA)
{
LPVOID dllMemoryAddr = VirtualAllocEx(hProcess, nullptr, strlen(dllName), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (dllMemoryAddr)
{
WriteProcessMemory(hProcess, dllMemoryAddr, dllName, strlen(dllName), nullptr);
CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)loadLibraryA, dllMemoryAddr, 0, nullptr);
CloseHandle(hProcess);
return dllMemoryAddr;
}
}
CloseHandle(hProcess);
return nullptr;
}
Díky