内核侦探的众多功能之一是可以检索在驱动程序win32k.sys中实现的本机apis函数的原始地址,并检查它们是否被钩住。有哪些可能的方法可以达到相同目的?

评论

您可能也对HookShark感兴趣。我知道这不是猜测的地方,但我认为它的作用相同。 “它将扫描每个正在运行的进程的每个已加载模块的代码段,并将其与文件图像进行比较”

#1 楼

对于常规的内联挂钩(仅替换函数的前几个字节),您可以简单地读取每个函数的前几个字节以检查它是否已被挂钩。更深的内嵌钩子很难检测。

除了内嵌钩子外,还可能有人钩住SSDT。 SSDT是一个表,位于WINAPI的系统调用与实现它们的内核模式函数之间。 SSDT由系统调用ID索引,并将每个ID映射到kernelmode函数的地址。对于Windows操作系统的任何给定Service Pack,此映射均保持静态。因此,很容易找出每个系统调用ID对应的功能,从而确定SSDT中每个条目应对应的功能。

要检测SSDT挂钩并恢复原始地址,您可以尝试使用以下内容之一:

您可以在钩挂SSDT之前加载一次程序/驱动程序,并获取原始地址。只要在钩子就位之前就加载驱动程序,这将是相当可靠的。或者,您可以从Microsoft的符号存储库下载.pdb文件,并使用DIA SDK或DbgHelp API。只要存在连接并且没有任何干扰,这是非常可靠的。但是,对于一个与用于ntoskrnl或win32k的.pdb一样大的.pdb,这将非常慢。如果仅挂接了第一个SSDT,则可以使用Shadow SSDT中的值检查值。反之亦然。

您可以检查SSDT中是否有任何条目指向内核/ win32k之外的地址。这是检测钩子的一种非常可靠的方法,但它不会轻易为您提供原始地址。

扫描字节签名是找到原始地址的一种可靠且隐蔽的方式。

这里也有类似的问题

评论


读取原始SSDT条目的另一种方法是从磁盘上的内核映像中读取。这是一个PE文件,而KeServiceDescriptorTable是导出的条目。

– ivan_pozdeev
2014年3月18日在7:19

#2 楼

我认为您应该从导出的API函数的原始文件(exe,dll)中读取数据,并与加载内存中的数据进行比较。为了避免假冒同时读取API函数被钩住的结果,您应该使用一些技巧从内存中获取原始读取API函数。