|
VT实例-过掉系统下的Int1和Int3断点发表于 2015 年 12 月 20 日 这里做的测试针对XP系统,明天开始测试Win 7和 Win 8 本来以为这会是个很难的问题,没想到一个小时不到就解决了,首先设置异常位图,配置发生Int1和Int3的时候VM-EXIT temp=0xa; // Int 1 Log ( "Setting EXCEPTION_BITMAP", temp ); VMWRITE ( EXCEPTION_BITMAP, temp ); // Exception Bitmap 然后在VM-EXIT处理Int 1和 Int 3 if(ExitReason==0) { ExitInterruptionInformation=VMREAD(VM_EXIT_INTR_INFO); InterruptionVector = (ExitInterruptionInformation & 0xFF ); InterruptionType = ( (ExitInterruptionInformation>>8) & 7); InterruptionValid = ( (ExitInterruptionInformation>>31) & 1); if(InterruptionVector==1){ VMWRITE(VM_ENTRY_INTR_INFO,0); } if(InterruptionVector==3){ VMWRITE(VM_ENTRY_INTR_INFO,0); } _asm { POPAD JMP Resume } } 至于为什么写入VM_ENTRY_INTR_INFO呢,因为Guest系统下的int中断是否执行,主要是有事件注入控制的,bit 31代表其有效位,bit 31置1代表事件注入有效,置0代表无效,所以我这里清零了,测试下,随便一个程序载入OD,按理说OD会在程序入口写入一个Int 3断点,然后中断到那里,但是呢。。。
 至于为什么程序会运行呢,我是这么猜想的,OD写入int 3后,然后触发,此时进入VT,VT把Int 3的事件注入设置无效,然后Resume到Guest系统,此时所有指令执行,程序也就显示了处理 不过我卸载驱动的时候,系统蓝屏,我估计是在卸载处下了断点,然后进入VT,然后返回到下条指令,造成了指令的丢失,明天再弄吧,太冷了。。。。。。。。 文件下载: test 当然了,反过来想,如果正常注入int 1和int 3,就可以正确的在指定地址下段了
|