導航:首頁 > 廢水知識 > hook回調函數怎麼用

hook回調函數怎麼用

發布時間:2022-08-16 20:37:27

❶ 使用Wsyscheck時談到Hook,hook是什麼

Hook解釋
Hook是Windows中提供的一種用以替換DOS下「中斷」的系統機制,中文譯為「掛鉤」或「鉤子」。在對特定的系統事件進行hook後,一旦發生已hook事件,對該事件進行hook的程序就會受到系統的通知,這時程序就能在第一時間對該事件做出響應。
另一解釋:
鉤子(Hook),是Windows消息處理機制的一個平台,應用程序可以在上面設置子程以監視指定窗口的某種消息,而且所監視的窗口可以是其他進程所創建的。當消息到達後,在目標窗口處理函數之前處理它。鉤子機制允許應用程序截獲處理window消息或特定事件。
鉤子實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。
Hook原理
每一個Hook都有一個與之相關聯的指針列表,稱之為鉤子鏈表,由系統來維護。這個列表的指針指向指定的,應用程序定義的,被Hook子程調用的回調函數,也就是該鉤子的各個處理子程。當與指定的Hook類型關聯的消息發生時,系統就把這個消息傳遞到Hook子程。一些Hook子程可以只監視消息,或者修改消息,或者停止消息的前進,避免這些消息傳遞到下一個Hook子程或者目的窗口。最近安裝的鉤子放在鏈的開始,而最早安裝的鉤子放在最後,也就是後加入的先獲得控制權。
Windows 並不要求鉤子子程的卸載順序一定得和安裝順序相反。每當有一個鉤子被卸載,Windows 便釋放其佔用的內存,並更新整個Hook鏈表。如果程序安裝了鉤子,但是在尚未卸載鉤子之前就結束了,那麼系統會自動為它做卸載鉤子的操作。
鉤子子程是一個應用程序定義的回調函數(CALLBACK Function),不能定義成某個類的成員函數,只能定義為普通的C函數。用以監視系統或某一特定類型的事件,這些事件可以是與某一特定線程關聯的,也可以是系統中所有線程的事件。
系統鉤子與線程鉤子
SetWindowsHookEx()函數的最後一個參數決定了此鉤子是系統鉤子還是線程鉤子。
線程勾子用於監視指定線程的事件消息。線程勾子一般在當前線程或者當前線程派生的線程內。
系統勾子監視系統中的所有線程的事件消息。因為系統勾子會影響系統中所有的應用程序,所以勾子函數必須放在獨立的動態鏈接庫(DLL) 中。系統自動將包含「鉤子回調函數」的DLL映射到受鉤子函數影響的所有進程的地址空間中,即將這個DLL注入了那些進程。
幾點說明:
(1)如果對於同一事件(如滑鼠消息)既安裝了線程勾子又安裝了系統勾子,那麼系統會自動先調用線程勾子,然後調用系統勾子。
(2)對同一事件消息可安裝多個勾子處理過程,這些勾子處理過程形成了勾子鏈。當前勾子處理結束後應把勾子信息傳遞給下一個勾子函數。
(3)勾子特別是系統勾子會消耗消息處理時間,降低系統性能。只有在必要的時候才安裝勾子,在使用完畢後要及時卸載。

❷ 什麼是HOOK功能

HOOK API是一個永恆的話題,如果沒有HOOK,許多技術將很難實現,也許根本不能實現。這里所說的API,是廣義上的API,它包括DOS下的中斷,WINDOWS里的API、中斷服務、IFS和NDIS過濾等。比如大家熟悉的即時翻譯軟體,就是靠HOOK TextOut()或ExtTextOut()這兩個函數實現的,在操作系統用這兩個函數輸出文本之前,就把相應的英文替換成中文而達到即時翻譯;IFS和NDIS過濾也是如此,在讀寫磁碟和收發數據之前,系統會調用第三方提供的回調函數來判斷操作是否可以放行,它與普通HOOK不同,它是操作系統允許的,由操作系統提供介面來安裝回調函數。

甚至如果沒有HOOK,就沒有病毒,因為不管是DOS下的病毒或WINDOWS里的病毒,都是靠HOOK系統服務來實現自己的功能的:DOS下的病毒靠HOOK INT 21來感染文件(文件型病毒),靠HOOK INT 13來感染引導扇區(引導型病毒);WINDOWS下的病毒靠HOOK系統API(包括RING0層的和RING3層的),或者安裝IFS(CIH病毒所用的方法)來感染文件。因此可以說「沒有HOOK,就沒有今天多姿多彩的軟體世界」。

