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

    文章

    1106

    浏览量

    51471
  • 恶意代码
    +关注

    关注

    0

    文章

    12

    浏览量

    7634
  • 虚拟机
    +关注

    关注

    1

    文章

    916

    浏览量

    28181
收藏 人收藏

    评论

    相关推荐

    什么是虚拟机虚拟机真的那么好用吗?

    在日新月异的科技世界中,虚拟技术如同一座桥梁,连接着现实与数字的鸿沟,为我们打开了全新的计算维度。虚拟机,这一概念,自其诞生以来,就以其独特的魅力和强大的功能,深深地影响了软件开发、系统测试和云
    的头像 发表于 07-06 08:05 463次阅读
    什么是<b class='flag-5'>虚拟机</b>?<b class='flag-5'>虚拟机</b>真的那么好用吗?

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

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

    虚拟机虚拟技术

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

    基于虚拟机技术的DSC仿真系统设计

    提出了基于虚拟机技术的DCS仿真系统的实现方式,描述了虚拟控制器的具体实现方法及虚拟机技术的其他应用。
    发表于 12-03 17:26 26次下载
    基于<b class='flag-5'>虚拟机</b><b class='flag-5'>技术</b>的DSC仿真系统设计

    基于虚拟机技术的DCS仿真系统设计与实现

    提出了基于虚拟机技术的DCS仿真系统的实现方式,描述了虚拟控制器的具体实现方法及虚拟机技术的其他应用。
    发表于 01-16 15:04 2181次阅读
    基于<b class='flag-5'>虚拟机</b><b class='flag-5'>技术</b>的DCS仿真系统设计与实现

    虚拟机:QEMU虚拟机和主机无线网络通讯设置

    虚拟机:QEMU虚拟机和主机无线网络通讯设置
    的头像 发表于 06-22 10:19 5449次阅读
    <b class='flag-5'>虚拟机</b>:QEMU<b class='flag-5'>虚拟机</b>和主机无线网络通讯设置

    KVM虚拟机管理和基本使用

    KVM — 全称是基于内核的虚拟机(Kernel-based Virtual Machine)是一个开源软件,基于内核的虚拟技术,实际是嵌入系统的一个虚拟化模块,通过优化内核来使用
    的头像 发表于 02-07 09:20 1294次阅读

    虚拟机技术合集1

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

    虚拟机技术合集3

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

    虚拟机技术合集4

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

    linux虚拟机使用教程

    引言:Linux虚拟机是一种方便且常用的技术,它允许用户在现有操作系统的基础上创建和运行另一个独立的操作系统。在本篇文章中,我们将提供一份详尽的教程,帮助你了解如何安装、配置和使用Linux虚拟机
    的头像 发表于 11-17 10:06 1271次阅读

    Docker与虚拟机的区别

    Docker和虚拟机是两种不同的虚拟技术,它们在实现方式、资源消耗、运行性能等方面存在许多差异。本文将会详细介绍它们的区别。 一、实现方式 1.1 虚拟机
    的头像 发表于 11-23 09:37 9786次阅读

    怎么安装linux虚拟机

    在计算机领域,虚拟机是一种软件程序,它允许在主操作系统上运行多个虚拟操作系统。Linux虚拟机在开发、测试和学习等环境中得到广泛应用。本文将详细介绍如何安装Linux虚拟机,并提供一个
    的头像 发表于 11-23 10:50 1105次阅读

    虚拟机ubuntu怎么联网

    虚拟机ubuntu怎么联网  虚拟机(Virtual Machine)是运行在物理(Host Machine)上的虚拟操作系统环境。在虚拟机
    的头像 发表于 12-27 16:51 981次阅读

    虚拟机数据恢复—KVM虚拟机被误删除的数据恢复案例

    虚拟机数据恢复环境: Linux操作系统服务器,EXT4文件系统。服务器中有数台KVM虚拟机虚拟机1:主数据库服务器 虚拟磁盘:系统盘(qcow
    的头像 发表于 08-07 13:33 457次阅读
    <b class='flag-5'>虚拟机</b>数据恢复—KVM<b class='flag-5'>虚拟机</b>被误删除的数据恢复案例