mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-04-30 13:07:22 +02:00
179 lines
3.8 KiB
C
179 lines
3.8 KiB
C
#define _WIN32_WINNT 0x0400
|
|
#include <windows.h>
|
|
|
|
HMODULE hookInstance = NULL;
|
|
HHOOK mouseHook = NULL;
|
|
HHOOK keyboardHook = NULL;
|
|
HANDLE mouseHookThread = NULL;
|
|
HANDLE keyboardHookThread = NULL;
|
|
|
|
/*
|
|
* DLL entry point for persisting the module handle
|
|
*/
|
|
BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID reserved)
|
|
{
|
|
if (reason == DLL_PROCESS_ATTACH)
|
|
hookInstance = module;
|
|
else if (reason == DLL_PROCESS_DETACH)
|
|
{
|
|
TerminateThread(mouseHookThread, 0);
|
|
TerminateThread(keyboardHookThread, 0);
|
|
|
|
mouseHookThread = NULL;
|
|
keyboardHookThread = NULL;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
* Hook handler to mouse movements that will drop all locally generated
|
|
* mouse movements
|
|
*/
|
|
LRESULT CALLBACK mouse_hook_handler(int code,
|
|
WPARAM w, LPARAM l)
|
|
{
|
|
if (code == HC_ACTION)
|
|
{
|
|
MSLLHOOKSTRUCT *hook = (MSLLHOOKSTRUCT *)l;
|
|
|
|
// Return the as if the mouse event had been passed if it's
|
|
// generated by the mouse
|
|
if (!(hook->flags & LLMHF_INJECTED))
|
|
return TRUE;
|
|
}
|
|
|
|
return CallNextHookEx(mouseHook, code, w, l);
|
|
}
|
|
|
|
/*
|
|
* Handles mouse hook notifications
|
|
*/
|
|
DWORD mouse_hook_msg_thread(LPVOID na)
|
|
{
|
|
DWORD result = ERROR_SUCCESS;
|
|
MSG msg;
|
|
|
|
if (!(mouseHook = SetWindowsHookEx(WH_MOUSE_LL,
|
|
mouse_hook_handler, hookInstance, 0)))
|
|
result = GetLastError();
|
|
|
|
while (GetMessage(&msg, 0, 0, 0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/*
|
|
* Hook handler to keyboard events that will drop all locally generated
|
|
* keyboard events
|
|
*/
|
|
LRESULT CALLBACK keyboard_hook_handler(int code,
|
|
WPARAM w, LPARAM l)
|
|
{
|
|
if (code == HC_ACTION)
|
|
{
|
|
KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)l;
|
|
|
|
// Return the as if the keyboard event had been passed if it's
|
|
// generated by the keyboard
|
|
if (!(hook->flags & LLMHF_INJECTED))
|
|
return TRUE;
|
|
}
|
|
|
|
return CallNextHookEx(keyboardHook, code, w, l);
|
|
}
|
|
|
|
/*
|
|
* Handles keyboard hook notifications
|
|
*/
|
|
DWORD keyboard_hook_msg_thread(LPVOID na)
|
|
{
|
|
DWORD result = ERROR_SUCCESS;
|
|
MSG msg;
|
|
|
|
if (!(keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
|
|
keyboard_hook_handler, hookInstance, 0)))
|
|
result = GetLastError();
|
|
|
|
while (GetMessage(&msg, 0, 0, 0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/*
|
|
* Enable/disable mouse movement
|
|
*/
|
|
DWORD __declspec(dllexport) enable_mouse_input(BOOL enable)
|
|
{
|
|
DWORD result = ERROR_SUCCESS;
|
|
|
|
// If the requestor would like to enable a mouse input and it's currently
|
|
// disabled, enable it.
|
|
if ((enable) &&
|
|
(mouseHook))
|
|
{
|
|
if (!UnhookWindowsHookEx(mouseHook))
|
|
result = GetLastError();
|
|
|
|
TerminateThread(mouseHookThread, 0);
|
|
|
|
mouseHookThread = NULL;
|
|
}
|
|
// Otherwise, if they would like to disable it but it's currently enabled,
|
|
// disable it.
|
|
else if ((!enable) &&
|
|
(!mouseHook))
|
|
{
|
|
DWORD threadId;
|
|
|
|
mouseHookThread = CreateThread(NULL, 0,
|
|
(LPTHREAD_START_ROUTINE)mouse_hook_msg_thread, NULL,
|
|
0, &threadId);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/*
|
|
* Enable/disable keyboard movement
|
|
*/
|
|
DWORD __declspec(dllexport) enable_keyboard_input(BOOL enable)
|
|
{
|
|
DWORD result = ERROR_SUCCESS;
|
|
|
|
// If the requestor would like to enable a keyboard input and it's currently
|
|
// disabled, enable it.
|
|
if ((enable) &&
|
|
(keyboardHook))
|
|
{
|
|
if (!UnhookWindowsHookEx(keyboardHook))
|
|
result = GetLastError();
|
|
|
|
TerminateThread(keyboardHookThread, 0);
|
|
|
|
keyboardHookThread = NULL;
|
|
}
|
|
// Otherwise, if they would like to disable it but it's currently enabled,
|
|
// disable it.
|
|
else if ((!enable) &&
|
|
(!keyboardHook))
|
|
{
|
|
DWORD threadId;
|
|
|
|
keyboardHookThread = CreateThread(NULL, 0,
|
|
(LPTHREAD_START_ROUTINE)keyboard_hook_msg_thread, NULL,
|
|
0, &threadId);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|