由於涉及到專利和知識產權,或者是商業機密,微軟一直不提倡大家HOOK它的系統API,提供IFS和NDIS等其他過濾介面,也是為了適應殺毒軟體和防火牆的需要才開放的。所以在大多數時候,HOOK API要靠自己的力量來完成。

HOOK API有一個原則,這個原則就是:被HOOK的API的原有功能不能受到任何影響。就象醫生救人,如果把病人身體里的病毒殺死了,病人也死了,那麼這個「救人」就沒有任何意義了。如果你HOOK API之後,你的目的達到了,但API的原有功能失效了,這樣不是HOOK,而是REPLACE,操作系統的正常功能就會受到影響,甚至會崩潰。

HOOK API的技術,說起來也不復雜,就是改變程序流程的技術。在CPU的指令里,有幾條指令可以改變程序的流程:JMP,CALL,INT,RET,RETF,IRET等指令。理論上只要改變API入口和出口的任何機器碼,都可以HOOK,但是實際實現起來要復雜很多,因為要處理好以下問題:

1,CPU指令長度問題,在32位系統里,一條JMP/CALL指令的長度是5個位元組,因此你只有替換API里超過5個位元組長度的機器碼(或者替換幾條指令長度加起來是5位元組的指令),否則會影響被更改的小於5個位元組的機器碼後面的數條指令,甚至程序流程會被打亂,產生不可預料的後果;

2,參數問題,為了訪問原API的參數,你要通過EBP或ESP來引用參數,因此你要非常清楚你的HOOK代碼里此時的EBP/ESP的值是多少;

3,時機的問題,有些HOOK必須在API的開頭,有些必須在API的尾部,比如HOOK CreateFilaA(),如果你在API尾部HOOK API,那麼此時你就不能寫文件,甚至不能訪問文件;HOOK RECV(),如果你在API頭HOOK,此時還沒有收到數據,你就去查看RECV()的接收緩沖區,裡面當然沒有你想要的數據,必須等RECV()正常執行後,在RECV()的尾部HOOK,此時去查看RECV()的緩沖區,裡面才有想要的數據;

4,上下文的問題,有些HOOK代碼不能執行某些操作,否則會破壞原API的上下文,原API就失效了;

5,同步問題,在HOOK代碼里盡量不使用全局變數,而使用局部變數,這樣也是模塊化程序的需要;

6,最後要注意的是,被替換的CPU指令的原有功能一定要在HOOK代碼的某個地方模擬實現。

下面以ws2_32.dll里的send()為例子來說明如何HOOK這個函數:

Exported fn(): send - Ord:0013h

地址 機器碼 匯編代碼

:71A21AF4 55 push ebp //將被HOOK的機器碼(第1種方法)

:71A21AF5 8BEC mov ebp, esp //將被HOOK的機器碼(第2種方法)

:71A21AF7 83EC10 sub esp, 00000010

:71A21AFA 56 push esi

:71A21AFB 57 push edi

:71A21AFC 33FF xor edi, edi

:71A21AFE 813D1C20A371931CA271 cmp dword ptr [71A3201C], 71A21C93 //將被HOOK的機器碼(第4種方法)

:71A21B08 0F84853D0000 je 71A25893

:71A21B0E 8D45F8 lea eax, dword ptr [ebp-08]

:71A21B11 50 push eax

:71A21B12 E869F7FFFF call 71A21280

:71A21B17 3BC7 cmp eax, edi

:71A21B19 8945FC mov dword ptr [ebp-04], eax

:71A21B1C 0F85C4940000 jne 71A2AFE6

:71A21B22 FF7508 push [ebp+08]

:71A21B25 E826F7FFFF call 71A21250

:71A21B2A 8BF0 mov esi, eax

:71A21B2C 3BF7 cmp esi, edi

:71A21B2E 0F84AB940000 je 71A2AFDF

:71A21B34 8B4510 mov eax, dword ptr [ebp+10]

:71A21B37 53 push ebx

:71A21B38 8D4DFC lea ecx, dword ptr [ebp-04]

:71A21B3B 51 push ecx

