文章目录
- 概述
- 分析过程
- 参考资料
概述
ETW是操作系统为了对系统调用、异常等信息做了一个日志操作,本质就是在进行调用这些中断、异常、系统调用时会走向这个代码函数区域日志保存的功能。而ETW HOOK就是在驱动层微软的PatchGuard并未对其做到很好的检测,以致于可以通过patch某些函数达到HOOK的目的,再加上系统调用、异常、上下文切换等都会经过这个,故功能也十分强大
分析过程
代码详见参考资料中,原理很简单但是自己去追一遍并且能够独自发现这种能够过PG的方法属实困难。
首先通过微软提供的ETW文档用例可以得出如何构建相应的结构体进行函数的系统调用,进而实现对日志的开启、关闭、更新等操作,当然可以更深程度的对其进行逆向分析追踪到ZwTraceControl调用其构建过程,此处过程较为简单省略不写,这样我们就能搭建好一个ETW的开启关闭等功能。
随后以一个简单的系统调用为例,通过逆向分析最终发现其在开启的日志的情况下会调用PerfInfoLogSysCallEntry
然后最终会调用到EtwpReserveTraceBuffer
通过分析发现其最终会调用传进来的函数指针GetCpuClock函数
其中a1的来源如下,由一个全局变量得来
于是乎关于InfinityHook的代码便油然而生,通过定位到这个全局变量,并找到相应的WmiContext,修改调用它的成员GetCpuClock函数这样就可以实现内核Hook的功能且不会发生PG保护,具体做法参考源码。首先源码对之前分析的NtTraceControl做了一次调用,使其环境中开启日志
随后通过特征码定位获取到相应所需的变量值,如CkclWmiLoggerContext、SystemCallEntry地址等,为后续使用做铺垫
最后通过之前获取到的全局变量CkclWmiLoggerContext定位到GetCpuClock并将其覆盖完成HOOK
那么他的HOOK又是如何写的呢?我们继续往下看吧,首先当执行到HOOK的点时已经发生了系统调用,那么通过获取当前的堆栈,再通过两个特征码定位到目标位置,进而拿到系统调用的描述符和函数
这两个特征码分别对应的就是之前逆向分析时EtwpTraceKernelEvent
的两个参数,故此整个的ETW HOOK分析完毕
参考资料
ETW HOOK原理探析
剖析 InfinityHook 原理 掀起一场更激烈的攻与防恶战
InfinityHook