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

简介:
最近写程序,碰到要检测程序是否运行在虚拟机内的问题。在网上找了一下,找到下面两个函数,可以检测程序是否运行在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; 
}
目录
相关文章
|
8月前
|
Ubuntu 安全 Linux
不用安装虚拟机,直接在Windows上面运行Linux Bash Shell,嗯!真香!!!
不用安装虚拟机,直接在Windows上面运行Linux Bash Shell,嗯!真香!!!
152 0
|
1月前
|
Ubuntu 安全 虚拟化
vmware虚拟机运行ubuntu等卡慢的解决办法
vmware虚拟机运行ubuntu等卡慢的解决办法
127 0
|
4月前
|
存储 缓存 Java
JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
34 0
|
9月前
|
Kubernetes Cloud Native Devops
为什么在Kubernetes上运行虚拟机?
为什么在Kubernetes上运行虚拟机?
59 0
|
6月前
|
存储 Java
【面试题精讲】JVM-运行时数据区-虚拟机栈
【面试题精讲】JVM-运行时数据区-虚拟机栈
|
8月前
|
存储 缓存 安全
【jvm系列-03】精通运行时数据区私有区域---虚拟机栈、程序计数器、本地方法栈
【jvm系列-03】精通运行时数据区私有区域---虚拟机栈、程序计数器、本地方法栈
49 0
|
8月前
|
关系型数据库 MySQL
VM虚拟机正常运行Finalshell连接超时
背景:网络重置后,再次打开vm虚拟机却发现虚拟机可以正常启动(网关 ip等等都正常,finalshell却连接超时),虚拟机里装有很多运行环境(包括mysql),必须启动。
604 0
|
9月前
|
存储 Java
JVM面试专题-JVM运行时数据区的虚拟机栈
JVM面试专题-JVM运行时数据区的虚拟机栈你知道吗?它的基本结构是什么呢?你知道栈帧的结构吗?那你说说动态链接吧?
52 1
|
9月前
|
JavaScript Ubuntu 应用服务中间件
docsify快速部署搭建个人知识库(支持本地、服务器、虚拟机运行)
docsify快速部署搭建个人知识库(支持本地、服务器、虚拟机运行)
1102 0
|
11月前
|
Cloud Native 安全 算法
带你读《云原生机密计算最佳实践白皮书》——海光CSV机密虚拟机(1)
带你读《云原生机密计算最佳实践白皮书》——海光CSV机密虚拟机(1)
686 0

热门文章

最新文章