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; }
杜比音效到底是什么
锌锰电池型号命名与标识
叠层压电振动片:看上去很平,摸起来凹凸不平?
大模型开源开放评测体系司南正式发布
什么是数字钥匙 数字钥匙概念
反虚拟机技术合集2
同时控制锌形核热力学与析氢过电位实现稳定界面
2019年特斯拉的全球时刻动态
基于Linux/Qt的智能家居系统设计
重载连接器的连接方式:四种连接方式的介绍
隆基为全球客户提供全生命周期的专业化和数字化解决方案
未来两年LED光引擎快速增长 频闪耐高压难题仍待解决
【工程师笔记】利用滤波电容与电感抑制辐射EMI --- 特性分析与设计方法
苹果13.3寸笔记本尺寸
新一代电信运营支撑系统浅析
MQ-9B“守护者”大型无人机在日测试,更换部件即可搭载导弹
华为p10zenm样?华为p10麒麟960+双摄,华为p10堪称华为又一巅峰作
减速机的使用技巧说明
AR远程协助系统在智慧变电站运维中发挥了重要作用
TOPSwitch Ⅱ在稳压电源中的应用