【问题标题】:List of installed windows hooks已安装的 Windows 挂钩列表
【发布时间】:2012-01-23 19:10:42
【问题描述】:

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

【问题讨论】:

  • @DavidStratton 我想他是在要求列出所有已调用 SetWindowsHookEx 的内容。
  • 例如键盘。 SetWindowsHookEx 将应用程序定义的挂钩过程安装到挂钩链中。我想得到这个钩链。
  • 这些信息有什么用?如果您试图检测您的应用程序是否已被钩住,攻击者只会钩住虚构的EnumerateHooks 函数!
  • 我想检测系统中安装的键盘记录器。
  • 这个页面的底部,请不要在我的机器上使用它。 ntinternals.org/source.php

标签: windows winapi hook


【解决方案1】:


查找 hooks 相比其他操作,枚举已安装 hooks 很简单。

线程特定的钩子记录在一个win32k per-thread数据中 结构标记为 THREADINFO1,颇具想象力。这是 本质上是一种类似 ETHREAD/TEB 的结构,但它是量身定制的 专门用于用户和 gdi 信息。其成员之一 (aphkStart) 是一个 16 元素的指针数组,它们分别 要么指向 NULL,要么指向 HOOK 结构的链表的头部。 枚举钩子只是衡量那些 链。

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

每个桌面2 的全局挂钩也存储在一个 每个对象的结构,也有想象地命名为 (DESKTOPINFO),并且是 也存储在一个带有相应位域的数组中。桥接 二是pDeskInfo,THREADINFO的一个成员,指向它所拥有的 桌面信息。

尽管在介绍中很乏味,但与所有这些一起工作 无证结构在实践中实际上并不太难。这 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. 通过调用 PsGetThreadWin32Thread 提取 THREADINFO 结构。它们都没有记录。
  3. 提取 DESKTOPINFO。
  4. 在那里您可以找到所有全局安装的挂钩。它们被组织成一个数组。每个元素都是一个链表,对应于 一个特定的钩子 (WH_*)。

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

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

你可以看到source here


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

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


或相关问题在这里有答案

但我还没有找到可靠的方法。

【讨论】:

  • “此网页不可用”。请参阅How do I write a good answer?,特别是:“为链接提供上下文:鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它存在的原因。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。”
【解决方案2】:

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

【讨论】:

  • 我知道可以安装我自己的钩子,它会在任何其他钩子之前被调用,但是当我的钩子调用 CallNextHookEx 时,它并没有说明有多少已注册的钩子。
  • 不是那种钩子。 SetWindowsHookEx 上的导入函数挂钩。这样您就可以计算进程调用该函数的时间。
  • 我明白了,但我如何确保在有人调用 SetWindowsHookEx 之前挂钩它?
  • 从驱动程序开始,并尽最大努力使其成为第一个加载到系统的驱动程序。
  • “在其他任何事情有机会之前”?在你找到你的钩子之前,有什么办法可以阻止它做某事?
猜你喜欢
  • 2020-09-19
  • 2021-12-10
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多