wedday
驱动牛犊
驱动牛犊
  • 注册日期2007-08-02
  • 最后登录2009-04-03
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望26点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:6739回复:21

如何判断程序的执行环境是VM

楼主#
更多 发布于:2007-12-28 10:11
    小弟做程序的时候需要判断程序的执行环境,能不能提示下怎么样判断一程序是在VMWare或VirtuaPC中执行,谢谢。

最新喜欢:

cnmv6cnmv6
ljh1021
驱动小牛
驱动小牛
  • 注册日期2007-05-30
  • 最后登录2010-05-18
  • 粉丝0
  • 关注0
  • 积分936分
  • 威望126点
  • 贡献值0点
  • 好评度92点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-12-28 13:27
来段老V的代码  很古老的
抗VM分析
   mov     ecx, 0Ah         ; CX=function# (0Ah=get_version)
       mov     eax, 'VMXh'   ; EAX=magic
       mov     dx, 'VX'           ; DX=magic
       in      eax, dx              ; specially processed io cmd
    ; output: EAX/EBX/ECX = data
       cmp     ebx, 'VMXh'   ; also eax/ecx modified (maybe vmw/os ver?)
       je      under_VMware
消灭人类暴政,世界属于三体!
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-12-28 13:29
vm backdoor~

其实检查vmware还是很简单的~无数中方法~
驱动开发者 呵呵
v1rus
驱动牛犊
驱动牛犊
  • 注册日期2007-09-30
  • 最后登录2018-03-19
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-28 14:49
bool IsInsideVMWare()
{
  bool rc = true;

  __try
  {
    __asm
    {
      push   edx
      push   ecx
      push   ebx

      mov    eax, 'VMXh'
      mov    ebx, 0 // any value but not the MAGIC VALUE
      mov    ecx, 10 // get VMWare version
      mov    edx, 'VX' // port number

      in     eax, dx // read port
                     // on return EAX returns the VERSION
      cmp    ebx, 'VMXh' // is it a reply from VMWare?
      setz   [rc] // set return value

      pop    ebx
      pop    ecx
      pop    edx
    }
  }
  __except(EXCEPTION_EXECUTE_HANDLER)
  {
    rc = false;
  }

  return rc;
}


bool IsInsideVPC()
{
  bool rc = false;

  __try
  {
    _asm push ebx
    _asm mov  ebx, 0 // Flag
    _asm mov  eax, 1 // VPC function number

    // call VPC
    _asm __emit 0Fh
    _asm __emit 3Fh
    _asm __emit 07h
    _asm __emit 0Bh

    _asm test ebx, ebx
    _asm setz [rc]
    _asm pop ebx
  }
  // The except block shouldn't get triggered if VPC is running!!
  __except(IsInsideVPC_exceptionFilter(GetExceptionInformation()))
  {
  }

  return rc;
}
wedday
驱动牛犊
驱动牛犊
  • 注册日期2007-08-02
  • 最后登录2009-04-03
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望26点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-12-28 23:17
v1rus:你提到的方法我在VMWare6.0上测试是可以的,但由于环境的限制没有能够做出更多的测试,你以前详细的测试过吗? 在现在运行的主流虚拟机版本上(VM5及VirtualPC系列)上是不是都可以正常工作,谢谢
v1rus
驱动牛犊
驱动牛犊
  • 注册日期2007-09-30
  • 最后登录2018-03-19
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-12-29 09:33
我只测试了几个版本,不敢说所有系列都行,当然理论上是行得通的,你自己测试看吧
xyzreg
驱动小牛
驱动小牛
  • 注册日期2005-06-20
  • 最后登录2009-12-06
  • 粉丝0
  • 关注0
  • 积分294分
  • 威望173点
  • 贡献值0点
  • 好评度164点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-12-29 19:34
给个通用判断的方法,不管VMWare或VirtuaPC都有效

int  DCVM ()
{
  unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
  *((unsigned*)&rpill[3]) = (unsigned)m;
  ((void(*)())&rpill)();

  printf ("idt base: %#x\n", *((unsigned*)&m[2]));
  if (m[5]>0xd0) printf ("虚拟机\r\n", m[5]);
  else printf ("真实机器\r\n");
  return 0;
}
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-01-02 14:27
引用第6楼xyzreg于2007-12-29 19:34发表的  :
给个通用判断的方法,不管VMWare或VirtuaPC都有效

