找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 10142|回复: 7

虚拟机检测

  [复制链接]

5

主题

39

回帖

1

精华

铂金会员

积分
1567
发表于 2011-1-4 23:33:15 | 显示全部楼层 |阅读模式
分别用几种方法来实现的,有兴趣可以看下。
感觉在加上病毒变异技术的话,那就可以躲过杀软了。。。
.386
.model flat,stdcall
option casemap:none

include INVM.inc
                .const
               
                .data
                g_vm_0                db        'VMXh',0
                g_title                db        '这种检测的位置比较多,但是具有不同的针对性,这里就不检测了',0
                g_vm_1                db        'VX',0
                g_msg_suc        db        'in vm!',0
                g_msg_fal        db        'out vm!',0
                g_dbg_0                db        '%x',0
                g_rc                db        0
                .code

start:

        invoke GetModuleHandle,NULL
        mov    hInstance,eax
        invoke GetCommandLine
        mov                CommandLine,eax
        invoke InitCommonControls
        invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
        invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShowWORD
        LOCAL        wc:WNDCLASSEX
        LOCAL        msg:MSG

        mov                wc.cbSize,sizeof WNDCLASSEX
        mov                wc.style,CS_HREDRAW or CS_VREDRAW
        mov                wc.lpfnWndProc,offset WndProc
        mov                wc.cbClsExtra,NULL
        mov                wc.cbWndExtra,DLGWINDOWEXTRA
        push        hInst
        pop                wc.hInstance
        mov                wc.hbrBackground,COLOR_BTNFACE+1
        mov                wc.lpszMenuName,IDM_MENU
        mov                wc.lpszClassName,offset ClassName
        invoke LoadIcon,NULL,IDI_APPLICATION
        mov                wc.hIcon,eax
        mov                wc.hIconSm,eax
        invoke LoadCursor,NULL,IDC_ARROW
        mov                wc.hCursor,eax
        invoke RegisterClassEx,addr wc
        invoke CreateDialogParam,hInstance,IDD_DIALOG,NULL,addr WndProc,NULL
        invoke ShowWindow,hWnd,SW_SHOWNORMAL
        invoke UpdateWindow,hWnd
        .while TRUE
                invoke GetMessage,addr msg,NULL,0,0
          .BREAK .if !eax
                invoke TranslateMessage,addr msg
                invoke DispatchMessage,addr msg
        .endw
        mov                eax,msg.wParam
        ret

WinMain endp


gdt_                struct
        limit        word                ?
        baselo        word                ?
        basehi        word                ?
gdt_                ends
ldt_gdt                proc
        LOCAL        gdt:gdt_
        sgdt        gdt
        mov        ax,gdt.basehi
        shr        ax,8
        cmp        al,0ffh       
        jnz        @f
        mov        eax,1
        ret
        @@:
        xor        eax,eax
        ret
ldt_gdt         endp

str_test        proc
       
        LOCAL        mem[4]:byte
        pushad
        str word ptr mem[0]
        .if mem[0] == 00h && mem[1] == 40h
       
        popad
        mov eax,1
        ret
               
        .endif
        popad
        xor eax,eax
        ret

str_test endp

time                proc
       
        pushad
        db        0fh,31h;;RDTSC
          xchg   ecx, eax
          db        0fh,31h
          sub    eax, ecx
          cmp    eax, 0FFh
          jg        Detected
          popad
          xor         eax,eax
          ret
        Detected:
        popad
          mov        eax,1
          ret

time endp

idt_                struct
        limit                word                ?
        baselo                word                ?
        basehi                word                ?
idt_                 ends
redpill                proc
        LOCAL        idt:idt_
        sidt        idt
        cmp        idt.basehi,0d000h
        jbe        @f
        mov        eax,1
        ret
@@:
        xor        eax,eax
       
        ret

redpill endp
other                proc
       
        ;;这里检测的方法很多。具体要看你收集的特征码了。比如注册表。。。。
        ret

other endp
WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

        mov                eax,uMsg
        .if eax==WM_INITDIALOG
                push        hWin
                pop                hWnd
        .elseif eax==WM_COMMAND
                mov                eax,wParam
                and                eax,0FFFFh
                .if eax==IDM_FILE_EXIT
                        invoke SendMessage,hWin,WM_CLOSE,0,0
                .elseif eax==IDM_HELP_ABOUT
                        invoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL
               
                       
                .elseif eax==1002
                        ;;idt&gdt检测
                        call ldt_gdt
                        .if        eax==1
                                invoke MessageBox,NULL,offset g_msg_suc,NULL,0
                        .elseif
                                invoke MessageBox,NULL,offset g_msg_fal,NULL,0
                        .endif
                       
                       
                .elseif eax==1003
                        ;;str检测
                        call str_test
                        .if        eax==1
                                invoke MessageBox,NULL,offset g_msg_suc,NULL,0
                        .elseif
                                invoke MessageBox,NULL,offset g_msg_fal,NULL,0
                        .endif
                .elseif eax==1004
                        ;;时间差检测
                        call time
                        .if        eax==1
                                invoke MessageBox,NULL,offset g_msg_suc,NULL,0
                        .elseif
                                invoke MessageBox,NULL,offset g_msg_fal,NULL,0
                        .endif
                .elseif eax==1005
                        ;;特征检测
                        invoke MessageBox,NULL,offset g_title,NULL,0
                .elseif eax == 1006
                        call redpill
                        .if        eax==1
                                invoke MessageBox,NULL,offset g_msg_suc,NULL,0
                        .elseif
                                invoke MessageBox,NULL,offset g_msg_fal,NULL,0
                        .endif
                       
                .endif
