Win10下用SetWindowsHookEx設置鉤子後部分進程假死?

用SetWindowsHookEx安裝了一個全局鍵盤鉤子,只要摁a就會彈一個msgbox。

問題有兩點:

1、安裝後大部分程序都沒問題可以正常彈出msgbox,但是部分進程(資源管理器、左下角搜索欄、firefox等)中摁A會直接假死,必須結束原來主進程Main.exe才能正常進行,也沒有彈msgbox。

2、結束Main.exe的時候摁q(我寫的是摁q就UninstallHook)也會假死,必須強制關閉。

代碼如下:

dll代碼:

// hook.cpp
#include&
#define DLLEXPORT __declspec(dllexport)

HMODULE hmod;

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

HHOOK hhk;

LRESULT CALLBACK KeyboardProc(int code, WPARAM wp, LPARAM lp)
{
if (code&<0)return CallNextHookEx(hhk, code, wp, lp); if (wp == 0x41) MessageBox(0, 0, 0, 0); return CallNextHookEx(hhk, code, wp, lp); } #ifdef __cplusplus extern "C" { #endif DLLEXPORT void HookStart() { hhk = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hmod, 0); } DLLEXPORT void HookStop() { if (hhk) UnhookWindowsHookEx(hhk); } #ifdef __cplusplus } #endif

主程序代碼:

//main.cpp
#include&
#include&

typedef void(*hstart)();
typedef void(*hstop)();

int main()
{
char buff[100];
HMODULE dll = LoadLibraryA("Hook.dll");
GetModuleFileName(dll, buff, 100);
hstart start = (hstart)GetProcAddress(dll, "HookStart");
hstop stop = (hstop)GetProcAddress(dll, "HookStop");
start();
while (_getch() != q);
stop();
FreeLibrary(dll);
}

(知乎這個代碼編輯器真是糟心)

環境是win10 1703

編譯器vs2015


如果你認真看SetWindowsHookEx的文檔的話,會看到在你的DLL因為CPU架構不匹配而不能注入目標程序的時候,被鉤的程序是通過SendMessage來調用你的KeyboardProc的。然後你的KeyboardProc卡在了對話框那裡沒有返回,所以這些程序的界面就卡在SendMessage那裡了。

在64位Windows上,大多數程序是32位。資源管理器是64位。


推薦閱讀:

Ubuntu On Windows 10 的環境變數問題?
WIN10能不能像WIN8那樣把屏幕分為兩個?
Win 10 有哪些忍不了的設計?
如何評價微軟不再對 Windows 10 手機推送大版本系統更新?

TAG:逆向工程 | MicrosoftWindows | Windows10 |