问题:开启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后,还有其他什么需要注意的吗?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)