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