全局鉤子

全局鉤子

全局鉤子是系統鉤子的一種,當指定的一些消息被系統中任何應用程序所處理時,這個鉤子就被調用。

鉤子簡介


在某種操作后彈出的關於全局鉤子的界面
在某種操作后彈出的關於全局鉤子的界面
鉤子一詞多用於計算機編程中,英文叫hook,指利用api來提前攔截並處理windows消息的一種技術。如鍵盤鉤子,許多木馬都有這東西,監視你的鍵盤操作。

鉤子的原理


Windows系統是建立在事件驅動的機制上的,說穿了就是整個系統都是通過消息的傳遞來實現的。而鉤子是Windows系統中非常重要的系統介面,用它可以截獲並處理送給其他應用程序的消息,來完成普通應用程序難以實現的功能。鉤子的種類很多,每種鉤子可以截獲並處理相應的消息,如鍵盤鉤子可以截獲鍵盤消息,外殼鉤子可以截取、啟動和關閉應用程序的消息等。

運行機制


鉤子實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。對每種類型的鉤子由系統來維護一個鉤子鏈,最近安裝的鉤子放在鏈的開始,而最先安裝的鉤子放在最後,也就是后加入的先獲得控制權。要實現Win32的系統鉤子,必須調用SDK中的API函數SetWindowsHookEx來安裝這個鉤子函數,這個函數的原型是HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);,其中,第一個參數是鉤子的類型;第二個參數是鉤子函數的地址;第三個參數是包含鉤子函數的模塊句柄;第四個參數指定監視的線程。如果指定確定的線程,即為線程專用鉤子;如果指定為空,即為全局鉤子。其中,全局鉤子函數必須包含在DLL(動態鏈接庫)中,而線程專用鉤子還可以包含在可執行文件中。得到控制權的鉤子函數在完成對消息的處理后,如果想要該消息繼續傳遞,那麼它必須調用另外一個SDK中的API函數CallNextHookEx來傳遞它。鉤子函數也可以通過直接返回TRUE來丟棄該消息,並阻止該消息的傳遞。