已安装的windows挂钩列表

已安装的windows挂钩列表,windows,winapi,hook,Windows,Winapi,Hook,如何获取Windows中全局安装的钩子列表(使用SetWindowsHookEx API)?一种不好的方法是在其他任何钩子函数有机会之前钩住所有钩子函数。请参阅 查找与其他操作相比的挂钩,枚举已安装的 钩子很容易 特定于线程的挂钩记录在每个线程的win32k数据中 结构被标记为THREADINFO,这是一种相当富有想象力的方式。这是 基本上是一个类似ETHREAD/TEB的结构,但需要定制 专门用于用户和gdi信息。其成员之一 (aphkStart)是一个16元素的指针数组,每个指

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

一种不好的方法是在其他任何钩子函数有机会之前钩住所有钩子函数。

请参阅


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

特定于线程的挂钩记录在每个线程的win32k数据中 结构被标记为THREADINFO,这是一种相当富有想象力的方式。这是 基本上是一个类似ETHREAD/TEB的结构,但需要定制 专门用于用户和gdi信息。其成员之一 (aphkStart)是一个16元素的指针数组,每个指针 指向NULL,或者指向钩子结构链接列表的头。 列举钩子仅仅是沿着这些钩子往下走的一种度量 锁链

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

每个桌面的全局钩子也存储在 每个对象结构,也被富有想象力地命名为(DESKTOPINFO),并且 还存储在一个带有相应位字段的数组中。桥接 第二个是pDeskInfo,THREADINFO的一个成员,指向它的所有者 桌面信息

尽管在开场白中抱怨不已,但与所有这些 实际上,未记录的结构在实践中并不太难。这个 win32k.sys的Windows 7符号包括它们的布局,这很好。 不过,Vista/Server 2008时代的标志并不是这样,这就是 大会来了,挽救了这一天

了解这些结构是什么样子是一回事,要了解它们 是另一个

我们把脏兮兮的手套戴在上面,发现了钩子结构的记录 大部分相关信息本身:

你可以下载


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

  • 调用PsGetCurrentThread并获取当前线程的ETHREAD结构。ETHREAD是一种不透明的数据结构 MSDN文档
  • 通过调用PsGetThreadWin32Thread来提取THREADINFO结构。他们两人都没有证件
  • 提取桌面信息
  • 在那里,您可以找到所有全局安装的钩子。它们被组织成一个数组。每个元素都是一个链表,对应于 一个特定的钩子(WH_*)
  • 检测已安装的本地挂钩的概述如下:

  • 给定一个线程ID
  • 调用PsLookupThreadByThreadId并获取指定线程的ETHREAD结构
  • 通过调用PsGetThreadWin32Thread来提取THREADINFO结构
  • 在那里可以找到指定线程的所有本地安装的挂钩。它们被组织成一个数组。每个元素都是一个 链表,并对应于一个特定的钩子(WH_*)
  • 你可以看到


    Process Hacker 2()的插件, 显示系统挂钩并能够解除挂钩(右键单击菜单)

    获取进程黑客源代码并编译它,然后添加 HookTools.vcxproj到Plugins.sln。使用VS 2013。设置你的库 VC++目录中的路径


    或相关的问题和答案在这里


    但是我仍然没有找到一个可靠的方法来做这件事。

    @DavidStratton我想他是在要求列出所有调用
    SetWindowsHookEx
    的东西。SetWindowsHookEx将应用程序定义的钩子过程安装到钩子链中。我想要这条钩链。这条信息有什么用?如果您试图检测应用程序是否已被钩住,攻击者只会钩住虚构的
    EnumerateHooks
    函数!我想检测系统中安装的键盘记录器。在本页底部,请不要在我的机器上使用它。我知道可以安装我自己的钩子,它将在任何其他钩子之前被调用,但它不能告诉我的钩子调用CallNextHookEx时有多少注册的钩子,而不是那种钩子。导入
    SetWindowsHookEx
    上的函数挂钩。这样你就可以计算进程调用该函数的时间。我明白了,但我如何确保在有人调用SetWindowsHookEx之前钩住它?从驱动程序开始,并尽最大努力使它成为第一个加载到系统的驱动程序。“在其他任何程序有机会之前”?在你找到你的钩子之前,怎样才能阻止某些东西这么做呢?“此网页不可用”。具体请参见:“为链接提供上下文:鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接的最相关部分,以防无法访问目标网站或永久脱机。”
    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;
    };