如何讓你的程式避開全域性鍵盤鉤子的監視
阿新 • • 發佈:2019-02-10
一直以來有個疑問,就是如果別人在你的電腦上安裝了鍵盤鉤子來監視你的鍵盤按鍵動作,我的程式怎麼才能避開這些全域性鍵盤鉤子(system-wide hook)的監視.正好最近一段時間因為工作關係在研究鉤子,順便研究了一下這個問題,今天算是找到了一個解決辦法.
解決辦法:
在我的程式中安裝一個區域性鍵盤鉤子(thread-specified hook),鍵盤鉤子函式中不呼叫CallNextHookEx;
原理:
1.鉤子鏈可以被破壞.同一型別的鉤子會形成一個鏈,假如先被呼叫的鉤子沒有呼叫CallNextHookEx的話,後面的鉤子將得不到呼叫.
2.對於某個特定的執行緒,如果既安裝了執行緒鉤子又安裝了系統鉤子,則執行緒鉤子先於系統鉤子被呼叫.
實驗:
鍵盤鉤子(WH_KEYBOARD)
我寫了個簡單的對話方塊程式,部分程式碼如下:
1.先宣告鉤子HHOOK gHook = NULL;
2.鍵盤鉤子函式:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(AfxGetMainWnd()->GetSafeHwnd(), "Thread hook", "keyboard", MB_OK);
return 0;
//return CallNextHookEx(gHook, nCode, wParam, lParam);
}
3.安裝鉤子:
DWORD nThreadid = GetCurrentThreadId();
gHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, AfxGetApp()->m_hInstance, nThreadid);
if(gHook == NULL)
{
AfxMessageBox("Install Keyboard Hook Failed", MB_OK);
}
4.解除安裝鉤子
BOOL ret = UnhookWindowsHookEx(gHook);
實驗方法及結果如下:
1.先啟動另一個程式,安裝系統鍵盤鉤子,再啟動我的程式,安裝區域性鍵盤鉤子,實驗結果表明系統鉤子對我的程式無效.
2.先啟動我的程式,安裝區域性鍵盤鉤子,再啟動另一個程式,安裝系統鍵盤鉤子.在我的程式中系統鍵盤鉤子無效.
解決辦法:
在我的程式中安裝一個區域性鍵盤鉤子(thread-specified hook),鍵盤鉤子函式中不呼叫CallNextHookEx;
原理:
1.鉤子鏈可以被破壞.同一型別的鉤子會形成一個鏈,假如先被呼叫的鉤子沒有呼叫CallNextHookEx的話,後面的鉤子將得不到呼叫.
2.對於某個特定的執行緒,如果既安裝了執行緒鉤子又安裝了系統鉤子,則執行緒鉤子先於系統鉤子被呼叫.
實驗:
鍵盤鉤子(WH_KEYBOARD)
我寫了個簡單的對話方塊程式,部分程式碼如下:
1.先宣告鉤子HHOOK gHook = NULL;
2.鍵盤鉤子函式:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(AfxGetMainWnd()->GetSafeHwnd(), "Thread hook", "keyboard", MB_OK);
return 0;
//return CallNextHookEx(gHook, nCode, wParam, lParam);
}
3.安裝鉤子:
DWORD nThreadid = GetCurrentThreadId();
gHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, AfxGetApp()->m_hInstance, nThreadid);
if(gHook == NULL)
{
AfxMessageBox("Install Keyboard Hook Failed", MB_OK);
}
4.解除安裝鉤子
BOOL ret = UnhookWindowsHookEx(gHook);
實驗方法及結果如下:
1.先啟動另一個程式,安裝系統鍵盤鉤子,再啟動我的程式,安裝區域性鍵盤鉤子,實驗結果表明系統鉤子對我的程式無效.
2.先啟動我的程式,安裝區域性鍵盤鉤子,再啟動另一個程式,安裝系統鍵盤鉤子.在我的程式中系統鍵盤鉤子無效.