10.2.8 功能破坏

10.2.8 功能破坏

所谓功能破坏是指通过某种技术手段,在保证被保护程序能够正常执行的情况下,将系统原本提供的与调试相关的功能破坏,从而使调试器无法正常工作。因为在大多数的程序中都不会使用系统所提供的调试功能,所以保护系统有时会充分利用这一点。

NtSetInformation Thread()是系统提供的一个设置线程属性的函数,这个函数的原型如图10.42所示。

图10.42 NtSetInformation Thread()函数的原型

在这个函数的参数ThreadInfoClass中指定了许多与线程相关的属性,其中有一项是Thread HideFromDebugger。这一属性可以对调试器隐蔽被设置线程的异常,也就是在系统内核过滤异常信息时,不会将设置了此标记的线程引发的异常传递给调试器。一旦保护系统设定此标记,那么调试器在调试被保护的程序时就无法正常接收线程的异常,调试器将无法进行正常的调试工作。我们可以构建如图10.43所示的代码来破坏调试器下软件断点的能力。

图10.43 破坏调试器代码示例

在测试上面的程序时我们发现,尽管用调试器启动了程序,但最后一个DebugBreak()函数还是会引发程序的异常,而且调试器无法捕获该异常。

还有一些功能模块会引起系统级别的破坏。例如,有很多内核驱动的保护程序总是将被保护程序的进程“武装”起来,使调用WriteProcess Memory()等函数的操作失败,这也是属于功能破坏,在这里我们只需要了解这种概念就可以了。