18

[调试逆向] [原创]小试 anti vmware

天易love 2010-4-1 23:50 37225
小试 anti vmware
     今天偶然看到一款绿色版的硬盘专业工具,突然发现可以利用其中的一项功能来实现anti vmware。
  今日事今日毕,那就在今晚12:00之前把这个想法实现吧,let's go!
     我的想法就是检测硬盘的modelnumber,具体什么是modelnumber自己网上搜吧,反正不是硬盘序列号。难点就是在多种操作系统下都要能起到anti vmware的效果。程序在xp、2k、2003下都可以检测到vmware的运行。
    直接贴代码了,如果看不懂也没关系,我也是逆了人家的代码写出来的。Delphi也可以当汇编语言开发工具用,难道不是吗?
    unit Unit1;
        interface       
        uses
          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
          Dialogs, StdCtrls, Buttons;
        type
          TForm1 = class(TForm)
                BitBtn1: TBitBtn;
                procedure BitBtn1Click(Sender: TObject);
                procedure FormClose(Sender: TObject; var Action: TCloseAction);
          private
                { Private declarations }
          public
                { Public declarations }
          end;
       
        var
          Form1: TForm1;
          hDeviceHandle:Thandle;
       
        implementation
       
        {$R *.dfm}
       
        procedure TForm1.BitBtn1Click(Sender: TObject);
        var
                 InBuffer: array[0..$8f] of byte;
                 cb:Cardinal;
                 tmp:Pchar;
        begin
                   hDeviceHandle:=CreateFile('\\.\PHYSICALDRIVE0',$C0000000,$3,nil,OPEN_EXISTING,$8000000,0);
                   ZeroMemory(@InBuffer,sizeof(InBuffer));
                  asm
                          pushad
                          lea ebx,InBuffer
                          xor ecx,ecx
                          mov al,$2c
                          MOV [ebx],al
                          MOV EAX,$200c0000
                          MOV [ebx+4], eax
                          mov al,$01
                          MOV [ebx+8],al
                          mov al,$40
                          MOV [ebx+$c],al
                          MOV EAX,$0001a5E0
                          MOV [ebx+$10], eax
                          mov al,$30
                          MOV [ebx+$18],al
                          mov al,$12
                          MOV [ebx+$1c],al
                          mov al,$40
                          MOV [ebx+$20],al
                          add ecx,ebx
                          add ecx,$50
                          MOV [ebx+$14], ecx
                          popad
                  end;
       
       
                  if DeviceIoControl(hDeviceHandle,$4D014,@InBuffer,$50,@InBuffer,$50,cb,nil) then
                           begin
                                   asm
                                         pushad
                                         lea ebx,InBuffer
                                         add ebx,$58
                                         mov tmp,ebx
                                         popad
                                   end;  //asm
       
                                 if ((pos('vmware',LowerCase(tmp))>0) or (pos('virtual',LowerCase(tmp))>0)) then
                                                showmessage('检测到 VMware Workstation!!!')
                                         else
                                                   showmessage('请在VMware中测试!');
       
                           end;
        end;
       
        procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
        begin
                  closehandle(hDeviceHandle);
        end;
         
        end.
       
        代码很短,但是效果不错。截图几张,留作纪念!

            

                  

                  

       
                                           天易love
                                                          2010-04-01

推荐:论坛大聚会| 看雪安全开发者峰会将于7月21号火热来袭!

上传的附件:
最新回复 (38)
qihoocom 2010-4-1 23:53
2
真麻烦,人家抹一下你就查不到了,还是red pill好用,一行代码搞定
天易love 2010-4-2 00:22
3
那是你发明的吗?楼上的前辈。
风林 2010-4-2 10:16
4


胖子  你人我知道是不错的 也很直爽  但是每次表达方式似乎都"过头"

低调点不行吗???多交点朋友不行吗??总有一天你会明白我说的话的..
Crakme 2010-4-2 11:18
5
不怕前辈笑话
red pill是什么真的不知道
能否科普一下啊
风随雨行 2010-4-2 12:53
6
好文还是要顶顶的~~~
letokmz 2010-4-2 15:20
7
red pill vs 4核cpu
風之痕 2010-4-4 11:47
8
red pill是啥我也不知道.. 大牛解释下?
imdemon 2010-4-4 12:00
9
他说的是这个吗?
http://www.invisiblethings.org/papers/redpill.html
Aker 2010-4-4 13:27
10
检测不怕方法多,多多益善,搂主的方法也很有用
这里有个看得清楚点的redpill,
typedef struct _IDTR
{
        unsigned        Limit                :16;
        unsigned        BaseLo                :16;
        unsigned        BaseHi                :16;

} IDTR;

