已安装的窗口挂钩列表

时间:2011-12-19 17:22:33

标签: windows winapi hook

如何获取Windows中全局安装的挂钩列表(使用SetWindowsHookEx API)?

2 个答案:

答案 0 :(得分:6)


  

查找挂钩与其他操作相比,枚举已安装的挂钩   钩子很容易。

     

线程特定的挂钩记录在每个线程的win32k数据中   结构标记,而非富有想象力,如THREADINFO 1。这是   基本上是一个ETHREAD / TEB结构,但是一个定制的   专门针对用户和gdi信息。其中一名成员   (aphkStart)是一个16元素的指针数组,分别是它们   要么指向NULL,要么指向HOOK结构链表的头部。   枚举钩子只是一种走下去的措施   链。

     

为方便起见,可能不需要迭代来查看   如果设置了任何钩子,THREADINFO包含另一个成员fsHooks,   这是一个位域。如果有一个位,则相应的索引在   hook数组有效。而不是33个比较(16个为NULL,17个为   一个for循环),告诉是否有钩子只需要一个,漂亮!

     

每个桌面2的全局挂钩也存储在一个   每个对象的结构,也有想象力地命名(DESKTOPINFO),并且是   也存储在带有附带位域的数组中。弥合   两个是pDeskInfo,THREADINFO的成员,指向它拥有   DESKTOPINFO。

     

尽管介绍中有大量消息,但还是要处理所有这些问题   在实践中,无证结构实际上并不太难。该   win32k.sys的Windows 7符号包括它们的布局,这很不错。   Vista / Server 2008时代的符号不是,这就是其中之一   学习集会来拯救这一天。

     

了解这些结构的外观是一回事,了解它们   是另一个......

     

我们得到了他们的肮脏手套,我们发现HOOK结构记录   大多数相关信息本身:

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结构。 ETHREAD是一个不透明的数据结构   MSDN文档。
  2.   
  3. 通过调用PsGetThreadWin32Thread来提取THREADINFO结构。他们都没有证件。
  4.   
  5. 提取DESKTOPINFO。
  6.   
  7. 在那里你可以找到所有全局安装的钩子。它们按阵列组织。每个元素都是一个链表,对应于   一个特定的钩子(WH _ *)。
  8.         

    检测已安装的本地挂钩的概述如下:

         
        
    1. 给出一个帖子ID。
    2.   
    3. 调用PsLookupThreadByThreadId并获取指定线程的ETHREAD结构。
    4.   
    5. 通过调用PsGetThreadWin32Thread来提取THREADINFO结构。
    6.   
    7. 在那里你可以找到指定线程的所有本地安装的钩子。它们按阵列组织。每个元素都是一个   链表并对应于特定的挂钩(WH _ *)。
    8.   

您可以看到source here


  

Process Hacker 2的插件(http://processhacker.sourceforge.net),   显示系统挂钩并能够取消挂钩(右键菜单)。

     

抓住Process Hacker源并编译它,然后添加   HookTools.vcxproj到Plugins.sln。使用VS 2013。设置你的图书馆   VC ++目录中的路径。


或相关问题及答案

但我仍然没有找到可行的方法。

答案 1 :(得分:3)

一种邪恶的方法是在其他东西有机会之前挂钩所有挂钩函数。