亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? windows

?? 匯編中調(diào)用鉤子函數(shù)的例子。
??
?? 第 1 頁 / 共 2 頁
字號:
WINDOWS鉤子函數(shù)


--------------------------------------------------------------------------------
本課中我們將要學(xué)習(xí)WINDOWS鉤子函數(shù)的使用方法。WINDOWS鉤子函數(shù)的功能非常強(qiáng)大,有了它您可以探測其它進(jìn)程并且改變其它進(jìn)程的行為。 
理論:
WINDOWS的鉤子函數(shù)可以認(rèn)為是WINDOWS的主要特性之一。利用它們,您可以捕捉您自己進(jìn)程或其它進(jìn)程發(fā)生的事件。通過“鉤掛”,您可以給WINDOWS一個處理或過濾事件的回調(diào)函數(shù),該函數(shù)也叫做“鉤子函數(shù)”,當(dāng)每次發(fā)生您感興趣的事件時,WINDOWS都將調(diào)用該函數(shù)。一共有兩種類型的鉤子:局部的和遠(yuǎn)程的。 
局部鉤子僅鉤掛您自己進(jìn)程的事件。 
遠(yuǎn)程的鉤子還可以將鉤掛其它進(jìn)程發(fā)生的事件。遠(yuǎn)程的鉤子又有兩種: 
基于線程的 它將捕獲其它進(jìn)程中某一特定線程的事件。簡言之,就是可以用來觀察其它進(jìn)程中的某一特定線程將發(fā)生的事件。 
系統(tǒng)范圍的 將捕捉系統(tǒng)中所有進(jìn)程將發(fā)生的事件消息。 
安裝鉤子函數(shù)將會影響系統(tǒng)的性能。監(jiān)測“系統(tǒng)范圍事件”的系統(tǒng)鉤子特別明顯。因為系統(tǒng)在處理所有的相關(guān)事件時都將調(diào)用您的鉤子函數(shù),這樣您的系統(tǒng)將會明顯的減慢。所以應(yīng)謹(jǐn)慎使用,用完后立即卸載。還有,由于您可以預(yù)先截獲其它進(jìn)程的消息,所以一旦您的鉤子函數(shù)出了問題的話必將影響其它的進(jìn)程。記住:功能強(qiáng)大也意味著使用時要負(fù)責(zé)任。
在正確使用鉤子函數(shù)前,我們先講解鉤子函數(shù)的工作原理。當(dāng)您創(chuàng)建一個鉤子時,WINDOWS會先在內(nèi)存中創(chuàng)建一個數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)包含了鉤子的相關(guān)信息,然后把該結(jié)構(gòu)體加到已經(jīng)存在的鉤子鏈表中去。新的鉤子將加到老的前面。當(dāng)一個事件發(fā)生時,如果您安裝的是一個局部鉤子,您進(jìn)程中的鉤子函數(shù)將被調(diào)用。如果是一個遠(yuǎn)程鉤子,系統(tǒng)就必須把鉤子函數(shù)插入到其它進(jìn)程的地址空間,要做到這一點要求鉤子函數(shù)必須在一個動態(tài)鏈接庫中,所以如果您想要使用遠(yuǎn)程鉤子,就必須把該鉤子函數(shù)放到動態(tài)鏈接庫中去。當(dāng)然有兩個例外:工作日志鉤子和工作日志回放鉤子。這兩個鉤子的鉤子函數(shù)必須在安裝鉤子的線程中。原因是:這兩個鉤子是用來監(jiān)控比較底層的硬件事件的,既然是記錄和回放,所有的事件就當(dāng)然都是有先后次序的。所以如果把回調(diào)函數(shù)放在DLL中,輸入的事件被放在幾個線程中記錄,所以我們無法保證得到正確的次序。故解決的辦法是:把鉤子函數(shù)放到單個的線程中,譬如安裝鉤子的線程。
鉤子一共有14種,以下是它們被調(diào)用的時機(jī): 
WH_CALLWNDPROC 當(dāng)調(diào)用SendMessage時 
WH_CALLWNDPROCRET 當(dāng)SendMessage的調(diào)用返回時 
WH_GETMESSAGE 當(dāng)調(diào)用GetMessage 或 PeekMessage時 
WH_KEYBOARD 當(dāng)調(diào)用GetMessage 或 PeekMessage 來從消息隊列中查詢WM_KEYUP 或 WM_KEYDOWN 消息時 
WH_MOUSE 當(dāng)調(diào)用GetMessage 或 PeekMessage 來從消息隊列中查詢鼠標(biāo)事件消息時 
WH_HARDWARE 當(dāng)調(diào)用GetMessage 或 PeekMessage 來從消息隊列種查詢非鼠標(biāo)、鍵盤消息時 
WH_MSGFILTER 當(dāng)對話框、菜單或滾動條要處理一個消息時。該鉤子是局部的。它時為那些有自己的消息處理過程的控件對象設(shè)計的。 
WH_SYSMSGFILTER 和WH_MSGFILTER一樣,只不過是系統(tǒng)范圍的 
WH_JOURNALRECORD 當(dāng)WINDOWS從硬件隊列中獲得消息時 
WH_JOURNALPLAYBACK 當(dāng)一個事件從系統(tǒng)的硬件輸入隊列中被請求時 
WH_SHELL 當(dāng)關(guān)于WINDOWS外殼事件發(fā)生時,譬如任務(wù)條需要重畫它的按鈕. 
WH_CBT 當(dāng)基于計算機(jī)的訓(xùn)練(CBT)事件發(fā)生時 
WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的應(yīng)用程序很少使用 
WH_DEBUG 用來給鉤子函數(shù)除錯 
現(xiàn)在我們知道了一些基本的理論,現(xiàn)在開始講解如何安裝/卸載一個鉤子。 
要安裝一個鉤子,您可以調(diào)用SetWindowHookEx函數(shù)。該函數(shù)的原型如下: 
SetWindowsHookEx proto HookType:DWORD, pHookProc:DWORD, hInstance:DWORD, ThreadID:DWORD 
HookType 是我們上面列出的值之一,譬如: WH_MOUSE, WH_KEYBOARD 
pHookProc 是鉤子函數(shù)的地址。如果使用的是遠(yuǎn)程的鉤子,就必須放在一個DLL中,否則放在本身代碼中 
hInstance 鉤子函數(shù)所在DLL的實例句柄。如果是一個局部的鉤子,該值為NULL 
ThreadID 是您安裝該鉤子函數(shù)后想監(jiān)控的線程的ID號。該參數(shù)可以決定該鉤子是局部的還是系統(tǒng)范圍的。如果該值為NULL,那么該鉤子將被解釋成系統(tǒng)范圍內(nèi)的,那它就可以監(jiān)控所有的進(jìn)程及它們的線程。如果您指定了您自己進(jìn)程中的某個線程ID 號,那該鉤子是一個局部的鉤子。如果該線程ID是另一個進(jìn)程中某個線程的ID,那該鉤子是一個全局的遠(yuǎn)程鉤子。這里有兩個特殊情況:WH_JOURNALRECORD 和 WH_JOURNALPLAYBACK總是代表局部的系統(tǒng)范圍的鉤子,之所以說是局部,是因為它們沒有必要放到一個DLL中。WH_SYSMSGFILTER 總是一個系統(tǒng)范圍內(nèi)的遠(yuǎn)程鉤子。其實它和WH_MSGFILTER鉤子類似,如果把參數(shù)ThreadID設(shè)成0的話,它們就完全一樣了。 
如果該函數(shù)調(diào)用成功的話,將在eax中返回鉤子的句柄,否則返回NULL。您必須保存該句柄,因為后面我們還要它來卸載鉤子。
要卸載一個鉤子時調(diào)用UnhookWidowHookEx函數(shù),該函數(shù)僅有一個參數(shù),就是欲卸載的鉤子的句柄。如果調(diào)用成功的話,在eax中返回非0值,否則返回NULL。
現(xiàn)在您知道了如何安裝和卸載一個鉤子了,接下來我們將看看鉤子函數(shù)。. 
只要您安裝的鉤子的消息事件類型發(fā)生,WINDOWS就將調(diào)用鉤子函數(shù)。譬如您安裝的鉤子是WH_MOUSE類型,那么只要有一個鼠標(biāo)事件發(fā)生時,該鉤子函數(shù)就會被調(diào)用。不管您安裝的時那一類型鉤子,鉤子函數(shù)的原型都時是一樣的: 
HookProc proto nCode:DWORD, wParam:DWORD, lParam:DWORD 
  
