无痕HOOK的检测,没看到有人写,那我就抛砖引玉,写几个思路
大家也知道,攻防这个东西就是打个信息差,这些东西一旦被发出来..也就没啥用了,就让我来当这个恶人吧,哈哈哈
下面我将详解若干检测,并附上对抗思路
无痕hook:
基于硬件虚拟化VT-x或者AMD-v的扩展页表(EPT或NPT)功能使读写和执行访问分离进行inline hook操作,表现为执行指令与读取指令不一致
(应用层驱动层hook并无区别,以下的思路不做此区分,代码在最后)
首先了解几个概念:
单步,分支单步, 硬断,页面重映射,接管IDT,接管CR3,指令截断, 执行预测,异常处理,LBR
· 单步: 利用flags寄存器TF标志位实现单步执行,设置后每执行一条指令会陷入向量号为1的中断,即DB中断
· 分支单步 设置MSR_DEBUGCTRL的BTF位及flags寄存器TF标志位即可在执行到跳转指令时才会陷入DB中断(JCC指令判定失败不会触发)
· 硬断: 设置DR寄存器为目标地址以达到访问或者执行会触发DB中断的效果
· 页面重映射: 通过将目标页面重新映射到其他位置以达到规避GVA的判断,或者映射到应用层以利用应用层VEH接管无法回滚的异常
· 接管IDT: 构造一份IDT替换IDTR.base以达到接管无法回滚的异常,防止蓝屏,或检查触发了哪些异常
· 接管CR3: 构造一份仅映射ntos模块以及自身模块还有目标页的页表,用以获取hook handler的地址
· 执行预测; 利用符号执行或者模拟执行对目标指令进行执行预测,中断后对比寄存器或者栈内是否有不应该有的数据
· 指令截断: 即执行时从指令中间开始执行,对比预测执行结果与实际执行结果,以达到探测执行分离的效果
· 异常处理: r0只有SEH,如果存在hook,单步时RIP就会出现偏差,异常回滚会失败导致蓝屏,R3有SEH和VEH,VEH接管全局异常.
· LBR: 即"最后分支记录"可以搭配硬断完成hook handler address的探测
实际上的概念细节实现比较复杂,建议直接看代码,我不再赘述
以上关键词可以自由搭配组合,下面我介绍几种使用方法:

效果:


虽然不会导致蓝屏,但是执行环境毕竟和驱动层有区别,且用且珍惜
利用ZwMapViewOfSection函数将目标地址映射到应用层:
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2025-8-6 18:30
被aljt_糖刀编辑
,原因: 提示