能力值:
( LV5,RANK:70 )
|
-
-
2 楼
把异常注入回去。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
能不能麻烦把注入的过程说的具体一点?还有,究竟是哪种缺页异常,比如是改写只读页面,还是执行不可执行页面等,应该如何判断呢?谢谢啦~
|
能力值:
( LV5,RANK:70 )
|
-
-
4 楼
缺页异常无法判断是读还是写造成的,只能判断是不是执行错误或者是读写错误。
VMX_VMCS_RO_EXIT_QUALIFICATION 是不是 VMX_VMCS64_GUEST_RIP
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
“VMX_VMCS_RO_EXIT_QUALIFICATION”和“ VMX_VMCS64_GUEST_RIP”我都没有在intel手册和vmm源码中找到,请问如果想判断是执行错误还是读写错误应该通过哪个域来判断?
|
能力值:
( LV5,RANK:70 )
|
-
-
6 楼
#define VMX_VMCS_RO_EXIT_QUALIFICATION 0x6400
#define VMX_VMCS_RO_IO_RIP 0x6408
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
找到这两个域了,非常感谢~~
我看到intel手册里关于异常回注部分,说要将vm-exit interruption information写入vm-entry interruption information,将vm-exit interruption error-code 写入vm-entry exception error-code,然后执行vmresume。 我按照这个意思在异常处理函数中相应的写了三条语句,不过系统崩溃了。 还请指导一下,回注的具体处理过程~~
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
VMM也落后了,会被猥琐的方式检测到,SMM才厉害
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
smm是什么?
|
能力值:
( LV5,RANK:70 )
|
-
-
10 楼
请贴代码
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
static BOOLEAN NTAPI VmxDispatchException (
PCPU Cpu,
PGUEST_REGS GuestRegs,
PNBP_TRAP Trap,
BOOLEAN WillBeAlsoHandledByGuestHv
)
{
ULONG64 uIntrInfo, vector;
if (!Cpu || !GuestRegs)
return TRUE;
uIntrInfo = VmxRead (VM_EXIT_INTR_INFO);
if((uIntrInfo & INTR_INFO_VALID_MASK)==0)
{
_KdPrint (("VmxDispatchException(): invalid\n"));
return TRUE;
}
vector = uIntrInfo & INTR_INFO_VECTOR_MASK;
if ((uIntrInfo & INTR_INFO_NMI_UNBLOCKED_BY_IRET) &&
!(VmxRead(IDT_VECTORING_INFO_FIELD) & INTR_INFO_VALID_MASK) &&
(vector != TRAP_double_fault) )
{
VmxWrite(GUEST_INTERRUPTIBILITY_INFO,
VmxRead(GUEST_INTERRUPTIBILITY_INFO)|VMX_INTR_SHADOW_NMI);
}
if (vector == TRAP_page_fault)
{
VmxWrite(VM_ENTRY_EXCEPTION_ERROR_CODE,
VmxRead(VM_EXIT_INTR_ERROR_CODE));
VmxWrite(VM_ENTRY_INTR_INFO_FIELD, VmxRead (VM_EXIT_INTR_INFO));
VmxResume();
}
return TRUE;
}
是在bluepill的源码里改的,bluepill公开源码里注册了异常处理函数,但是没有针对page fault的处理,参考了一下xen的vmx_vmexit_handler()函数,不过挺多没看明白的。
最后编译生成的是Windows驱动程序,目前仅能运行在64位Windows Server 2003上,我的处理器是Intel Core2 Quad Q6600 2.4GHz。上面的代码运行后会蓝屏。
异常回注的具体实现还请帮忙指导~~非常感谢!!
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
mark
|
能力值:
( LV5,RANK:70 )
|
-
-
13 楼
把CR2写回去.还有RIP 重新填充VM_ENTRY_INTR_INFO_FIELD 结构.直接使用好像会有问题
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
VMCS结构里既没有GUEST_CR2这个域,又没有HOST_CR2这个域,请问,把CR2写回去是指把什么值写到CR2寄存器中?
|
能力值:
( LV12,RANK:760 )
|
-
-
15 楼
贴个代码
其实很简单
ErrorCode = _ReadVMCS(VM_EXIT_INTR_ERROR_CODE);
ExitQualification = _ReadVMCS(EXIT_QUALIFICATION);
_SetCr2(ExitQualification);
_WriteVMCS(VM_ENTRY_EXCEPTION_ERROR_CODE, ErrorCode);
InjectEvent = 0;
pInjectEvent->Vector = PAGE_FAULT_EXCEPTION;
pInjectEvent->InterruptionType = HARDWARE_EXCEPTION;
pInjectEvent->DeliverErrorCode = 1;
pInjectEvent->Valid = 1;
_WriteVMCS(VM_ENTRY_INTR_INFO_FIELD, InjectEvent);
_WriteVMCS(GUEST_RIP, _ReadVMCS(GUEST_RIP));
|
能力值:
( LV5,RANK:70 )
|
-
-
16 楼
你贴我的代码! 要引导嘛 直接贴代码 人家也看不懂什么个意思!
|
能力值:
( LV12,RANK:760 )
|
-
-
17 楼
引导半天没见效果啊,所以还是贴一下的好。
|
能力值:
( LV9,RANK:200 )
|
-
-
18 楼
diy老板 好有耐心啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
非常感谢!
还有三个问题不明白:
1、_SetCr2()函数的功能是否为将ExitQualification的值写入CR2寄存器?
2、pInjectEvent结构体定义是什么样的?在将异常注入回Guest OS的过程中何时用到了pInjectEvent?
3、为什么向VM_ENTRY_INTR_INFO_FIELD域写入0?
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
哈哈~感谢引导,都怪我太笨了,一直有问题不明白~~
|
能力值:
( LV5,RANK:70 )
|
-
-
21 楼
前两个问题涉及太多 可以自己百度下CR寄存器的用途 跟VM_ENTRY_INTR_INFO_FIELD结构.
第三个问题答案是,清空结构
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
关于_SetCr2()我的理解是:
在发生缺页异常时,exit_qualification域包含引起该异常的线性地址,而CR2寄存器是用来保存引起异常的线性地址的,所以,在将异常回注的时候,要将exit_qualification域的值写入CR2寄存器。
不知道我理解的是否正确?
|
|
|