0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

反虚拟机技术合集2

jf_78858299 来源:看雪学苑 作者: houjingyi 2023-02-14 13:45 次阅读

4.根据特定的文件夹或文件信息

通过查找磁盘中是否存在特定的文件夹或文件,判断当前是否在虚拟机中。VMware虚拟机中通常会有路径C:\\Program Files\\VMware\\VMware Tools\\;VirtualBox 虚拟机中通常会有路径 C:\\Program Files\\Oracle\\VirtualBox Guest Additions\\。

图片

图片

BOOL CheckVMware()  
{  
   if (PathIsDirectory("C:\\\\Program Files\\\\VMware\\\\VMware Tools\\\\") == 0)  
   {  
       return FALSE;  
   }  
   else  
   {  
       return TRUE;  
   }  
}
BOOL CheckVirtualBox()  
{  
   if (PathIsDirectory("C:\\\\Program Files\\\\Oracle\\\\VirtualBox Guest Additions\\\\") == 0)  
   {  
       return FALSE;  
   }  
   else  
   {  
       return TRUE;  
   }  
}

5.根据特定注册表信息

通过读取主机具有虚拟机特性的注册表位置来判断是否处于虚拟机环境中。针对VMware可以判断注册表项HKEY_CLASSES_ROOT\\Applications\\VMwareHostOpen.exe;针对VirtualBox可以判断注册表项HKEY_LOCAL_MACHINE\\SOFTWARE\\Oracle\\VirtualBox Guest Additions。当然,注册表中能被检测出的位置很多,这里只是举个例子。

图片

图片

BOOL CheckVMWare()  
{  
   HKEY hkey;  
   if (RegOpenKey(HKEY_CLASSES_ROOT, "\\\\Applications\\\\VMwareHostOpen.exe", &hkey) == ERROR_SUCCESS)  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVirtualBox()  
{  
   HKEY hkey;  
   if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\\\Oracle\\\\VirtualBox Guest Additions", &hkey) == ERROR_SUCCESS)  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}

6.根据特定服务名

通过获取主机当前具有VMware特性的服务信息,判断当前主机是否为虚拟机。在VMware中通常会存在VMware物理磁盘助手服务和VMware Tools服务等;在VirtualBox中通常会存在VirtualBox Guest Additions Service服务等。

图片

图片

BOOL CheckVMWare()  
{  
   int menu = 0;    
   //打开系统服务控制器    
   SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);  
   if(SCMan == NULL)    
   {  
       cout << GetLastError() << endl;  
       printf("OpenSCManager Eorror/n");    
       return -1;    
   }    
   //保存系统服务的结构  
   LPENUM_SERVICE_STATUSA service_status;    
   DWORD cbBytesNeeded = NULL;    
   DWORD ServicesReturned = NULL;    
   DWORD ResumeHandle = NULL;    
   service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);    
   //获取系统服务的简单信息    
   bool ESS = EnumServicesStatusA(SCMan, //系统服务句柄    
       SERVICE_WIN32, //服务的类型    
       SERVICE_STATE_ALL,  //服务的状态    
       (LPENUM_SERVICE_STATUSA)service_status,  //输出参数,系统服务的结构    
       1024 * 64,  //结构的大小    
       &cbBytesNeeded, //输出参数,接收返回所需的服务    
       &ServicesReturned, //输出参数,接收返回服务的数量    
       &ResumeHandle); //输入输出参数,第一次调用必须为0,返回为0代表成功    
   if(ESS == NULL)    
   {    
       printf("EnumServicesStatus Eorror/n");    
       return -1;    
   }    
   for(int i = 0; i < ServicesReturned; i++)    
   {    
       if (strstr(service_status[i].lpDisplayName, "VMware Tools")!=NULL || strstr(service_status[i].lpDisplayName, "VMware 物理磁盘助手服务")!=NULL)  
       {  
           return TRUE;  
       }  
   }    
   //关闭服务管理器的句柄  
   CloseServiceHandle(SCMan);  
   return FALSE;  
}
BOOL CheckVirtualPC()  
{  
   int menu = 0;    
   //打开系统服务控制器    
   SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);  
   if(SCMan == NULL)    
   {  
       cout << GetLastError() << endl;  
       printf("OpenSCManager Eorror/n");    
       return -1;    
   }    
   //保存系统服务的结构  
   LPENUM_SERVICE_STATUSA service_status;    
   DWORD cbBytesNeeded = NULL;    
   DWORD ServicesReturned = NULL;    
   DWORD ResumeHandle = NULL;    
   service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);    
   //获取系统服务的简单信息    
   bool ESS = EnumServicesStatusA(SCMan, //系统服务句柄    
       SERVICE_WIN32, //服务的类型    
       SERVICE_STATE_ALL,  //服务的状态    
       (LPENUM_SERVICE_STATUSA)service_status,  //输出参数,系统服务的结构    
       1024 * 64,  //结构的大小    
       &cbBytesNeeded, //输出参数,接收返回所需的服务    
       &ServicesReturned, //输出参数,接收返回服务的数量    
       &ResumeHandle); //输入输出参数,第一次调用必须为0,返回为0代表成功    
   if(ESS == NULL)    
   {    
       printf("EnumServicesStatus Eorror/n");    
       return -1;    
   }    
   for(int i = 0; i < ServicesReturned; i++)    
   {    
       if (strstr(service_status[i].lpDisplayName, "Virtual Machine")!=NULL)  
       {  
           return TRUE;  
       }  
   }    
   //关闭服务管理器的句柄  
   CloseServiceHandle(SCMan);  
   return FALSE;  
}
BOOL CheckVirtualBox()  
{  
   int menu = 0;    
   //打开系统服务控制器    
   SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);  
   if(SCMan == NULL)    
   {  
       cout << GetLastError() << endl;  
       printf("OpenSCManager Eorror/n");    
       return -1;    
   }    
   //保存系统服务的结构  
   LPENUM_SERVICE_STATUSA service_status;    
   DWORD cbBytesNeeded = NULL;    
   DWORD ServicesReturned = NULL;    
   DWORD ResumeHandle = NULL;    
   service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);    
   //获取系统服务的简单信息    
   bool ESS = EnumServicesStatusA(SCMan, //系统服务句柄    
       SERVICE_WIN32, //服务的类型    
       SERVICE_STATE_ALL,  //服务的状态    
       (LPENUM_SERVICE_STATUSA)service_status,  //输出参数,系统服务的结构    
       1024 * 64,  //结构的大小    
       &cbBytesNeeded, //输出参数,接收返回所需的服务    
       &ServicesReturned, //输出参数,接收返回服务的数量    
       &ResumeHandle); //输入输出参数,第一次调用必须为0,返回为0代表成功    
   if(ESS == NULL)    
   {    
       printf("EnumServicesStatus Eorror/n");    
       return -1;    
   }    
   for(int i = 0; i < ServicesReturned; i++)    
   {    
       if (strstr(service_status[i].lpDisplayName, "VirtualBox Guest")!=NULL)  
       {  
           return TRUE;  
       }  
   }    
   //关闭服务管理器的句柄  
   CloseServiceHandle(SCMan);  
   return FALSE;  
}

