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