首页
社区
课程
招聘
[讨论]R3检测EPT方式HOOK页面的方案(20170919更新-已解决)
2017-9-4 20:05 15751

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

2017-9-4 20:05
15751
==== 本段更新于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,想了两天这个问题,没有头绪,求助看雪诸位大佬,求指点

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (18)
雪    币: 8861
活跃值: (2369)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2017-9-4 20:11
2
0
因为执行代码本身要改写自身...
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
karlx 1 2017-9-5 13:31
3
0
cvcvxk 因为执行代码本身要改写自身...
感谢指导,代码自己X自己的逻辑问题已经修复,然而依然会被检测到。
详情见帖子,我重新编辑了一下,增加了新的测试结果
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2017-9-5 23:46
4
0
有尝试过换一个hook点么?
雪    币: 248
活跃值: (3784)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luskyc 2017-9-6 00:16
5
0
以Read/Write作为检测的方式早已经过时
雪    币: 615
活跃值: (445)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ugvjewxf 2017-9-6 09:36
6
0
换一个地方HOOK,看下还会不会补检测到?       
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
karlx 1 2017-9-7 18:24
7
0
hzqst 有尝试过换一个hook点么?
试过  结果一样 
我在考虑改成改成  禁止exec  的可能性
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
karlx 1 2017-9-7 18:24
8
0
yy虫子yy 以Read/Write作为检测的方式早已经过时
可以简单说说提供下方向么
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2017-9-7 19:30
9
0
karlx 试过 结果一样 我在考虑改成改成 禁止exec 的可能性
同一个page自己读写自己代码的情况你考虑了没有
这时候你如果不给rwx权限,只给个x权限,就爆炸了
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
karlx 1 2017-9-9 16:59
10
0
hzqst 同一个page自己读写自己代码的情况你考虑了没有 这时候你如果不给rwx权限,只给个x权限,就爆炸了
肯定会给读写权限 
并且无论rw到x  还是x到rw
我都会把rw页面内容拷贝到x页面
.同时监控ept  voilation  发现并没有读写的行为
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
karlx 1 2017-9-19 18:26
11
0
hzqst 同一个page自己读写自己代码的情况你考虑了没有 这时候你如果不给rwx权限,只给个x权限,就爆炸了
已经搞定,看来在处理EptViolation的时候用GuestPhysicalAddress才是一个靠谱的选择;
仿照HP用GuestLinerAddress真的会悲剧。
雪    币: 712
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whathhh 2019-6-18 17:07
12
0
我的hook也被应用层检测到了,处理EptViolation的时候用的是GuestPhysicalAddress ,不知道什么问题
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
karlx 1 2019-6-20 16:38
13
0
whathhh 我的hook也被应用层检测到了,处理EptViolation的时候用的是GuestPhysicalAddress ,不知道什么问题
我的天 竟然还有人鞭尸这个帖子

话说你好好看看上面内容,还有就是好好看看自己的逻辑有没有问题
雪    币: 712
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whathhh 2019-6-20 16:52
14
0
karlx 我的天 竟然还有人鞭尸这个帖子 话说你好好看看上面内容,还有就是好好看看自己的逻辑有没有问题
我找到了,他用代码执行时间来检测的
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
karlx 1 2019-7-19 18:26
15
0
whathhh 我找到了,他用代码执行时间来检测的
来 我们继续鞭尸。。。 我要没记错 HP有个放缩tsc的功能。。。
雪    币: 1213
活跃值: (1099)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
风铃i 2020-2-15 22:28
16
0
触发CopyOnWrite是指对目标Hook程序的页面吗, 
但是目标程序的页面本身是不应该COW的, 强行触发可以, 但是目标程序退出时, 会留下一个悬空页. 系统不定时检查的时候直接触发 Memory Management蓝屏, 怎么解决啊求教一下
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
karlx 1 2020-4-14 22:56
17
0
风铃i 触发CopyOnWrite是指对目标Hook程序的页面吗, 但是目标程序的页面本身是不应该COW的, 强行触发可以, 但是目标程序退出时, 会留下一个悬空页. 系统不定时检查的时候直接触发 Mem ...
没解决。。。
雪    币: 83
活跃值: (1037)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 2 2020-4-15 01:03
18
0
人家都说了 代码自我修改的时候 你备份页面 必须是rwx属性 不能是x属性
 原始页面:mov rax,[rcx+0x8] 此时不能执行 发生ept异常退出 你host切换到备份页面可以执行 但是这句指令是对自己当前代码页面读写数据 因为当前代码页面不能读写 只能执行 此时会再次发生ept异常退出吗? 我好久没研究vt了 感觉你的思路逻辑好像哪里不对
雪    币: 35
活跃值: (1756)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shuwoa 2023-5-11 07:11
19
0
R3是怎么做到将一块已经存在的内存页映射的其他内存空间的,我一直想搞明白这个技术.
游客
登录 | 注册 方可回帖
返回