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
|
|