如何判断当前程序是否运行在虚拟机内

简介: 最近写程序,碰到要检测程序是否运行在虚拟机内的问题。在网上找了一下,找到下面两个函数,可以检测程序是否运行在virtual machine中,支持VMWARE 和virtual pc检测. 主要的原理,都是利用virtual machine往往支持一些真实PC不支持的指令.

最近写程序,碰到要检测程序是否运行在虚拟机内的问题。在网上找了一下,找到下面两个函数,可以检测程序是否运行在virtual machine中,支持VMWARE 和virtual pc检测. 主要的原理,都是利用virtual machine往往支持一些真实PC不支持的指令. 

// IsInsideVPC's exception filter 
DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep) 

PCONTEXT ctx = ep->ContextRecord; 

ctx->Ebx = -1; // Not running VPC 
ctx->Eip += 4; // skip past the "call VPC" opcodes 
return EXCEPTION_CONTINUE_EXECUTION; 
// we can safely resume execution since we skipped faulty instruction 


// High level language friendly version of IsInsideVPC() 
bool IsInsideVPC() 

bool rc = false; 

__try 

_asm push ebx 
_asm mov ebx, 0 // It will stay ZERO if VPC is running 
_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; 
}下面是检测virtual PC的.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; 
}

目录
相关文章
|
虚拟化
【错误记录】VMware 虚拟机报错 ( 虚拟化性能计数器需要至少一个可正常使用的计数器, 模块 “VPMC“ 启动失败 , 未能启动虚拟机 )
【错误记录】VMware 虚拟机报错 ( 虚拟化性能计数器需要至少一个可正常使用的计数器, 模块 “VPMC“ 启动失败 , 未能启动虚拟机 )
7415 0
【错误记录】VMware 虚拟机报错 ( 虚拟化性能计数器需要至少一个可正常使用的计数器, 模块 “VPMC“ 启动失败 , 未能启动虚拟机 )
|
5月前
|
Linux Perl
在Linux中,系统目前有许多正在运行的任务,在不重启机器的条件下,有什么方法可以把所有正在运行的进程移除呢?
在Linux中,系统目前有许多正在运行的任务,在不重启机器的条件下,有什么方法可以把所有正在运行的进程移除呢?
|
8月前
|
存储 弹性计算 运维
调整虚拟机内存参数的 shell 脚本
【4月更文挑战第29天】
84 2
|
8月前
【嵌入式】虚拟机未能将管道连接到虚拟机: 系统找不到指定的文件
【嵌入式】虚拟机未能将管道连接到虚拟机: 系统找不到指定的文件
107 0
|
Linux 虚拟化
此虚拟机的处理器所支持的功能不同于保存虚拟机状态的虚拟机的处理器所支持的功能
此虚拟机的处理器所支持的功能不同于保存虚拟机状态的虚拟机的处理器所支持的功能
2313 0
此虚拟机的处理器所支持的功能不同于保存虚拟机状态的虚拟机的处理器所支持的功能
|
Java
同一个JDK,命令行运行,与JNI加载虚拟机,还是有差异
同一个JDK,命令行运行,与JNI加载虚拟机,还是有差异
75 0
|
Kubernetes 虚拟化 Docker
虚拟机启动win10安装K8S-问题记录
虚拟机启动win10安装K8S-问题记录
273 0
虚拟机启动win10安装K8S-问题记录
|
固态存储 内存技术
虚拟机操作脚本
手动定制虚拟磁盘格式,通过脚本添加不同类型的模拟磁盘,增加磁盘的硬件信息
281 1
|
监控 Java
虚拟机参数
关于虚拟机参数,总体有两大类: -XX 对于系统级别的(jvm)配置,配置日志信息,或者说配置jvm使用什么样的垃圾回收器。 非-XX的 基本上都是对应用层面上的配置。
1052 0