bool IsInVmware()
{
        bool        bRet = false;
        IDTR        idt_reg = {0};
        __asm
        {
                SIDT        idt_reg
        }

        if (idt_reg.BaseHi > 0xd000)
        {
                bRet = true ;
        }

        return bRet;
}
foxabu 2010-4-4 18:15
11
感谢分享,不过貌似楼上那个是过时的方法了,如果我没有记错,开着vt方式,关闭binary translation基本上很多方法都要失效。

一楼的方法,我不知道是不是楼主原创,但是我在某游戏中看到过这种检测手段。不过那个比较全面而已,不仅仅是检测这一种虚拟机。     

毕竟主流虚拟机有4种,至少这四种还都是可以跑win的。 所以还是挺麻烦的。我觉得貌似现在都学聪明了,开始检测WinDbg了。
海风月影 2010-4-4 18:56
12
换虚拟机吧,别用vmware workstation了
天易love 2010-4-4 22:24
13
本来是想用WINHEX看看虚拟机分区表的,后来发现硬盘MODEL含有VMWARE关键字,正好用来检测虚拟机。只是2000下WINHEX不管用,就逆了一个更强大的硬盘专业工具。别的虚拟机大概换个关键字吧,没试过。
ArcherPlus 2010-4-5 14:00
14
这样的话,应该还有其他硬件信息可以用来一起检测是否虚拟机吧……
hackjack 2010-4-5 14:03
15
大侠。真的那么强悍。
qml 2010-4-8 16:35
16
大牛啊
comealong 2010-4-8 17:05
17
BOOL
DetectVMware(int *Version)
{
    int magic, ver;

    magic = 0;
    ver = 0;

        __try
        {
                __asm
                {
                        push ebx
                        mov  ecx, 0xa
                        mov  edx, 0x5658
                        mov  eax, 0x564d5868
                        in   eax, dx
                        mov  [ver],   eax
                        mov  [magic], ebx
                        pop  ebx
                }
        }
        __except(GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
        {
                return FALSE;
        }
       

    if(magic == 0x564d5868)
    {
        *Version = ver;
        return TRUE;
    }

    return FALSE;
}

int _tmain(int argc, _TCHAR* argv[])
{
        int v;
        if (DetectVMware(&v)) {
                printf("VMWARE: %d\n", v);
        } else
                printf("NOT VMWARE\n");
       
        return 0;
}
bird 2010-4-9 02:40
18
换 VirtualBox  自己改下代码
whtyy 2010-4-9 22:13
19
对抗类而已,无贵*,sidt检测也只是哄下半虚拟化软件。
gohomeiii 2010-4-11 19:42
20
mark 一下!这个很不错!支持楼主了!
这个是硬盘,网卡好像也可以吧?
kagayaki 2010-4-21 02:02
21
支持楼主了!
hezhichun 2010-5-16 09:55
22
ESX可以直接挂载存储的,裸盘映射,VTD可以直接挂载
龙心 2010-5-16 10:50
23
楼主挺厉害的说
刘国华 2010-8-2 21:20
24
天易MM好强,学习了~~~
天易love 2010-8-2 21:42
25
头像不是我,那是我的偶像,楼上的明白不?太雷人了!
cntrump 2010-8-2 22:08
26
运行VM不支持的指令。是不是会简单一点?
ucantseeme 2010-8-3 07:13
27
为什么我在vmprotect里面合适的地方一步一步跟

找不到SIDT、SGDT这两条指令

是不是还有其他的的指令啊
lixupeng 2010-8-4 10:21
28
学习了!
justlovemm 2010-8-4 22:53
29
大侠都810帖了,怎么还这么搞,打叉呢?
天易love 2010-8-4 23:06
30
好象概念不清
cjycompany 2010-8-27 19:02
31
其实VT也有办法检测到,只是很多现在用的机器没有VT,所以没人管吧。
riusksk 2010-8-27 22:22
32
检测虚拟机的方法不外乎四类:
●        搜索虚拟环境中的进程,文件系统,注册表;
●        搜索虚拟环境中的内存
●        搜索虚拟环境中的特定虚拟硬件
●        搜索虚拟环境中的特定处理器指令和功能
天易兄弟的方法应该属于第三类吧!其它IDT、GDT、LDT算是属于第四类。
天易love 2010-8-28 07:47
33
我在虚拟机中用了一款硬件检测工具后有感而发并逆向了它的代码,然后用DELPHI实现的。
ucantseeme 2010-8-28 18:35
34
都是在灌水

我实在不懂怎么去定位类似的代码
kmsmxpro 2010-9-2 09:52
35
好贴,收藏!
JohnH 2011-1-19 21:26
36
挺厉害的,我也打算学delphi,就拿它当范本吧…
wmfeel 2011-1-19 22:12
37
red pill这东西是黑客帝国里边的,blue pill and red pill
webwizard 2011-1-20 02:35
38
关注。学习一下!
gaofengjx 2011-1-20 08:12
39
强悍啊 学习了啊
返回