int  DCVM ()
{
  unsigned char m[2+4], rpill[] = "x0fx01x0dx00x00x00x00xc3";
.......


貌似都无效,测了一下,在Visual Studio 2008下,直接运行和调试运行输出均不一样,一会是真实机器,一会是虚拟机。同一台机器出了两个结果。到底该相信谁。
typedef struct _IDTENTRY
{
unsigned short LowOffset;
unsigned short selector;
unsigned char unused_lo;
unsigned char segment_type:4; //0x0E is an interrupt gate
unsigned char system_segment_flag:1;
unsigned char DPL:2; // descriptor privilege level
unsigned char P:1; /* present */
unsigned short HiOffset;
} IDTENTRY,*PIDTENTRY;



  IDTENTRY idt;
  __asm sidt idt

楼上不妨验证一下,到底是那个成员出了问题?还是通过获取中断向量判断是否运行在虚拟机本身就有问题?
xyzreg
驱动小牛
驱动小牛
  • 注册日期2005-06-20
  • 最后登录2009-12-06
  • 粉丝0
  • 关注0
  • 积分294分
  • 威望173点
  • 贡献值0点
  • 好评度164点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-01-02 19:01
回楼上的,当然是按直接运行的算,东西又不是专门写来被调试的。。。
welfear
驱动牛犊
驱动牛犊
  • 注册日期2004-12-03
  • 最后登录2010-09-07
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望24点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-01-03 09:01
wedday
驱动牛犊
驱动牛犊
  • 注册日期2007-08-02
  • 最后登录2009-04-03
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望26点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-01-04 14:01
多核的问题,IDT地址不一样
klever
驱动牛犊
驱动牛犊
  • 注册日期2007-08-03
  • 最后登录2009-11-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-01-04 18:21
xyzreg
驱动小牛
驱动小牛
  • 注册日期2005-06-20
  • 最后登录2009-12-06
  • 粉丝0
  • 关注0
  • 积分294分
  • 威望173点
  • 贡献值0点
  • 好评度164点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-01-05 01:03
继续回7楼的,redpill在判断真实机器时确实是有误判,是sidt的问题,改用sLdt的方法吧

#include <stdio.h>

int  LdtCheck()
{
    unsigned char m[2];
    __asm sldt m;   //L,not i
    printf("LDTR: %2.2x %2.2x\n", m[0], m[1]);
    return (m[0] != 0x00 && m[1] != 0x00) ? 1 : 0;
}

int main(int argc, char * argv[])
{

    if (LdtCheck())
        printf("Virtual Machine detected.\n");
    else
        printf("Native machine detected.\n");
    
    return 0;
}
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
13楼#
发布于:2008-01-05 06:41
看xx算法算pi 300W位的时间和cpu利用率
~~

最简单的方法就是检查到安装有开发工具或者ida就不执行~~~

拒绝在任何技术人员的pc上执行~~
没有战争就没有进步 X3工作组 为您提供最好的军火
wedday
驱动牛犊
驱动牛犊
  • 注册日期2007-08-02
  • 最后登录2009-04-03
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望26点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-01-05 13:51
看xx算法算pi 300W位的时间和cpu利用率???
xx算法,能不能说仔细些 ,谢谢
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2008-01-07 12:10
#include <stdio.h>

inline int idtCheck ()
{
    unsigned char m[2];
    __asm sidt m;
    printf("IDTR: %2.2x %2.2x\n", m[0], m[1]);
    return (m[1]>0xd0) ? 1 : 0;
}

int gdtCheck()
{
    unsigned char m[2];
    __asm sgdt m;
    printf("GDTR: %2.2x %2.2x\n", m[0], m[1]);
    return (m[1]>0xd0) ? 1 : 0;
}

int ldtCheck()
{
    unsigned char m[2];
    __asm sldt m;
    printf("LDTR: %2.2x %2.2x\n", m[0], m[1]);
    return (m[0] != 0x00 && m[1] != 0x00) ? 1 : 0;
}

int main(int argc, char * argv[])
{
    idtCheck();
    gdtCheck();
    
    if (ldtCheck())
        printf("Virtual Machine detected.\n");
    else
        printf("Native machine detected.\n");
    
    return 0;
}
是能够测出来,但是编译时有下列警告信息,让人不爽。

C:\WINDDK\3790>cl test.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

test.c
test.c(7) : warning C4409: illegal instruction size
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:test.exe
test.obj
ljh1021
驱动小牛
驱动小牛
  • 注册日期2007-05-30
  • 最后登录2010-05-18
  • 粉丝0
  • 关注0
  • 积分936分
  • 威望126点
  • 贡献值0点
  • 好评度92点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2008-01-07 20:29
引用第13楼killvxk于2008-01-05 06:41发表的  :
看xx算法算pi 300W位的时间和cpu利用率
~~

最简单的方法就是检查到安装有开发工具或者ida就不执行~~~

.......

算圆周率?
消灭人类暴政,世界属于三体!
xyzreg
驱动小牛
驱动小牛
  • 注册日期2005-06-20
  • 最后登录2009-12-06
  • 粉丝0
  • 关注0
  • 积分294分
  • 威望173点
  • 贡献值0点
  • 好评度164点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2008-01-08 01:18
“idtCheck();
gdtCheck(); ”

这两个没必要写,因为如果依照这两个来判断的话也会出现在真实机器上存在误判的情况,比较准确的是LdtCheck()。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
18楼#
发布于:2008-01-08 11:35
引用第15楼guaiguaiguan于2008-01-07 12:10发表的  :
#include <stdio.h>

inline int idtCheck ()
{
    unsigned char m[2];
.......

__asm sldt word ptr m;
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2008-01-08 14:15
引用第13楼killvxk于2008-01-05 06:41发表的 :
看xx算法算pi 300W位的时间和cpu利用率
~~

最简单的方法就是检查到安装有开发工具或者ida就不执行~~~

.......

,另外可以自动清空磁盘中的文件的扇区。。
人不靓仔心灵美,版头不正红花仔!
上一页
游客

返回顶部