;        .elseif eax==WM_SIZE
        .elseif eax==WM_CLOSE
                invoke DestroyWindow,hWin
        .elseif uMsg==WM_DESTROY
                invoke PostQuitMessage,NULL
        .else
                invoke DefWindowProc,hWin,uMsg,wParam,lParam
                ret
        .endif
        xor    eax,eax
        ret

WndProc endp

end start

评分

参与人数 1 +20 +20 水晶币 +20 +20 收起 理由
Tesla.Angela + 20 + 20 + 20 + 20 精品文章

查看全部评分

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-1-5 20:42:21 | 显示全部楼层
据说有个方法是测试指令时间。

40

主题

324

回帖

0

精华

铂金会员

Eax=0

积分
1575
发表于 2011-3-16 12:14:40 | 显示全部楼层
:L=:L
=:D
还得手动转换...
不过确实是精品!
Do my best.

40

主题

324

回帖

0

精华

铂金会员

Eax=0

积分
1575
发表于 2011-3-16 12:18:36 | 显示全部楼层
帮你修正该死的表情符号:
  1. .386
  2. .model flat,stdcall
  3. option casemap:none

  4. include INVM.inc
  5.                 .const
  6.                
  7.                 .data
  8.                 g_vm_0                db        'VMXh',0
  9.                 g_title                db        '这种检测的位置比较多,但是具有不同的针对性,这里就不检测了',0
  10.                 g_vm_1                db        'VX',0
  11.                 g_msg_suc        db        'in vm!',0
  12.                 g_msg_fal        db        'out vm!',0
  13.                 g_dbg_0                db        '%x',0
  14.                 g_rc                db        0
  15.                 .code

  16. start:

  17.         invoke GetModuleHandle,NULL
  18.         mov    hInstance,eax
  19.         invoke GetCommandLine
  20.         mov                CommandLine,eax
  21.         invoke InitCommonControls
  22.         invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
  23.         invoke ExitProcess,eax

  24. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
  25.         LOCAL        wc:WNDCLASSEX
  26.         LOCAL        msg:MSG

  27.         mov                wc.cbSize,sizeof WNDCLASSEX
  28.         mov                wc.style,CS_HREDRAW or CS_VREDRAW
  29.         mov                wc.lpfnWndProc,offset WndProc
  30.         mov                wc.cbClsExtra,NULL
  31.         mov                wc.cbWndExtra,DLGWINDOWEXTRA
  32.         push        hInst
  33.         pop                wc.hInstance
  34.         mov                wc.hbrBackground,COLOR_BTNFACE+1
  35.         mov                wc.lpszMenuName,IDM_MENU
  36.         mov                wc.lpszClassName,offset ClassName
  37.         invoke LoadIcon,NULL,IDI_APPLICATION
  38.         mov                wc.hIcon,eax
  39.         mov                wc.hIconSm,eax
  40.         invoke LoadCursor,NULL,IDC_ARROW
  41.         mov                wc.hCursor,eax
  42.         invoke RegisterClassEx,addr wc
  43.         invoke CreateDialogParam,hInstance,IDD_DIALOG,NULL,addr WndProc,NULL
  44.         invoke ShowWindow,hWnd,SW_SHOWNORMAL
  45.         invoke UpdateWindow,hWnd
  46.         .while TRUE
  47.                 invoke GetMessage,addr msg,NULL,0,0
  48.           .BREAK .if !eax
  49.                 invoke TranslateMessage,addr msg
  50.                 invoke DispatchMessage,addr msg
  51.         .endw
  52.         mov                eax,msg.wParam
  53.         ret

  54. WinMain endp


  55. gdt_                struct
  56.         limit        word                ?
  57.         baselo        word                ?
  58.         basehi        word                ?
  59. gdt_                ends
  60. ldt_gdt                proc
  61.         LOCAL        gdt:gdt_
  62.         sgdt        gdt
  63.         mov        ax,gdt.basehi
  64.         shr        ax,8
  65.         cmp        al,0ffh        
  66.         jnz        @f
  67.         mov        eax,1
  68.         ret
  69.         @@:
  70.         xor        eax,eax
  71.         ret
  72. ldt_gdt         endp

  73. str_test        proc
  74.         
  75.         LOCAL        mem[4]:byte
  76.         pushad
  77.         str word ptr mem[0]
  78.         .if mem[0] == 00h && mem[1] == 40h
  79.         
  80.         popad
  81.         mov eax,1
  82.         ret
  83.                
  84.         .endif
  85.         popad
  86.         xor eax,eax
  87.         ret

  88. str_test endp

  89. time                proc
  90.         
  91.         pushad
  92.         db        0fh,31h;;RDTSC
  93.           xchg   ecx, eax
  94.           db        0fh,31h
  95.           sub    eax, ecx
  96.           cmp    eax, 0FFh
  97.           jg        Detected
  98.           popad
  99.           xor         eax,eax
  100.           ret
  101.         Detected:
  102.         popad
  103.           mov        eax,1
  104.           ret

  105. time endp

  106. idt_                struct
  107.         limit                word                ?
  108.         baselo                word                ?
  109.         basehi                word                ?
  110. idt_                 ends
  111. redpill                proc
  112.         LOCAL        idt:idt_
  113.         sidt        idt
  114.         cmp        idt.basehi,0d000h
  115.         jbe        @f
  116.         mov        eax,1
  117.         ret
  118. @@:
  119.         xor        eax,eax
  120.         
  121.         ret

  122. redpill endp
  123. other                proc
  124.         
  125.         ;;这里检测的方法很多。具体要看你收集的特征码了。比如注册表。。。。
  126.         ret

  127. other endp
  128. WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

  129.         mov                eax,uMsg
  130.         .if eax==WM_INITDIALOG
  131.                 push        hWin
  132.                 pop                hWnd
  133.         .elseif eax==WM_COMMAND
  134.                 mov                eax,wParam
  135.                 and                eax,0FFFFh
  136.                 .if eax==IDM_FILE_EXIT
  137.                         invoke SendMessage,hWin,WM_CLOSE,0,0
  138.                 .elseif eax==IDM_HELP_ABOUT
  139.                         invoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL
  140.                
  141.                         
  142.                 .elseif eax==1002
  143.                         ;;idt&gdt检测
  144.                         call ldt_gdt
  145.                         .if        eax==1
  146.                                 invoke MessageBox,NULL,offset g_msg_suc,NULL,0
  147.                         .elseif
  148.                                 invoke MessageBox,NULL,offset g_msg_fal,NULL,0
  149.                         .endif
  150.                         
  151.                         
  152.                 .elseif eax==1003
  153.                         ;;str检测
  154.                         call str_test
  155.                         .if        eax==1
  156.                                 invoke MessageBox,NULL,offset g_msg_suc,NULL,0
  157.                         .elseif
  158.                                 invoke MessageBox,NULL,offset g_msg_fal,NULL,0
  159.                         .endif
  160.                 .elseif eax==1004
  161.                         ;;时间差检测
  162.                         call time
  163.                         .if        eax==1
  164.                                 invoke MessageBox,NULL,offset g_msg_suc,NULL,0
  165.                         .elseif
  166.                                 invoke MessageBox,NULL,offset g_msg_fal,NULL,0
  167.                         .endif
  168.                 .elseif eax==1005
  169.                         ;;特征检测
  170.                         invoke MessageBox,NULL,offset g_title,NULL,0
  171.                 .elseif eax == 1006
  172.                         call redpill
  173.                         .if        eax==1
  174.                                 invoke MessageBox,NULL,offset g_msg_suc,NULL,0
  175.                         .elseif
  176.                                 invoke MessageBox,NULL,offset g_msg_fal,NULL,0
  177.                         .endif
  178.                         
  179.                 .endif
  180. ;        .elseif eax==WM_SIZE
  181.         .elseif eax==WM_CLOSE
  182.                 invoke DestroyWindow,hWin
  183.         .elseif uMsg==WM_DESTROY
  184.                 invoke PostQuitMessage,NULL
  185.         .else
  186.                 invoke DefWindowProc,hWin,uMsg,wParam,lParam
  187.                 ret
  188.         .endif
  189.         xor    eax,eax
  190.         ret

  191. WndProc endp

  192. end start
复制代码
Do my best.

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2012-4-25 09:37:44 | 显示全部楼层
这种宏汇编代码,看着真别扭。

1

主题

60

回帖

0

精华

铜牌会员

积分
122
发表于 2013-1-11 00:46:54 | 显示全部楼层
时间差检测。。。

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-4-27 10:32:24 | 显示全部楼层
看的眼花缭乱*_*!

0

主题

26

回帖

0

精华

贵宾会员

积分
534
发表于 2017-3-20 09:46:27 | 显示全部楼层
学习····················
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表