:71A21B3C FF75F8 push [ebp-08]

:71A21B3F 8D4D08 lea ecx, dword ptr [ebp+08]

:71A21B42 57 push edi

:71A21B43 57 push edi

:71A21B44 FF7514 push [ebp+14]

:71A21B47 8945F0 mov dword ptr [ebp-10], eax

:71A21B4A 8B450C mov eax, dword ptr [ebp+0C]

:71A21B4D 51 push ecx

:71A21B4E 6A01 push 00000001

:71A21B50 8D4DF0 lea ecx, dword ptr [ebp-10]

:71A21B53 51 push ecx

:71A21B54 FF7508 push [ebp+08]

:71A21B57 8945F4 mov dword ptr [ebp-0C], eax

:71A21B5A 8B460C mov eax, dword ptr [esi+0C]

:71A21B5D FF5064 call [eax+64]

:71A21B60 8BCE mov ecx, esi

:71A21B62 8BD8 mov ebx, eax

:71A21B64 E8C7F6FFFF call 71A21230 //將被HOOK的機器碼(第3種方法)

:71A21B69 3BDF cmp ebx, edi

:71A21B6B 5B pop ebx

:71A21B6C 0F855F940000 jne 71A2AFD1

:71A21B72 8B4508 mov eax, dword ptr [ebp+08]

:71A21B75 5F pop edi

:71A21B76 5E pop esi

:71A21B77 C9 leave

:71A21B78 C21000 ret 0010

下面用4種方法來HOOK這個API:

1,把API入口的第一條指令是PUSH EBP指令(機器碼0x55)替換成INT 3(機器碼0xcc),然後用WINDOWS提供的調試函數來執行自己的代碼,這中方法被SOFT ICE等DEBUGER廣泛採用,它就是通過BPX在相應的地方設一條INT 3指令來下斷點的。但是不提倡用這種方法,因為它會與WINDOWS或調試工具產生沖突,而匯編代碼基本都要調試;

2,把第二條mov ebp,esp指令(機器碼8BEC,2位元組)替換為INT F0指令(機器碼CDF0),然後在IDT里設置一個中斷門,指向我們的代碼。我這里給出一個HOOK代碼:

lea ebp,[esp+12] //模擬原指令mov ebp,esp的功能

pushfd //保存現場

pushad //保存現場

//在這里做你想做的事情

popad //恢復現場

popfd //恢復現場

iretd //返回原指令的下一條指令繼續執行原函數(71A21AF7地址處)

這種方法很好,但缺點是要在IDT設置一個中斷門,也就是要進RING0。

3,更改CALL指令的相對地址(CALL分別在71A21B12、71A21B25、71A21B64,但前面2條CALL之前有一個條件跳轉指令,有可能不被執行到,因此我們要HOOK 71A21B64處的CALL指令)。為什麼要找CALL指令下手?因為它們都是5位元組的指令,而且都是CALL指令,只要保持操作碼0xE8不變,改變後面的相對地址就可以轉到我們的HOOK代碼去執行了,在我們的HOOK代碼後面再轉到目標地址去執行。

假設我們的HOOK代碼在71A20400處,那麼我們把71A21B64處的CALL指令改為CALL 71A20400(原指令是這樣的:CALL 71A21230)

而71A20400處的HOOK代碼是這樣的:

71A20400:

pushad

//在這里做你想做的事情

popad

jmp 71A21230 //跳轉到原CALL指令的目標地址,原指令是這樣的:call 71A21230

這種方法隱蔽性很好,但是比較難找這條5位元組的CALL指令,計算相對地址也復雜。

4,替換71A21AFE地址上的cmp dword ptr [71A3201C], 71A21C93指令(機器碼:813D1C20A371931CA271,10位元組)成為

call 71A20400

nop

nop

nop

nop

nop

(機器碼:E8 XX XX XX XX 90 90 90 90 90,10位元組)

在71A20400的HOOK代碼是:

pushad

mov edx,71A3201Ch //模擬原指令cmp dword ptr [71A3201C], 71A21C93

cmp dword ptr [edx],71A21C93h //模擬原指令cmp dword ptr [71A3201C], 71A21C93

pushfd

//在這里做你想做的事

popfd

popad

ret

這種方法隱蔽性最好,但不是每個API都有這樣的指令,要具體情況具體操作。

