==== 本段更新于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,想了两天这个问题,没有头绪,求助看雪诸位大佬,求指点
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!