==== 本段更新于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 Vi