以上幾種方法是常用的方法,值得一提的是很多人都是改API開頭的5個位元組,但是現在很多殺毒軟體用這樣的方法檢查API是否被HOOK,或其他病毒木馬在你之後又改了前5個位元組,這樣就會互相覆蓋,最後一個HOOK API的操作才是有效的,所以提倡用第3和第4種方法。

❸ 什麼是回調函數,如何寫一個回調函數

什麼是回調函數?
回調函數是應用程序提供給Windows系統DLL或其它DLL調用的函數,一般用於截獲消息、獲取系統信息或處理非同步事件。應用程序把回調函數的地址指針告訴DLL,而DLL在適當的時候會調用該函數。回調函數必須遵守事先規定好的參數格式和傳遞方式,否則DLL一調用它就會引起程序或系統的崩潰。通常情況下,回調函數採用標准WindowsAPI的調用方式,即__stdcall,當然,DLL編制者可以自己定義調用方式,但客戶程序也必須遵守相同的規定。在__stdcall方式下,函數的參數按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數都按值傳遞,函數返回之前自己負責把參數從堆棧中彈出。
理解回調函數!
程序在調用一個函數(function)時(通常指api).相當於程序(program)呼叫(Call)了一個函數(function)關系表示如下:
call(調用)
program --------------------→ dll
程序在調用一個函數時,將自己的函數的地址作為參數傳遞給程序調用的函數時(那麼這個自己的函數稱回調函數).需要回調函數的 DLL 函數往往是一些必須重復執行某些操作的函數.關系表示如下:
call(調用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回調)
當你調用的函數在傳遞返回值給回調函數時,你就可以利用回調函數來處理或完成一定的操作。至於如何定義自己的回調函數,跟具體使用的API函數有關,很多不同類別的回調函數有各種各樣的參數,有關這些參數的描述一般在幫助中有說明回調函數的參數和返回值等.其實簡單說回調函數就是你所寫的函數滿足一定條件後,被DLL調用!
也有這樣的說法(比較容易理解):
回調函數就好像是一個中斷處理函數,系統在符合你設定的條件時自動調用。為此,你需要做三件事:
1. 聲明;
2. 定義;
3. 設置觸發條件,就是在你的函數中把你的回調函數名稱轉化為地址作為一個參數,以便於DLL調用。

❹ 誰比較了解HOOK技術幫一下

Hook解釋
Hook是Windows中提供的一種用以替換DOS下「中斷」的系統機制,中文譯為「掛鉤」或「鉤子」。在對特定的系統事件進行hook後,一旦發生已hook事件,對該事件進行hook的程序就會受到系統的通知,這時程序就能在第一時間對該事件做出響應。
另一解釋:
鉤子(Hook),是Windows消息處理機制的一個平台,應用程序可以在上面設置子程以監視指定窗口的某種消息,而且所監視的窗口可以是其他進程所創建的。當消息到達後,在目標窗口處理函數之前處理它。鉤子機制允許應用程序截獲處理window消息或特定事件。
鉤子實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。
Hook原理
每一個Hook都有一個與之相關聯的指針列表,稱之為鉤子鏈表,由系統來維護。這個列表的指針指向指定的,應用程序定義的,被Hook子程調用的回調函數,也就是該鉤子的各個處理子程。當與指定的Hook類型關聯的消息發生時,系統就把這個消息傳遞到Hook子程。一些Hook子程可以只監視消息,或者修改消息,或者停止消息的前進,避免這些消息傳遞到下一個Hook子程或者目的窗口。最近安裝的鉤子放在鏈的開始,而最早安裝的鉤子放在最後,也就是後加入的先獲得控制權。
Windows 並不要求鉤子子程的卸載順序一定得和安裝順序相反。每當有一個鉤子被卸載,Windows 便釋放其佔用的內存,並更新整個Hook鏈表。如果程序安裝了鉤子,但是在尚未卸載鉤子之前就結束了,那麼系統會自動為它做卸載鉤子的操作。
鉤子子程是一個應用程序定義的回調函數(CALLBACK Function),不能定義成某個類的成員函數,只能定義為普通的C函數。用以監視系統或某一特定類型的事件,這些事件可以是與某一特定線程關聯的,也可以是系統中所有線程的事件。
系統鉤子與線程鉤子
SetWindowsHookEx()函數的最後一個參數決定了此鉤子是系統鉤子還是線程鉤子。
線程勾子用於監視指定線程的事件消息。線程勾子一般在當前線程或者當前線程派生的線程內。
系統勾子監視系統中的所有線程的事件消息。因為系統勾子會影響系統中所有的應用程序,所以勾子函數必須放在獨立的動態鏈接庫(DLL) 中。系統自動將包含「鉤子回調函數」的DLL映射到受鉤子函數影響的所有進程的地址空間中,即將這個DLL注入了那些進程。
幾點說明:
(1)如果對於同一事件(如滑鼠消息)既安裝了線程勾子又安裝了系統勾子,那麼系統會自動先調用線程勾子,然後調用系統勾子。
(2)對同一事件消息可安裝多個勾子處理過程,這些勾子處理過程形成了勾子鏈。當前勾子處理結束後應把勾子信息傳遞給下一個勾子函數。
(3)勾子特別是系統勾子會消耗消息處理時間,降低系統性能。只有在必要的時候才安裝勾子,在使用完畢後要及時卸載。
Hook的應用模式
觀察模式
最為常用,像Windows提供的SetWindowHook就是典型地為這類應用准備的。而且這也是最普遍的用法。
這個模式的特點是,在事情發生的時候,發出一個通知信息。觀察者只可以查看過程中的信息,根據自己關心的內容處理自己的業務,但是不可以更改原來的流程。
如全局鉤子中,經常使用的滑鼠消息、鍵盤消息的監視等應用。金山詞霸屏幕取詞的功能是一個典型的應用(具體技術可以參考此類文章)。
注入模式
這個模式和觀察模式最大的不一樣的地方在於,注入的代碼是為了擴展原始代碼的功能業務。插件模式是此類模式的典型案例。
不管瘦核心的插件系統(如Eclipse)還是胖核心的插件系統(如Delphi、Visual Studio等IDE環境),其對外提供的插件介面都是為了擴展本身系統的功能的。
這種擴展的應用方式的典型特點,就是新的擴展代碼和原來的代碼會協調處理同類業務。
替換模式
如果針對應用目的不同,可以叫修復模式或破解模式。前者是為了修改系統中的BUG,後者是為了破解原有系統的限制。
很多黑客使用此種模式,將訪問加密鎖的DLL中的導出表,替換成自己的函數,這樣跳過對軟體的控制代碼。這類應用的難點是,找出函數的參數。
這類模式的特點是,原有的代碼會被新的代碼所替換。
前面三個是基本模式,還有很多和實際應用相關的模式。
集權模式
此類模式的出現,大都是為了在全部系統中,統一處理某類事情。它的特點不在於注入的方式,而在於處理的模式。
這個模式,大都應用到某類服務上,比如鍵盤服務,滑鼠服務,列印機服務等等特定服務上。通過統一接管此類服務的訪問,限制或者協調對服務的訪問。
比如鍵盤鎖功能的實現,就是暫時關閉鍵盤的所有應用。
這類模式的特點主要會和特點服務有關聯。
修復模式
替換模式的一種,這里強調的是其應用的目的是為了修復或擴展原有系統的功能。
破解模式
替換模式的一種,這里強調的是其應用的目的是為了跳過原有系統的一部分代碼。如加密檢測代碼,網路檢測代碼等等。
插件模式
注入模式的一種,在系統的內部直接依靠HOOK機制進行擴展業務功能。
共享模式
這類應用中,經常是為了獲取對方的數據。必然我希望獲取對方系統中,所有字元串的值。可以通過替換對方的內存管理器,導出所有字元串。
這個應用比較特殊。不過其特點在於,目的是達到系統之間的數據共享。
其實現,可能是觀察模式,也可能是替換模式。
VB中的Hook技術應用
一、Hook簡介
Hook這個東西有時令人又愛又怕,Hook是用來攔截系統某些訊息之用,例如說,我們想
讓系統不管在什麼地方只要按個Ctl-B便執行NotePad,或許您會使用Form的KeyPreview
,設定為True,但在其他Process中按Ctl-B呢?那就沒有用,這是就得設一個Keyboard
Hook來攔截所有Key in的鍵;再如:MouseMove的Event只在該Form或Control上有效,如果希望在Form的外面也能得知Mouse Move的訊息,那隻好使用Mouse Hook來欄截Mouse
的訊息。再如:您想記錄方才使用者的所有鍵盤動作或Mosue動作,以便錄巨集,那就
使用JournalRecordHook,如果想停止所有Mosue鍵盤的動作,而放(執行)巨集,那就
使用JournalPlayBack Hook;Hook呢,可以是整個系統為范圍(Remote Hook),即其他
Process的動作您也可以攔截,也可以是LocalHook,它的攔截范圍只有Process本身。
Remote Hook的Hook Function要在.Dll之中,Local Hook則在.Bas中。
在VB如何設定Hook呢?使用SetWindowsHookEx()
Declare Function SetWindowsHookEx Lib 'user32' Alias 'SetWindowsHookExA' _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
idHook代表是何種Hook,有以下幾種
Public Const WH_CALLWNDPROC = 4
Public Const WH_CALLWNDPROCRET = 12
Public Const WH_CBT = 5
Public Const WH_DEBUG = 9
Public Const WH_FOREGROUNDIDLE = 11
Public Const WH_GETMESSAGE = 3
Public Const WH_HARDWARE = 8
Public Const WH_JOURNALPLAYBACK = 1
Public Const WH_JOURNALRECORD = 0
Public Const WH_KEYBOARD = 2
Public Const WH_MOUSE = 7
Public Const WH_MSGFILTER = (-1)
Public Const WH_SHELL = 10
Public Const WH_SYSMSGFILTER = 6
lpfn代表Hook Function所在的Address,這是一個CallBack Fucnction,當掛上某個
Hook時,我們便得定義一個Function來當作某個訊息產生時,來處理它的Function
,這個Hook Function有一定的叄數格式
Private Function HookFunc(ByVal ncode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
nCode 代表是什麼請況之下所產生的Hook,隨Hook的不同而有不同組的可能值
wParam lParam 傳回值則隨Hook的種類和nCode的值之不同而不同。
因這個叄數是一個 Function的Address所以我們固定將Hook Function放在.Bas中,
並以AddressOf HookFunc傳入。至於Hook Function的名稱我們可以任意給定,不一
定叫 HookFunc
hmod 代表.DLL的hInstance,如果是Local Hook,該值可以是Null(VB中可傳0進去),
而如果是Remote Hook,則可以使用GetMoleHandle('.dll名稱')來傳入。
dwThreadId 代表執行這個Hook的ThreadId,如果不設定是那個Thread來做,則傳0(所以
一般來說,Remote Hook傳0進去),而VB的Local Hook一般可傳App.ThreadId進去
值回值如果SetWindowsHookEx()成功,它會傳回一個值,代表目前的Hook的Handle,
這個值要記錄下來。
因為A程式可以有一個System Hook(Remote Hook),如KeyBoard Hook,而B程式也來設一
個Remote的KeyBoard Hook,那麼到底KeyBoard的訊息誰所攔截?答案是,最後的那一個
所攔截,也就是說A先做keyboard Hook,而後B才做,那訊息被B攔截,那A呢?就看B的
Hook Function如何做。如果B想讓A的Hook Function也得這個訊息,那B就得呼叫
CallNextHookEx()將這訊息Pass給A,於是產生Hook的一個連線。如果B中不想Pass這訊息
給A,那就不要呼叫CallNextHookEx()。
Declare Function CallNextHookEx Lib 'user32' _
(ByVal hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
hHook值是SetWindowsHookEx()的傳回值,nCode, wParam, lParam則是Hook Procere
中的三個叄數。
最後是將這Hook去除掉,請呼叫UnHookWindowHookEx()
Declare Function UnhookWindowsHookEx Lib 'user32' (ByVal hHook As Long) As Long
hHook便是SetWindowsHookEx()的傳回值。此時,以上例來說,B程式結束Hook,則換A可
以直接攔截訊息。
KeyBoard Hook的範例
Hook Function的三個叄數
nCode wParam lParam 傳回值
HC_ACTION 表按鍵Virtual Key 與WM_KEYDOWN同 若訊息要被處理傳0
或 反之傳1
HC_NOREMOVE
Public hHook As Long
Public Sub UnHookKBD()
If hnexthookproc <;>; 0 Then
UnhookWindowsHookEx hHook
hHook = 0
End If
End Sub
Public Function EnableKBDHook()
If hHook <;>; 0 Then
Exit Function
End If
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, App.ThreadID)
End Function
Public Function MyKBHFunc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
MyKBHFunc = 0 '表示要處理這個訊息
If wParam = vbKeySnapshot Then '偵測 有沒有按到PrintScreen鍵
MyKBHFunc = 1 '在這個Hook便吃掉這個訊息
End If
Call CallNextHookEx(hHook, iCode, wParam, lParam) '傳給下一個Hook
End Function
只要將上面代碼放在VB的模塊中,用標准VB程序就可以了,當運行該程序後,就能攔截所有鍵盤操作。

❺ 回調函數 及 hook函數有沒有優先順序別設置

!(IPCB(skb)->flags & IPSKB_REROUTED));
這里我們看到切入點從無條件宏NF_HOOK改成了有條件宏NF_HOOK_COND,調用該宏的條件是:如果協議棧當前所處理的數據包skb中沒有重新路由的標記,數據包才會進入Netfilter框架。否則直接調用ip_finish_output函數走協議棧去處理。除此之外,有條件宏和無條件宏再無其他任何差異。
如果需要陷入Netfilter框架則數據包會在nf_hooks[2][4]過濾點去進行匹配查找。

❻ delphi hook回調函數問題

SetWindowsHookEx, 其四個參數分別為鉤子類型, 鉤子函數地址, 鉤子函數所在DLL的實例句柄,安裝鉤子後想監控的線程的ID號, 返回參數為鉤子句柄

❼ 請問wpf中鍵盤hook程序的回調函數怎麼寫

首先,你要去確定你的軟體是否允許多鍵按下,這個涉及到是否需要多線程。
如果只需要計算單個按鍵,從按下到松開的時間,非常簡單。
private DateTime? LastKeyDownTime{ get; set; }
private void KeyDown(object sender, KeyBoradEventArgs e)
{
LastKeyDownTime = DateTime.Now;
}
private void KeyUp(object sender, KeyBoradEventArgs e)
{
MessageBox.Show(DateTime.Now - LastKeyDownTime);
}

如果是多鍵同時檢測,你就要做多線程處理了,去記錄每一個按鍵的KeyChar ,然後對應的去計算按鍵彈起時的事件。

❽ 如何通過回調函數獲得消息 一個滑鼠的HOOK測試程序 代碼如下 如何從回調函數中得到滑鼠的信息

你需要截獲 按鈕 HWND 的 WM_LBUTTONDOWN 函數。

好幾種方法實現。

比較簡單的一種:

