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
查阅文档,有以下类型钩子
值 | 含义 |
---|---|
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;
}
效果:按键按一下出来一个框
win7