nCode 指定是否需要處理該消息 
wParam 和 lParam 包含該消息的附加消息 
HookProc 可以看作是一個函數(shù)名的占位符。只要函數(shù)的原型一致,您可以給該函數(shù)取任何名字。至于以上的幾個參數(shù)及返回值的具體含義各種類型的鉤子都不相同。譬如: 
WH_CALLWNDPROC 
nCode 只能是HC_ACTION,它代表有一個消息發(fā)送給了一個窗口 
wParam 如果非0,代表正被發(fā)送的消息 
lParam 指向CWPSTRUCT型結(jié)構(gòu)體變量的指針 
return value: 未使用,返回0 
WH_MOUSE 
nCode 為HC_ACTION 或 HC_NOREMOVE 
wParam 包含鼠標(biāo)的事件消息 
lParam 指向MOUSEHOOKSTRUCT型結(jié)構(gòu)體變量的指針 
return value: 如果不處理返回0,否則返回非0值 
所以您必須查詢您的WIN32 API 指南來得到不同類型的鉤子的參數(shù)的詳細(xì)定義以及它們返回值的意義。這里還有一個問題需要注意:所有的鉤子都串在一個鏈表上,最近加入的鉤子放在鏈表的頭部。當(dāng)一個事件發(fā)生時,WINDOWS將按照從鏈表頭到鏈表尾調(diào)用的順序。所以您的鉤子函數(shù)有責(zé)任把消息傳到下一個鏈中的鉤子函數(shù)。當(dāng)然您可以不這樣做,但是您最好明白這時這么做的原因。在大多數(shù)的情況下,最好把消息事件傳遞下去以便其它的鉤子都有機(jī)會獲得處理這一消息的機(jī)會。調(diào)用下一個鉤子函數(shù)可以調(diào)用函數(shù)CallNextHookEx。該函數(shù)的原型如下: 
CallNextHookEx proto hHook:DWORD, nCode:DWORD, wParam:DWORD, lParam:DWORD 
hHook 時是您自己的鉤子函數(shù)的句柄。利用該句柄可以遍歷鉤子鏈。 
nCode, wParam and lParam 您只要把傳入的參數(shù)簡單傳給CallNextHookEx即可。 
請注意:對于遠(yuǎn)程鉤子,鉤子函數(shù)必須放到DLL中,它們將從DLL中映射到其它的進(jìn)程空間中去。當(dāng)WINDOWS映射DLL到其它的進(jìn)程空間中去時,不會把數(shù)據(jù)段也進(jìn)行映射。簡言之,所有的進(jìn)程僅共享DLL的代碼,至于數(shù)據(jù)段,每一個進(jìn)程都將有其單獨的拷貝。這是一個很容易被忽視的問題。您可能想當(dāng)然的以為,在DLL中保存的值可以在所有映射該DLL的進(jìn)程之間共享。在通常情況下,由于每一個映射該DLL的進(jìn)程都有自己的數(shù)據(jù)段,所以在大多數(shù)的情況下您的程序運行得都不錯。但是鉤子函數(shù)卻不是如此。對于鉤子函數(shù)來說,要求DLL的數(shù)據(jù)段對所有的進(jìn)程也必須相同。這樣您就必須把數(shù)據(jù)段設(shè)成共享的,這可以通過在鏈接開關(guān)中指定段的屬性來實現(xiàn)。在MASM中您可以這么做: 
/SECTION:<section name>, S
已初期化的段名是.data,未初始化的段名是.bss。`加入您想要寫一個包含鉤子函數(shù)的DLL,而且想使它的未初始化的數(shù)據(jù)段在所有進(jìn)程間共享,您必須這么做: 
link /section:.bss,S  /DLL  /SUBSYSTEM:WINDOWS ..........
S 代表該段是共享段。 
例子:
一共有兩個模塊:一個是GUI部分,另一個是安裝和卸載鉤子的DLL。 
;--------------------------------------------- 主程序的源代碼部分-------------------------------------- 
.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
include mousehook.inc 
includelib mousehook.lib 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 

wsprintfA proto C :DWORD,:DWORD,:VARARG 
wsprintf TEXTEQU <wsprintfA> 

.const 
IDD_MAINDLG                   equ 101 
IDC_CLASSNAME              equ 1000 
IDC_HANDLE                     equ 1001 
IDC_WNDPROC                 equ 1002 
IDC_HOOK                         equ 1004 
IDC_EXIT                           equ 1005 
WM_MOUSEHOOK             equ WM_USER+6 

DlgFunc PROTO :DWORD,:DWORD,:DWORD,:DWORD 

.data 
HookFlag dd FALSE 
HookText db "&Hook",0 
UnhookText db "&Unhook",0 
template db "%lx",0 

.data? 
hInstance dd ? 
hHook dd ? 
.code 
start: 
    invoke GetModuleHandle,NULL 
    mov hInstance,eax 
    invoke DialogBoxParam,hInstance,IDD_MAINDLG,NULL,addr DlgFunc,NULL 
    invoke ExitProcess,NULL 

DlgFunc proc hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD 
    LOCAL hLib:DWORD 
    LOCAL buffer[128]:byte 
    LOCAL buffer1[128]:byte 
    LOCAL rect:RECT 
    .if uMsg==WM_CLOSE 
        .if HookFlag==TRUE 
            invoke UninstallHook 
        .endif 
        invoke EndDialog,hDlg,NULL 
    .elseif uMsg==WM_INITDIALOG 
        invoke GetWindowRect,hDlg,addr rect 
        invoke SetWindowPos, hDlg, HWND_TOPMOST, rect.left, rect.top, rect.right, rect.bottom, SWP_SHOWWINDOW 
    .elseif uMsg==WM_MOUSEHOOK 
        invoke GetDlgItemText,hDlg,IDC_HANDLE,addr buffer1,128 
        invoke wsprintf,addr buffer,addr template,wParam 
        invoke lstrcmpi,addr buffer,addr buffer1 
        .if eax!=0 
            invoke SetDlgItemText,hDlg,IDC_HANDLE,addr buffer 
        .endif 
        invoke GetDlgItemText,hDlg,IDC_CLASSNAME,addr buffer1,128 
        invoke GetClassName,wParam,addr buffer,128 
        invoke lstrcmpi,addr buffer,addr buffer1 
        .if eax!=0 
            invoke SetDlgItemText,hDlg,IDC_CLASSNAME,addr buffer 
        .endif 
        invoke GetDlgItemText,hDlg,IDC_WNDPROC,addr buffer1,128 
        invoke GetClassLong,wParam,GCL_WNDPROC 
        invoke wsprintf,addr buffer,addr template,eax 
        invoke lstrcmpi,addr buffer,addr buffer1 
        .if eax!=0 
            invoke SetDlgItemText,hDlg,IDC_WNDPROC,addr buffer 
        .endif 
    .elseif uMsg==WM_COMMAND 
        .if lParam!=0 
            mov eax,wParam 
            mov edx,eax 
            shr edx,16 
            .if dx==BN_CLICKED 
                .if ax==IDC_EXIT 
                    invoke SendMessage,hDlg,WM_CLOSE,0,0 
                .else 
                    .if HookFlag==FALSE 
                        invoke InstallHook,hDlg 
                        .if eax!=NULL 
                            mov HookFlag,TRUE 
                            invoke SetDlgItemText,hDlg,IDC_HOOK,addr UnhookText 
                        .endif 
                    .else 
                        invoke UninstallHook 
                        invoke SetDlgItemText,hDlg,IDC_HOOK,addr HookText 
                        mov HookFlag,FALSE 
                        invoke SetDlgItemText,hDlg,IDC_CLASSNAME,NULL 
                        invoke SetDlgItemText,hDlg,IDC_HANDLE,NULL 
                        invoke SetDlgItemText,hDlg,IDC_WNDPROC,NULL 
                    .endif 
                .endif 
            .endif 
        .endif 
    .else 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合天天综合狠狠| 午夜天堂影视香蕉久久| 欧美电影免费观看完整版| 日韩精品资源二区在线| 欧美日韩免费不卡视频一区二区三区| 91在线一区二区三区| 成人动漫视频在线| 91亚洲男人天堂| 日本高清不卡视频| 欧美精三区欧美精三区| 欧美日韩精品电影| 日韩欧美国产高清| 久久一夜天堂av一区二区三区| 久久久久国产免费免费| 国产欧美日韩在线看| 日韩一区日韩二区| 一区二区三区成人在线视频| 亚洲成人tv网| 麻豆精品精品国产自在97香蕉| 久久99精品久久久久婷婷| 国模少妇一区二区三区| 不卡视频一二三| 欧美日韩一区二区三区高清| 欧美一区二区三区四区久久| 久久久久九九视频| 亚洲一区二区三区四区五区黄| 午夜精品一区二区三区三上悠亚| 狠狠色丁香久久婷婷综| 99精品一区二区| 欧美一区永久视频免费观看| 久久精品视频一区二区| 亚洲三级免费观看| 美女一区二区久久| 高清av一区二区| 欧美日韩激情在线| 久久日韩粉嫩一区二区三区| 亚洲伦理在线免费看| 免费在线看成人av| 91在线观看免费视频| 日韩一区二区视频| 亚洲乱码国产乱码精品精的特点 | 亚洲国产va精品久久久不卡综合 | 国精品**一区二区三区在线蜜桃| 国产91综合网| 6080日韩午夜伦伦午夜伦| 欧美激情中文字幕| 久久国产欧美日韩精品| 色综合久久综合| 精品99999| 亚洲一区二区成人在线观看| 风间由美一区二区三区在线观看| 国产欧美一区二区精品性色超碰| 亚洲最大成人网4388xx| 国产成人av电影在线| 欧美一级黄色片| 亚洲自拍偷拍九九九| 国产成人无遮挡在线视频| 欧美色精品在线视频| 国产午夜精品一区二区| 老司机一区二区| 777a∨成人精品桃花网| 亚洲成人av在线电影| 91麻豆蜜桃一区二区三区| 日本一区免费视频| 国产一区在线观看视频| 日韩一区二区免费电影| 午夜视黄欧洲亚洲| 色婷婷综合久久久久中文一区二区| 久久久久国产一区二区三区四区 | 亚洲国产日日夜夜| 色综合天天综合网天天看片| 国产女主播一区| 久久电影网电视剧免费观看| 欧美一区二区三区白人| 日韩二区在线观看| 91精品国产91久久久久久最新毛片| 亚洲一区视频在线| 欧美日韩一区二区三区高清| 一区二区在线看| 欧美午夜免费电影| 亚洲午夜电影网| 久久久久久99久久久精品网站| 狠狠色丁香九九婷婷综合五月| 精品国产乱码久久久久久闺蜜| 麻豆一区二区三| 欧美电影免费提供在线观看| 激情图片小说一区| 国产欧美日韩精品一区| www.视频一区| 亚洲一区二区四区蜜桃| 欧美日韩精品一区二区三区四区| 日韩一区欧美二区| 精品国产欧美一区二区| 高清国产一区二区三区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 成人综合在线视频| 亚洲女爱视频在线| 欧美日韩国产中文| 久久99精品久久久久久国产越南| 日本一区二区三区在线不卡| av在线综合网| 日韩一区精品视频| 久久九九影视网| 一本到高清视频免费精品| 日本视频免费一区| 国产婷婷精品av在线| 91成人在线精品| 麻豆91小视频| 国产精品青草综合久久久久99| 一本久久精品一区二区| 美女任你摸久久| 日韩伦理免费电影| 欧美日韩一二区| 国产乱人伦偷精品视频免下载| 综合欧美一区二区三区| 91精品国产综合久久福利| 风流少妇一区二区| 理论片日本一区| 亚洲国产精品视频| 欧美极品另类videosde| 欧美日韩综合在线免费观看| 国产精品资源网站| 午夜电影网一区| 亚洲日本免费电影| www欧美成人18+| 欧美肥胖老妇做爰| 色婷婷综合久久久中文一区二区| 国产制服丝袜一区| 日本伊人色综合网| 有码一区二区三区| 国产精品美女www爽爽爽| 日韩欧美国产不卡| 欧美巨大另类极品videosbest| 成人一级视频在线观看| 激情综合色综合久久| 亚洲成人免费视频| 一区二区三区在线免费视频| 国产人成亚洲第一网站在线播放 | 91行情网站电视在线观看高清版| 国产美女精品人人做人人爽| 日韩av电影天堂| 亚洲自拍欧美精品| 中文字幕一区二区三区视频| 欧美激情一区二区三区全黄| 精品国产亚洲在线| 欧美激情一区在线| 久久毛片高清国产| 欧美成人a∨高清免费观看| 欧美精品日韩一本| 欧美日韩你懂得| 欧美色图天堂网| 欧美日韩一区高清| 欧美日本一区二区在线观看| 欧美日韩一区视频| 欧美三级三级三级爽爽爽| 在线视频综合导航| 在线观看网站黄不卡| 欧美在线免费播放| 在线亚洲免费视频| 91精品麻豆日日躁夜夜躁| 91麻豆精品国产自产在线观看一区| 欧美日韩不卡一区二区| 欧美日韩综合在线免费观看| 9191成人精品久久| 日韩欧美综合一区| 国产亚洲精品7777| 日本一区二区三区免费乱视频| 国产精品色噜噜| 亚洲色图欧洲色图婷婷| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲一区二区三区激情| 喷水一区二区三区| 国产一区二区在线观看视频| 成人久久久精品乱码一区二区三区| www.欧美日韩| 欧美视频在线一区| 日韩欧美美女一区二区三区| 久久久久久久网| 亚洲欧洲制服丝袜| 日韩成人dvd| 国产超碰在线一区| 欧美在线观看一区二区| 欧美zozozo| 亚洲精品国产a| 免费精品视频在线| 成人爱爱电影网址| 欧美丰满高潮xxxx喷水动漫| 久久久久久97三级| 亚洲国产精品一区二区www| 国产麻豆午夜三级精品| 色婷婷亚洲综合| 国产亚洲综合色| 亚洲福利一区二区三区| 国产老妇另类xxxxx| 欧美怡红院视频| 日本一区二区三区dvd视频在线| 午夜精品久久久久久久99樱桃| 国产成人综合自拍| 在线不卡免费欧美| 亚洲免费三区一区二区|