採用SetWindowLong子類化該HWND,即設置該窗口的消息處理函數,然後判斷消息是不是按鈕被按下了,做好處理之後再去調用老的消息處理函數。
但是,每個進程都有各自的私有4G空間,而你要截獲的是遠進程窗口消息,因此,你不能簡單的直接使用SetWindowLong,因為你傳過去的參數,對於遠進程來說,是沒有意義的。
因此,第一步,你需要將實現寫入DLL,然後將DLL注入遠進程。(注,DLL的DLLMain函數中實現SetWindowLong等實現)。

這種方法要比全局鉤子的方法效率高。而且也很容易寫。

閱讀全文

與hook回調函數怎麼用相關的資料

熱點內容
小米空氣凈化器回收賣多少錢 瀏覽:471
李采潭演模特的電影 瀏覽:810
如何看麵包車空調濾芯型號 瀏覽:123
超濾工藝優缺點 瀏覽:250
filter過濾敏感詞 瀏覽:713
溫州超濾膜特點 瀏覽:125
啤酒酵母對含鎘污水的處理 瀏覽:426
女主叫淑珍的韓劇 瀏覽:680
反滲透膜氫氧化鐵結垢怎麼去除 瀏覽:551
什麼類型的污水cod高 瀏覽:728
二級反滲透設備結構與工藝流程介紹 瀏覽:201
主角叫林易是主神的小說 瀏覽:111
深圳市恆源水處理設備 瀏覽:57
三合一過濾泵如何放在水中 瀏覽:705
國內反滲透知名品牌 瀏覽:993
女主是屋頂工的電影是什麼 瀏覽:976
水處理技術的書籍 瀏覽:748
方污水桶泥巴不會落下怎麼辦 瀏覽:288
污水管網不直監理怎麼下通知 瀏覽:995
制葯廢水噸水造價 瀏覽:825