发表于 2025-1-7 11:55:34 
| 
查看: 1713
| 
回复: 4
 
 
 
1.什么是ETWHOOK? 简单的说就是在有PatchGurad的windows系统上SSDT hook的一种替代方案 2.ETWHOOK实现步骤 (1).替换 HalpPrivatDispatchTable (可以通过MmGetSystemRoutineAddress函数获取)表中的的 EtwpReserveWithPmcCounters 函数指针为自己的代理函数,代理函数的功能是在堆栈中寻找系统调用的目标内核函数指针并且在找到的时候替换它; (2).开启Windows的ETW功能,并且经过一系列的设置使得系统调用时能进入 EtwpReserveWithPmcCounters 函数(经过第一步的操作之后 EtwpReserveWithPmcCounters 已经被替换成自己的代理函数了); 3.代码 (1).HalColleePmcCounts代理函数的实现: (2).最麻烦的是开启ETW功能以及开启ETW子功能PMC计数 .Name), SectionNames, 8) == 8).VirtualAddress + KernelBase;.Misc.VirtualSize & 0xfffff000)) + 0x1000 + StratAdd;   4.具体原理 
而在这里,最好玩的是HalPrivateDispatchTable,这个是windows 的ntoskenl.exe为了方便使用HAL的导出函数,把他们存放在统一的地方。而HAL,用到的地方肯定很多,ETW 正是如此。 
ETW hook原理与C代码实现,附完整源代码
 
 如果说之前无法定位,现在可以通过这个栈上面的magic number来定位系统调用的目标函数的地址,从而替换了。 
而EtwpReserveWithPmcCounters就是这次事件的主角,关键部分代码为: 
ETW hook原理与C代码实现,附完整源代码
 
 图中红圈中的地方就是EtwpReserveWithPmcCounters通过CFG保护的方式调用HalPrivateDispatchTable表中的HalCollectPmcCounters。 
我们替换HalPrivateDispatchTable表中的EtwpReserveWithPmcCounters 函数指针为我们自己的函数 ,在我们自己的函数里就可以在栈上查找并替换系统调用的目标函数从而达到HOOk的目的。 
最后附上完整源代码 
 
 
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【
投诉建议 】板块发帖举报。