SetWindowsHook进行DLL注入

DLL创建导出函数hei,效果是弹出写着heyxxx的窗口

#include <windows.h>
#pragma comment (lib, "user32.lib")

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  nReason, LPVOID lpReserved) {
    switch (nReason) {
    case DLL_PROCESS_ATTACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;
}

extern "C" __declspec(dllexport) int hei() {
    MessageBox(
        NULL,
        "hey,i am in",
        "success",
        MB_OK
    );
    return 0;
}

核心函数SetWindowsHookExA

image-20230303201626183

查阅文档,有以下类型钩子

含义
WH_CALLWNDPROC 4 安装一个挂钩过程,用于监视系统将消息发送到目标窗口过程之前的消息。 有关详细信息,请参阅 CallWndProc 挂钩过程。
WH_CALLWNDPROCRET 12 安装一个挂钩过程,用于在目标窗口过程处理消息后监视消息。 有关详细信息,请参阅 CallWndRetProc 挂钩过程。
WH_CBT 5 安装一个挂钩过程,用于接收对 CBT 应用程序有用的通知。 有关详细信息,请参阅 CBTProc 挂钩过程。
WH_DEBUG 9 安装一个挂钩过程,用于调试其他挂钩过程。 有关详细信息,请参阅 DebugProc 挂钩过程。
WH_FOREGROUNDIDLE 11 安装将在应用程序前台线程即将处于空闲状态时调用的挂钩过程。 此挂钩可用于在空闲时间执行低优先级任务。 有关详细信息,请参阅 ForegroundIdleProc 挂钩过程。
WH_GETMESSAGE 3 安装一个挂钩过程,用于监视发布到消息队列的消息。 有关详细信息,请参阅 GetMsgProc 挂钩过程。
WH_JOURNALPLAYBACK 1 警告 从Windows 11开始,不支持日记挂钩 API,将在将来的版本中删除。 因此,我们强烈建议改为调用 SendInput TextInput API。 安装一个挂钩过程,用于发布以前由 WH_JOURNALRECORD 挂钩过程记录的消息。 有关详细信息,请参阅 JournalPlaybackProc 挂钩过程。
WH_JOURNALRECORD 0 警告 从Windows 11开始,不支持日记挂钩 API,将在将来的版本中删除。 因此,我们强烈建议改为调用 SendInput TextInput API。 安装一个挂钩过程,用于记录发布到系统消息队列的输入消息。 此挂钩可用于录制宏。 有关详细信息,请参阅 JournalRecordProc 挂钩过程。
WH_KEYBOARD 2 安装监视击键消息的挂钩过程。 有关详细信息,请参阅 KeyboardProc 挂钩过程。
WH_KEYBOARD_LL 13 安装用于监视低级别键盘输入事件的挂钩过程。 有关详细信息,请参阅 LowLevelKeyboardProc 挂钩过程。
WH_MOUSE 7 安装监视鼠标消息的挂钩过程。 有关详细信息,请参阅 MouseProc 挂钩过程。
WH_MOUSE_LL 14 安装用于监视低级别鼠标输入事件的挂钩过程。 有关详细信息,请参阅 LowLevelMouseProc 挂钩过程。
WH_MSGFILTER -1 安装一个挂钩过程,用于监视在对话框、消息框、菜单或滚动条中由输入事件生成的消息。 有关详细信息,请参阅 MessageProc 挂钩过程。
WH_SHELL 10 安装一个挂钩过程,用于接收对 shell 应用程序有用的通知。 有关详细信息,请参阅 ShellProc 挂钩过程。
WH_SYSMSGFILTER 6 安装一个挂钩过程,用于监视在对话框、消息框、菜单或滚动条中由输入事件生成的消息。 挂钩过程监视与调用线程位于同一桌面中的所有应用程序的消息。 有关详细信息,请参阅 SysMsgProc 挂钩过程。

在这段代码中,钩子类型设置成了WH_KEYBOARD,也就是按下任何键盘键时会触发,而后指向heiFunc,heiFunc调用DLL中的函数

#include <windows.h>
#include <cstdio>

typedef int(__cdecl* HeiProc)();

int main(void) {
    HINSTANCE ServiceDll;
    HeiProc heiFunc;

    ServiceDll = LoadLibrary(TEXT("kernel1.dll"));

    heiFunc = (HeiProc)GetProcAddress(ServiceDll, "hei");

    HHOOK hook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)heiFunc, ServiceDll, 0);
    Sleep(5 * 1000);
    UnhookWindowsHookEx(hook);

    return 0;
}

效果:按键按一下出来一个框

image-20230303201046048

win7

image-20230303200558402

image-20230303200830232

发表评论