一、新建一个DLL动态链接库
二、创建一个被exe文件调用的函数
BOOL sethook() { hk = SetWindowsHookEx(WH_KEYBOARD, //hook类型,键盘hook KeyboardProc, //回调函数 hM, //第三方的注入dll,全局hook使用,句柄通过主函数获取 0);//线程id,填0表示hook所有程序 if (hk == NULL)//如果创建失败,弹出信息框 { return FALSE; } return TRUE; }
三、创建回调函数
HMODULE hM; HHOOK hk; //键盘hook的回调函数 LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) { char buf[256]; if (wParam >= 'A' && wParam <= 'Z') { sprintf_s(buf, "%c 被按下", wParam); OutputDebugStringA(buf); } //钩子执行完后执行该函数 return CallNextHookEx(hk, code, wParam, lParam); }
四、通过主函数获取句柄
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { //dll被加载执行,初始化操作 hM = hModule; } break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: { //dll被释放时调用 } break; } return TRUE; }
五、将函数导出
1、右击项目--添加--新建项
2、添加def文件
3、导出函数
LIBRARY
EXPORTS
sethook
4、通过PE软件查看导出函数
六、exe文件调用dll文件函数
1、声明lib文件位置
#pragma comment(lib,"hookdll.lib")
2、声明被调用函数
BOOL sethook();
3、调用函数
void CkeybhookDlg::OnBnClickedHook() { BOOL re = sethook(); if (!re)//如果创建失败,弹出信息框 { AfxMessageBox(L"HOOK失败"); return; } }