XP、2k下面,设置T位将使执行之后的指令引发单步中断,代码如下: pushfd or [esp],100h popfd nop //这里就引发中断 但在VPC里面的win2k和win98,popfd执行后并没有把T位置1。 换言之,可以写一段代码来检测是否在VPC中。 mov OldESP,esp push @NotInVPC push fs:[0] mov fs:[0],esp pushfd or [esp],100h popfd nop jmp @InVPC @NotInVPC: mov esp,OldESP pop fs:[0] add esp,4 mov UnderVPC,0 jmp @Exit @InVPC: pop fs:[0] add esp,4 mov UnderVPC,1 @Exit: VPC的这个特点,有好也有不好,对于调试人员来说,这种利用设置T位产生 单步中断的代码不再起作用,使调试工作相对简单了一点,但同时也会失去 程序的流程。对于编程人员来说,在VPC里面就不能用直接设置T位的办法产 生单步中断了。如果真要设置,其中一个办法就是利用SEH,让操作系统来设置: PUSH @Seh PUSH DWORD PTR FS:[0] MOV DWORD PTR FS:[0],ESP INT3 @Seh: MOV EAX,DWORD PTR SS:[ESP+C] MOV DWORD PTR DS:[EAX+B8],@NewEIP OR DWORD PTR DS:[EAX+C0],100 XOR EAX,EAX RETN @NewEIP: POP DWORD PTR FS:[0] //单步中断 ADD ESP,4 操作系统:winXP/win2k,VPC版本:2004 VPC操作系统:win2K/win98 |
#5 得分:100 回复于: 2006-08-08 17:19:51 ; ***************************************************** ; * 检测 VMMVARE * ; ***************************************************** MAGIC equ 564D5868h ;VMXh CMD_PARAM equ 0 CMD_NUM equ 0Ah PORT_NUM equ 5658h ;VX CHK_VMMVARE: pushad assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT xor esi, esi lea eax,[esp-8] xchg eax, dword ptr fs:[esi] call @F CHK_VMMVARE_SEH PROC C uses ebx esi edi pExcept,pFrame,pContext,pDispatch xor eax,eax mov esi,pExcept mov edi,pContext test [esi].ExceptionFlags,7 jne _continue_search cmp [esi].ExceptionCode,STATUS_PRIVILEGED_INSTRUCTION jne _continue_search inc [edi].regEip ;eip++ jmp _pure_exit _continue_search: inc eax _pure_exit: ret CHK_VMMVARE_SEH ENDP @@: push eax MOV EAX,MAGIC MOV EBX,CMD_PARAM MOV ECX,CMD_NUM MOV DX,PORT_NUM IN EAX,DX XOR EAX,EAX ;unistall SEH frame pop fs:[eax] add esp,4 CMP EBX,MAGIC JNZ @F INC EAX @@: test eax, eax .if !zero? jmp @import_bute_exit; exit .endif assume esi:nothing,edi:nothing popad CHK_VMMVARE_END: ret |
联系客服