2011-12-19 92 views
8

如何獲取Windows中全局安裝的鉤子列表(使用SetWindowsHookEx API)?已安裝的窗口鉤子列表

+0

@DavidStratton我想他要求一個名爲'SetWindowsHookEx'的列表。例如鍵盤 – vcsjones 2011-12-19 17:25:20

+0

。 SetWindowsHookEx將應用程序定義的掛鉤過程安裝到掛鉤鏈中。我想獲得這個鉤鏈。 – lightstep 2011-12-19 17:26:51

+0

你不能這樣做;你想達到什麼目的? – Michael 2011-12-19 17:29:45

回答

3

一個邪惡的方式是在任何其他事情得到機會之前勾住所有的掛鉤函數。

+0

我知道有可能安裝我自己的鉤子,它將在任何其他鉤子之前被調用,但它不會告訴掛鉤調用CallNextHookEx時有多少個掛鉤。 – lightstep 2011-12-19 17:31:03

+0

不是那種鉤子。在'SetWindowsHookEx'上導入函數鉤子。通過這種方式,您可以計算進程調用該函數的時間。 – kichik 2011-12-19 17:48:28

+0

我明白了,但是我怎麼能確定在任何人打電話之前鉤住SetWindowsHookEx? – lightstep 2011-12-19 21:11:54

5


尋找掛鉤相對於其他操作,枚舉installe d 掛鉤非常容易。

線程特定的鉤子記錄在win32k每線程數據中 結構標記爲THREADINFO 1,而且富有想象力。這基本上是ETHREAD/TEB類似結構,但是專門爲用戶和gdi信息量身定製的 。它的一個成員 (aphkStart)是一個16個元素的指針數組,它們分別是 或者指向NULL,或者是一個HOOK結構鏈表的頭部。枚舉掛鉤只是衡量這些鏈條的行爲。

爲了方便起見,並大概所以看到 如果任何鉤設置不要求迭代中,一個ThreadInfo包含另一個構件,fsHooks, 其是位字段。如果有一位打開,則 掛鉤數組中的對應索引有效。而不是33比較(NULL爲16,而for循環爲 ),告訴是否有鉤子只需要一個,漂亮!

全球鉤,這是每桌面2,也存儲在一個 每個對象結構,也想象力命名(DESKTOPINFO),並且 也被存儲在具有伴隨位域的陣列。橋接 兩個是pDeskInfo,是THREADINFO的成員,它指向它擁有的 DESKTOPINFO。

儘管在介紹中腹瀉,但與所有這些 一起工作,實際上並不太難。 win32k.sys的Windows 7符號包含它們的佈局,這很好。 雖然Vista/Server 2008時代的標誌不是,但這是 學習的組件來節省一天。

知道這些結構,看起來就像是一兩件事,在他們獲得 是另一個...

已經得到了他們我們的骯髒的手套,我們發現鉤狀結構記錄 大部分的相關信息本身:

struct tagHOOK 
{ 
    THRDESKHEAD head; // info about the creator 
    struct tagHOOK* phkNext; // next entry in linked list 
    int iHook; // WH_ hook type 
    UINT_PTR offPfn; // RVA to hook function in ihmod library 
    UINT flags; // HF_ flags (GLOBAL, ANSI) 
    int ihmod; 
    THREADINFO* ptiHooked; // the hooked thread 
    PVOID rpDesk; // saved desktop pointer 
    ULONG nTimeout :7; 
    ULONG fLastHookHung :1; 
}; 

您也可以下載software here


,用於檢測安裝全局鉤子概述如下:

  1. 呼叫PsGetCurrentThread,並獲得當前線程的ETHREAD結構。根據MSDN文檔 ,ETHREAD是一個不透明的數據結構。
  2. 通過調用PsGetThreadWin32Thread來提取THREADINFO結構。他們兩人都沒有證件。
  3. 提取DESKTOPINFO。
  4. 在那裏你可以找到所有全局安裝的鉤子。他們被組織在一個陣列中。每個元素都是一個鏈表,並對應於 一個特定的鉤子(WH_ *)。

,用於檢測安裝在本地鉤的概述如下:

  1. 給定線程ID。
  2. 呼叫PsLookupThreadByThreadId並獲得指定線程的ETHREAD結構。
  3. 通過調用PsGetThreadWin32Thread提取的ThreadInfo結構。
  4. 在那裏你可以找到指定線程的所有本地安裝的鉤子。他們被組織在一個陣列中。每個元素都是一個 鏈表,並對應於一個特定的鉤子(WH_ *)。

可以看到source here


插件過程哈克2(http://processhacker.sourceforge.net) 顯示系統的鉤和能夠解開(右點擊菜單)。

抓取Process Hacker源並編譯它,然後將 HookTools.vcxproj添加到Plugins.sln。 VS 2013被使用。在VC++目錄中設置您的庫 路徑。


或相關與答題這裏

但我還沒有找到一個可靠的方式來做到這一點。

+2

*「此網頁不可用」*。請參閱[如何編寫好的答案?](http://stackoverflow.com/help/how-to-answer),具體爲:*「爲鏈接提供上下文:鼓勵與外部資源的鏈接,但請添加上下文圍繞鏈接,所以你的同行用戶會有一些想法是什麼,爲什麼它在那裏。**如果目標站點無法訪問或永久離線**,請始終引用重要鏈接中最相關的部分**。「* – IInspectable 2015-10-27 00:22:57