已安装的窗口挂钩列表

lig*_*tep 8 windows hook winapi

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

Vij*_*jay 6

看到


查找钩子与其他操作相比,枚举已安装的钩子非常容易.

特定于线程的钩子记录在一个win32k每线程数据结构中,而不是富有想象力地标记为THREADINFO 1.这本质上是一个类似ETHREAD/TEB的结构,但是专门为用户和gdi信息量身定制.它的一个成员(aphkStart)是一个16元素的指针数组,它们分别指向NULL,或者是HOOK结构链表的头部.枚举钩子只是沿着这些链条走下去的一种方法.

为方便起见,可能因此不需要迭代来查看是否设置了任何挂钩,THREADINFO包含另一个成员fsHooks,它是一个位域.如果某个位打开,则挂钩数组中的相应索引有效.而不是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;
};
Run Code Online (Sandbox Code Playgroud)

您可以在此处下载该软件


检测已安装的全局挂钩的概述如下:

  1. 调用PsGetCurrentThread并获取当前线程的ETHREAD结构.根据MSDN文档,ETHREAD是一种不透明的数据结构.
  2. 通过调用PsGetThreadWin32Thread来提取THREADINFO结构.它们都没有记录.
  3. 提取DESKTOPINFO.
  4. 在那里你可以找到所有全局安装的钩子.它们按阵列组织.每个元素都是一个链表,对应一个特定的钩子(WH_*).

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

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

你可以在这里看到来源


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

抓取Process Hacker源并编译它,然后将HookTools.vcxproj添加到Plugins.sln.使用VS 2013.在VC++目录中设置库路径.


或相关问题及答案

但我还没有找到一种可靠的方法来做到这一点.

  • *"此网页无法使用"*.请参阅[我如何写出一个好的答案?](http://stackoverflow.com/help/how-to-answer),具体来说:*"提供链接的上下文:鼓励链接到外部资源,但请添加上下文在链接周围,这样你的同行用户就会知道它是什么以及它为什么存在.**总是引用重要链接中最相关的部分,以防目标网站无法访问或永久离线**."* (2认同)

kic*_*hik 5

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

  • “在其他任何事情都有机会之前”?在你能够找到你的钩子之前,有什么可以阻止它做某事? (2认同)