根据所使用的 AV/EDR,我们将检查哪些 Windows API 被其挂钩。

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/VirtualAlllocEx/AV-EPP-EDR-Windows-API-Hooking-List

AV/EPP/EDR Windows API 挂钩列表

从红队的角度来看,根据你所处理的产品,EPP/EDR 将使用 usermod hooks 监控红队活动。它们通常会在 ntdll.dll 中设置其 usermod hooks,但是根据 EPP/EDR 的不同,它们也会在许多其他 DLL 中使用 hooks。如果想了解更多信息,请参考 ZeroPeril 的以下博客文章 https://zeroperil.co.uk/blog/hookdump/

为了检查哪些 API 被挂钩,我使用了来自 zeroperil 的 repo https://github.com/zeroperil/HookDump。我认为这个工具的方法比其他方法更可靠,因为它不仅对 Nt 或 Zw inline API hooks 进行简单的检查。

相关博文资料

HookDump 全频谱 EDR

hook 检测,误报率低

最近我们的一个副项目需要我们生成一个被 EDR 钩取的函数列表,并满足以下要求:

  • 低误报率

  • 检查一系列 DLL,而不仅仅是 NTDLL

  • 定位函数的第二或第三条指令中的钩子

  • 检测 WOW syscall stub 的篡改

  • 没有 ASCII art

我们快速搜索了一下 Google,看看是否有现有的工具可以快速回答我们的问题,发现 EDR 钩取是最近在社交媒体上引起很多关注的事情,有些是好的,有些我们不确定是否是一个玩笑;我们阅读的一篇博客展示了从 kernel32 重定向到 kernelbase 的函数截图,并声称他们发现了一些钩子!

最终我们决定花费几个小时自己编写一个工具,它的名字叫 HookDump

 

ad1a1b7183111953

细节说明

简单的钩子扫描解决方案只会扫描一个已加载的 DLL 中的第一个字节的 jmp 指令,导致许多误报,例如导出变量等。

 

ad1a1b7183112030

HookDump 具有低(零?)误报率,这是通过对每个被检查的 DLL 进行两次加载实现的:一次使用 LoadLibrary,另一次从磁盘读入缓冲区。导出函数在两个加载的副本中都会被解析,从两个副本中反汇编几条指令,然后比较这些指令。使用这种方法,HookDump 可以检测到函数的第一、第二或第三条指令中的钩子。

我们观察到一些 EDR 在 PEB 模块列表中创建了一个虚假的 NTDLL 条目,结合页面保护/无执行内存访问权限和异常处理程序,将可信的执行流重定向到真正的 NTDLL,以防止 shellcode 通过解析导出表手动查找函数地址。这是一个旧技术,追溯到2005年;Piotr Bania 首次在 Phrack magazine #63 中详细介绍了它。HookDump 能够定位原始的 NTDLL 副本并检查其中的钩子。

HookDump 还检查多个 DLL,而不仅仅是查看 NTDLL,库列表存储在源文件 LibraryList.inl 中,并使用 SysInternals ProcessExplorer 在 explorer.exe 中倾卸了加载的 DLL 列表。

 

ad1a1b7183112215

更新版本 1.1

一些安全产品还会修改 32 位可执行文件中的 WOW64 syscall stub,现在 HookDump 也可以检测到这种情况。使用这种方法,通常不需要在 NTDLL 中使用直接 jmp 钩子,因此在运行32位版本时,您可能会发现该工具仅检测 WOW64 syscall 修改,而没有其他钩子。与任何类似工具一样,如果您对输出结果不确定,可以通过连接调试器并手动查找钩子来进行适当的验证。

源代码

源代码可在 Zeroperil GitHub 存储库中获取。显然,这还没有对每个安全产品进行测试。如果您发现错误,请随时修复并发送拉取请求 🙂

标签:工具分享, EDR产品, 主机安全