PatchGuard(Kernel Patch Protect)学习

这里的Patch指对Windows内核核心组件添加一些不支持的功能,但是微软声明这会减少系统稳定性和可靠性、性能。在x86版本的系统上可能实现,但是在x64版本的Windows上引入了PatchGuard。

但是PatchGuard不是一个完美的保护方案,会给反病毒厂商添加额外的问题,因为恶意软件可以很容易绕过厂商检测。但是依然可以阻止合法软件Patch造成的系统稳定性、可靠性和性能问题。

原理

Windows Kernel和设备驱动是同一特权级别,但是设备驱动是不应该修改内核系统结构的。但是x86没有强制保护,导致很多反病毒恶意软件和安全软件通过加载驱动修改内核结构

x64Windows开始强制限制设备驱动可以修改的东西,KPP就是这种技术。定期检查受保护的系统结构没有被更改,如果检测到了,就蓝屏并关机或重启,对应码位0x109,CRITICAL_STRUCTURE_CORRUPTION。可能的修改是

  • 修改系统服务描述符表
  • 修改中断描述符表
  • 修改全局描述符表
  • 利用非内核分配的内核栈
  • 修改或patch内核中的代码,或HAL/NDIS内核库

KPP仅防御设备驱动修改内核,但是无法阻止一个驱动修改另一个驱动

由于设备驱动和内核在同一个特权级别,所以不可能完全阻止驱动绕过KPP。KPP通过定期更新来对抗绕过策略。

由于招致了反病毒软件的一些批评,微软开始开放一些接口用于反病毒软件。

绕过

[2]介绍了一种64位下回调函数的实现监控方案,利用PsSetCreateProcessNotifyRoutineEx监控

[3]介绍了各个版本的绕过方案

参考

[1] https://en.wikipedia.org/wiki/Kernel_Patch_Protection

[2] https://mp.weixin.qq.com/s/UXFe5Zm9vd5rNBUXU23nbw

[3] http://uninformed.org/index.cgi?o=about