分享

如何判断一个程序,是否当前运行在虚拟机中,而不是我现在用的电脑?

 quasiceo 2014-08-11
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 
豆腐
关注
豆腐
豆腐
等级:Blank
#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 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约