Windows NT DLL委托函数表:一种潜在的隐蔽挂钩技术

本文深入探讨了Windows系统中一个名为“Delegated NT DLL”的内部机制,它提供了一个包含函数指针的表,可用于在32位模式下拦截回调,而无需修改代码,为安全研究和检测带来了新的视角。

Delegated NT DLL

引言 redplait 和 Adam/Hexacorn 早在2017年和2018年就分别记录了这一点,因此这并非新发现。它自2017年4月发布的RedStone 2起正式可用,redplait称其是在2017年1月发布的内部版本15007中引入的。它与AMD64版本NTDLL中存在的WOW64函数表有相似之处。

参考文献

  • DelegatedNtdll
  • Beyond good ol’ Run key, Part 87

观察结果 使用启用了调试符号支持的IDA Pro或Ghidra,可以在 ntdll!_LdrpDelegatedNtdllExports 找到该表。 DLL本身将位于以下路径之一。

架构 路径
x86 C:\Windows\System32\
AMD64 C:\Windows\SysWOW64\
ARM64 C:\Windows\SysWOW64\

表格 在我系统上包含函数指针的表出现在 .text 节中,这表明DLL在编译时合并了 .rdata.text 节。因此,用于定位该表的PoC(概念验证代码)可能对您有效也可能无效,除非您将节更改为 .rdata。可以安全地假设它在某些系统上位于只读内存中,但我没有验证。它包含至少十三个位于 .data 节中的函数指针地址。根据构建版本的不同,可能更多或更少。

有趣的是,与WOW64表类似,NT委托表提供了一种在32位模式下拦截各种回调的简单方法,而无需通过内联挂钩覆盖代码。大多数旨在检测恶意挂钩的工具关注的是可执行代码,而非通常位于只读或读写内存中的函数指针的更改。

查找表的PoC(概念验证)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计