HOOK技术-满足我们程序的偷窥欲
生活随笔
收集整理的這篇文章主要介紹了
HOOK技术-满足我们程序的偷窥欲
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Windows中,虛擬內存技術使一個進程內的代碼訪問另一個進程內的代碼變得不那么容易。當然,這個不容易帶來了很強的健壯性。因為即使本進程由于內存改寫錯誤,導致程序崩潰,但另一個進程依然相當安全。
???
??????今天講的就是:打破進程的邊界,讓我們的代碼到其它進程的老家去逛逛。
??????使用HOOK技術需要編寫DLL,然后把DLL映射到別的進程的地址空間中。在DLL中,我們需要掛接鉤子,以用來鉤進程的消息,鼠標事件,鍵盤事件。
??????先來看一個掛接鉤子的函數:
?????? HHOOK?SetWindowsHookEx(int?idHook;?
???? HOOKPROC?lpfn;
?HINSTANCE?hMod;
?DWORD?dwThreadId);
???其中,iHook指定了鉤子的種類,統計有13種:
??? WH_CALLWNDPROC 系統將消息發送到指定窗口之前的"鉤子"
WH_CALLWNDPROCRET 消息已經在窗口中處理的"鉤子"
WH_CBT 基于計算機培訓的"鉤子"
WH_DEBUG 差錯"鉤子"
WH_FOREGROUNDIDLE 前臺空閑窗口"鉤子"
WH_GETMESSAGE 接收消息投遞的"鉤子"
WH_JOURNALPLAYBACK 回放以前通過WH_JOURNALRECORD"鉤子"記錄的輸入消息
WH_JOURNALRECORD 輸入消息記錄"鉤子"
WH_KEYBOARD 鍵盤消息"鉤子"
WH_MOUSE 鼠標消息"鉤子"
WH_MSGFILTER 對話框、消息框、菜單或滾動條輸入消息"鉤子"
WH_SHELL 外殼"鉤子"
WH_SYSMSGFILTER 系統消息"鉤子"?
???參數lpfn指向鉤子處理函數的指針。hMod標識了鉤子處理函數所處模塊的句柄。dwThreadId指定所需監視的線程Id,可以用GetCurrentThreadId()函數獲得,如果該參數為0,則表示監視系統所有線程的鉤子。
???
???鉤子安裝完成后,如果被監視的行為發生,系統為調用鉤子鏈表處的鉤子處理函數進行處理。每一個鉤子處理函數在進行相應的處理時都要考慮是否需要把事件傳遞給下一個鉤子處理函數。如果要傳遞,就通過函數CallNestHookEx()來解決。盡管如此,在實際使用時還是強烈推薦無論是否需要事件傳遞而都在過程的最后調用一次CallNextHookEx( )函數,否則將會引起一些無法預知的系統行為或是系統鎖定。
???鉤子使用完畢后,要記得釋放鉤子,釋放鉤子的函數如下:
???BOOL UnhookWindowsHookEx(HHOOK hhk);
???程序實例,待續。
???
??????今天講的就是:打破進程的邊界,讓我們的代碼到其它進程的老家去逛逛。
??????使用HOOK技術需要編寫DLL,然后把DLL映射到別的進程的地址空間中。在DLL中,我們需要掛接鉤子,以用來鉤進程的消息,鼠標事件,鍵盤事件。
??????先來看一個掛接鉤子的函數:
?????? HHOOK?SetWindowsHookEx(int?idHook;?
???? HOOKPROC?lpfn;
?HINSTANCE?hMod;
?DWORD?dwThreadId);
???其中,iHook指定了鉤子的種類,統計有13種:
??? WH_CALLWNDPROC 系統將消息發送到指定窗口之前的"鉤子"
WH_CALLWNDPROCRET 消息已經在窗口中處理的"鉤子"
WH_CBT 基于計算機培訓的"鉤子"
WH_DEBUG 差錯"鉤子"
WH_FOREGROUNDIDLE 前臺空閑窗口"鉤子"
WH_GETMESSAGE 接收消息投遞的"鉤子"
WH_JOURNALPLAYBACK 回放以前通過WH_JOURNALRECORD"鉤子"記錄的輸入消息
WH_JOURNALRECORD 輸入消息記錄"鉤子"
WH_KEYBOARD 鍵盤消息"鉤子"
WH_MOUSE 鼠標消息"鉤子"
WH_MSGFILTER 對話框、消息框、菜單或滾動條輸入消息"鉤子"
WH_SHELL 外殼"鉤子"
WH_SYSMSGFILTER 系統消息"鉤子"?
???參數lpfn指向鉤子處理函數的指針。hMod標識了鉤子處理函數所處模塊的句柄。dwThreadId指定所需監視的線程Id,可以用GetCurrentThreadId()函數獲得,如果該參數為0,則表示監視系統所有線程的鉤子。
???
???鉤子安裝完成后,如果被監視的行為發生,系統為調用鉤子鏈表處的鉤子處理函數進行處理。每一個鉤子處理函數在進行相應的處理時都要考慮是否需要把事件傳遞給下一個鉤子處理函數。如果要傳遞,就通過函數CallNestHookEx()來解決。盡管如此,在實際使用時還是強烈推薦無論是否需要事件傳遞而都在過程的最后調用一次CallNextHookEx( )函數,否則將會引起一些無法預知的系統行為或是系統鎖定。
???鉤子使用完畢后,要記得釋放鉤子,釋放鉤子的函數如下:
???BOOL UnhookWindowsHookEx(HHOOK hhk);
???程序實例,待續。
轉載于:https://www.cnblogs.com/shipfi/archive/2006/12/26/604359.html
總結
以上是生活随笔為你收集整理的HOOK技术-满足我们程序的偷窥欲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 控件属性、事件持久化
- 下一篇: 【转贴】C#中事件处理的个人体会