当前位置: 首页 > 工具软件 > R3 Query > 使用案例 >

ept技术_[讨论]R3检测EPT方式HOOK页面的方案(20170919更新-已解决)

邵献
2023-12-01

==== 本段更新于20170919 ====

1.感谢hzqst、v校在这一过程中提供的帮助

2.问题根源在于,检测进程将我HOOK的内存页映射到自己的内存空间;

不同VA映射相同PA时,然后被XXOO

所以 在处理EptViolation的时候,唯一靠谱的就是Lock之后的GuestPhysicalAddress

我之前使用GuestLinerAddress进行判断,所以就悲剧了。

==== 本段更新于20170905 ====

根据1L V校提供的思路,我又做了如下两种测试:

0. 备份Hook页面,原始页面为RW页,备份页面为X页,备份页不进行任何修改(不做HOOK仅测试);

响应EPT Violation时,如果是从RW切换到X,则将RW页面拷贝到X页面;

这样从理论上讲, 如果遇到  xor [code + offset], XX 之类,直接自己X自己代码的情况,可以保证读写页和执行页相同;

我自己用Demo程序测试,确认无论如果自身修改自己的代码,RW页面的修改可以同步到X页面上。

然而结果,直接扑街,依旧被检测到;

1. 不进行备份,只对EptEntry的WriteAccess、ReadAccess进行修改;

进一步缩小可能存在检测的范围,无论读写还是执行,均返回同一个页面;

只是在相应EPT Violation的时候,修改WriteAccess、ReadAccess;

结果依然扑街。。。

So,这个问题更加神奇了,百思不得其解,求大佬助攻。

=====================================================================================前段时间重写了自己的VT框架,弄了一下R3的EPTHOOK,效果良好。

但是在测试中遇到一个问题,R3的EPT HOOK竟然被XX程序应用层检测到了。

我做了如下测试:

0.检查EPT隐藏效果(确认自身功能正确)

原始页面作为读写页面给检测者去读写,申请新页面作为hook后的执行页面;

无论是程序内按指针读取,还是其他程序ReadProcessMemory,读取到的都是原始页面(读写页)

执行结果确认是Hook过的执行页面

1.检查VirtualQuery/NtQueryVirtualMemory的返回值

经过检查,只要保证触发CopyOnWrite后,改回原来的Protect属性,query的结果还是正常的,不会出现一个0x1000的页面;

2.Hook NtQueryVirtualMemory/NtReadVirtualMemory/NtProtectVirtualMemory

均为发现包含我Hook点范围的操作

3.检测程序驱动

PCHunter查看 不存在驱动

So,想了两天这个问题,没有头绪,求助看雪诸位大佬,求指点

 类似资料: