首页
社区
课程
招聘
未解决 [求助]Vt Ept hook中,开启MTF位后系统卡死
发表于: 2020-8-11 23:56 8417

未解决 [求助]Vt Ept hook中,开启MTF位后系统卡死

2020-8-11 23:56
8417

问题:开启MTF后,CPU本应回到GuestRip处继续执行代码,却意外的跑到了另外一个不相干的地方,并陷入了死循环,如断线的风筝,再也无法返回到GuestRip处.
(关闭MTF才能回去)

//这条指令既需要执行权限,又需要读取权限
AddressA ff25 00000000 jmp qword [AddressB]
AddressB xxxxxxxx~xxxxxxxx

 

ept hook中 , 因"ff25 00000000 (jmp qword [nexet])"这条指令既需要读权限 , 又需要执行权限,所以产生VmExitEptViolation ,

 

此时给这个页面 读+写+执行的权限 , 然后记录rip值,称为vRip , 并开启了MTF ;

 

之后触发VmExitMTF,取rip值,称为mRip ;

 

比较vRip和mRip的值发现 , 他俩始终不在同一个物理页上 , 此时系统卡死,但windbg可以正常下断 ,.

 

理想状态下,当是在MTF处理函数中,判断当前Rip是否为ff25 00000000指令所在的地址,是的话才将这一个物理页的pte改成只可执行,

 

可实际情况是,这一命题根本不成立,

 

也就是说开启MTF后 , "ff25 00000000"这段代码并没有得到执行 , 而是在执行某些不相关的代码并陷入了死循环.

 

而一旦关掉MTF , 才会正常的去执行"ff25 00000000"指令.

VmExitEptViolation函数部分代码:
//判断是否为因 读写不可读写的页导致的EptViolation
if (data.eptViolation.readAccess || data.eptViolation.writeAccess)
{    
  //判断是否是因为ff25 00000000指令导致的EptViolation
    if(PAGE_ALIGN(UtilVaToPa((void*)rip)) ==  PAGE_ALIGN(UtilVaToPa(phData->hookData->orgFuncAddr)))
    {
        DbgBreakPoint();
        //由于ff25 00000000 hook,导致这条指令同时需要读和执行权限
        phData->hookedPte->fields.readAccess = true;
        phData->hookedPte->fields.writeAccess = true;
        phData->hookedPte->fields.executeAccess = true;
        phData->hookedPte->fields.memoryType = kWriteBack;
        //将MTF位置1
        VmSetMonitorTrapFlag(true);
        //保存Rip
        g_phData[i].violationRip = rip;
    }
}

不知为什么会发生这种情况? 难道开启MTF后,还有其他什么需要注意的吗?


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
FF25同时需要读和执行权限
2020-8-12 10:43
0
雪    币: 660
活跃值: (2080)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
3
hzqst FF25同时需要读和执行权限
是啊,怎么解决啊
2020-8-12 12:35
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
FeJQ 是啊,怎么解决啊
mov rax, address
jmp rax
2020-8-12 14:12
0
雪    币: 660
活跃值: (2080)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
5
hzqst mov rax, address jmp rax
那如果Hook某一处crc检测,他里面也读取当前页,怎么办
2020-8-12 14:40
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
FeJQ 那如果Hook某一处crc检测,他里面也读取当前页,怎么办
那就换个地方hook
2020-8-12 14:41
0
雪    币: 0
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
问一下这个问题解决了吗
2020-9-28 19:45
0
雪    币: 660
活跃值: (2080)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
8
wx_Frank_339890 问一下这个问题解决了吗
没有.改成 
push addressLow
mov [rsp+4],addressHigh
ret
这种方式了
2020-9-29 19:58
1
雪    币: 5283
活跃值: (4758)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
FeJQ 没有.改成 push addressLow mov [rsp+4],addressHigh ret 这种方式了
不错,正在为此头疼,mov rax,address jmp rax,此方法不靠谱会出错
2021-12-12 15:23
0
雪    币: 126
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
如果你是通过 monitor trap flag = 1 开启的MTF,当 VM-exit 时,Guest-RIP 应该指向的是下一条指令,不是当前引发异常的指令。如果你是通过事件注入的 MTF(VM-entry interruption-information field—event type = 7,vector = 0),则 Guest-RIP 指向引发异常的那条指令。
欢迎指正~
2024-1-23 10:27
0
游客
登录 | 注册 方可回帖
返回
//