看雪论坛
发新帖
1

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

karlx 2017-9-4 20:05 757
==== 本段更新于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,想了两天这个问题,没有头绪,求助看雪诸位大佬,求指点
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (10)
10
cvcvxk 2017-9-4 20:11
2
因为执行代码本身要改写自身...
1
karlx 2017-9-5 13:31
3
cvcvxk 因为执行代码本身要改写自身...
感谢指导,代码自己X自己的逻辑问题已经修复,然而依然会被检测到。
详情见帖子,我重新编辑了一下,增加了新的测试结果
hzqst 2017-9-5 23:46
4
有尝试过换一个hook点么?
yy虫子yy 2017-9-6 00:16
5
以Read/Write作为检测的方式早已经过时
ugvjewxf 2017-9-6 09:36
6
换一个地方HOOK,看下还会不会补检测到?       
1
karlx 2017-9-7 18:24
7
hzqst 有尝试过换一个hook点么?
试过  结果一样 
我在考虑改成改成  禁止exec  的可能性
1
karlx 2017-9-7 18:24
8
yy虫子yy 以Read/Write作为检测的方式早已经过时
可以简单说说提供下方向么
hzqst 2017-9-7 19:30
9
karlx 试过 结果一样 我在考虑改成改成 禁止exec 的可能性
同一个page自己读写自己代码的情况你考虑了没有
这时候你如果不给rwx权限,只给个x权限,就爆炸了
1
karlx 2017-9-9 16:59
10
hzqst 同一个page自己读写自己代码的情况你考虑了没有 这时候你如果不给rwx权限,只给个x权限,就爆炸了
肯定会给读写权限 
并且无论rw到x  还是x到rw
我都会把rw页面内容拷贝到x页面
.同时监控ept  voilation  发现并没有读写的行为
1
karlx 8小时前
11
hzqst 同一个page自己读写自己代码的情况你考虑了没有 这时候你如果不给rwx权限,只给个x权限,就爆炸了
已经搞定,看来在处理EptViolation的时候用GuestPhysicalAddress才是一个靠谱的选择;
仿照HP用GuestLinerAddress真的会悲剧。
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 微信公众号:ikanxue
Time: 0.071, SQL: 9 / 京ICP备10040895号-17