7.根据时间差

由于在虚拟机中,代码的运行速度通常不如真实主机。所以恶意代码通过运行一段特定的代码来比较这段代码在虚拟机和真实主机之中的相对运行时间,以此来判断是否处于虚拟机之中。

BOOL CheckVMWare()  
{  
   __asm  
   {  
       rdtsc  
       xchg ebx,eax  
       rdtsc  
       sub eax,ebx  
       cmp eax,0xFF  
       jg detected  
   }  
   return FALSE;  
detected:  
   return TRUE;  
}
BOOL CheckVirtualPC()  
{  
   __asm  
   {  
       rdtsc  
       xchg ebx,eax  
       rdtsc  
       sub eax,ebx  
       cmp eax,0xFF  
       jg detected  
   }  
   return FALSE;  
detected:  
   return TRUE;  
}
BOOL CheckVirtualBox()  
{  
   __asm  
   {  
       rdtsc  
       xchg ebx,eax  
       rdtsc  
       sub eax,ebx  
       cmp eax,0xFF  
       jg detected  
   }  
   return FALSE;  
detected:  
   return TRUE;  
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Mac
    Mac
    +关注

    关注

    0

    文章

    1067

    浏览量

    50833
  • 恶意代码
    +关注

    关注

    0

    文章

    10

    浏览量

    7614
  • 虚拟机
    +关注

    关注

    1

    文章

    854

    浏览量

    27365
收藏 人收藏

    评论

    相关推荐

    虚拟机DNS问题

    我的主机开发板虚拟机本来能互相ping通的。今天我嫌samba服务器刷新慢,按照网上的说明修改虚拟机的/etc/hosts /etc/resolv.conf,拔掉了上网的网线,换成了连接笔记本
    发表于 03-06 18:56

    MYZR虚拟机功能演示

    的电脑”,在地址栏输入“\\u12045\myzr.d”(注意:windows系统下路径使用的是斜杠)。2)输入虚拟机系统的用户名和密码(myzr : myzr123)3)输入正确的用户名和密码点击确定后共享目录即可访问即可在
    发表于 12-27 15:04

    为什么PC可以ping通虚拟机,但虚拟机ping不通PC?

    我的是笔记本连无线网,开发板通过另一个路由器连接PC,PC IP:192.168.1.100;虚拟机ip:192.168.1.123;板子ip:192.168.1.17遇到的问题:PC可以ping通虚拟机,但虚拟机ping不同P
    发表于 10-25 00:44

    虚拟机里的OS怎么和硬件通信

    Ring3但是做了虚拟化后,OS和硬件之间就多了一层VMM,虚拟机里的OS怎么和硬件通信?并且多个虚拟机里的OS怎么协调使用硬件资源呢?1998年VMware首次解决了这一问题,使用二进制翻译和...
    发表于 07-30 06:27

    虚拟机Ubuntu18 64位系统虚拟机的配置方法

    宿主机(host) :虚拟机Ubuntu18 64位系统虚拟机配置:1.添加两个磁盘是为了将系统和代码分开,这样的好处在于可以将代码盘挂载到其它虚拟机上使用2.安装两个网卡是因为目标
    发表于 11-08 09:03

    安装虚拟机

    1、安装虚拟机可以阅读往期文章:Mac苹果电脑安装虚拟机2、在虚拟机上安装CH340驱动,keil4,PZ-ISP,下载CH340驱动安装 下载keil4破解及汉化 下载普中科技烧录软
    发表于 11-19 08:10

    如何创建虚拟机

    实战开发--开发环境安装(五)1、下载软件vmware和ubuntu-20.04.1-desktop-amd64.iso2、创建虚拟机完整步骤3、安装嵌入式linux所需的工具包4、安装vmware tool,实现虚拟机与物理主
    发表于 12-16 07:45

    掌握Linux操作系统的虚拟机定制安装

    一、实验目的和要求1通过对Linux 操作系统的定制安装,建立对Linux操作系统的初步认识,为后续实验的进行提供基础平台。2掌握Linux操作系统的虚拟机定制安装。3熟悉Linux文件目录结构二
    发表于 12-16 08:10

    求一种基于集群的技术和基于虚拟机重启的技术

    什么是IBM Power Systems的地理分散弹性?灾难恢复和高可用性(HA)解决方案主要基于两种技术:基于集群的技术和基于虚拟机重启的技术。 群集高可用性和灾难恢复解决方案通常会
    发表于 12-29 06:23

    DevEco Studio 3.0 Beta2 -本地虚拟机体验

    在最新发布的DevEco Studio 3.0 Beta2 除了支持远程真机运行,还支持本地虚拟机,在没有网的情况下也可以使用。安装本地虚拟机打开设置,查找SDK设置,下载对应的SDK包,现在只支持
    发表于 01-17 15:33

    有关虚拟机虚拟技术的几点诠注

    虚拟机虚拟技术给计算机应用注入了新的研究与开发点,同时也存在诸多不利因素。本文综述了虚拟机虚拟
    发表于 06-22 18:04 36次下载

    虚拟机虚拟技术

    虚拟机虚拟技术给计算机应用注入了新的研究与开发点,同时也存在诸多不利因素。本文综述了虚拟机虚拟
    发表于 09-07 10:15 13次下载

    虚拟机技术合集1

    恶意代码编写者经常使用反虚拟机技术逃避分析,这种技术可以检测自己是否运行在虚拟机中。如果恶意代码探测到自己在虚拟机中运行,它会执行与其本身行
    的头像 发表于 02-14 13:45 985次阅读

    虚拟机技术合集3

    恶意代码编写者经常使用反虚拟机技术逃避分析,这种技术可以检测自己是否运行在虚拟机中。如果恶意代码探测到自己在虚拟机中运行,它会执行与其本身行
    的头像 发表于 02-14 13:45 410次阅读
    反<b class='flag-5'>虚拟机</b><b class='flag-5'>技术</b><b class='flag-5'>合集</b>3

    虚拟机技术合集4

    恶意代码编写者经常使用反虚拟机技术逃避分析,这种技术可以检测自己是否运行在虚拟机中。如果恶意代码探测到自己在虚拟机中运行,它会执行与其本身行
    的头像 发表于 02-14 13:46 740次阅读
    反<b class='flag-5'>虚拟机</b><b class='flag-5'>技术</b><b class='flag-5'>合集</b>4