【发布时间】:2012-04-10 12:03:39
【问题描述】:
我正在尝试开发一个应用程序来检测程序是否在虚拟机中运行。
对于 32 位 Windows,以下链接中已经有方法说明: http://www.codeproject.com/Articles/9823/Detect-if-your-program-is-running-inside-a-Virtual
我正在尝试在 64 位 Windows 操作系统中调整有关 Virtual PC 和 VMware 检测的代码。对于 VMware,该代码可以在 Windows XP 64 位操作系统中成功检测。但是当我在本机系统(Windows 7 64 位操作系统)中运行程序时,程序会崩溃。
我将代码放在 .asm 文件中,并使用 ml64.exe 文件定义自定义构建步骤。 64 位 Windows 的 asm 代码为:
IsInsideVM proc
push rdx
push rcx
push rbx
mov rax, 'VMXh'
mov rbx, 0 ; any value but not the MAGIC VALUE
mov rcx, 10 ; get VMWare version
mov rdx, 'VX' ; port number
in rax, dx ; read port
; on return EAX returns the VERSION
cmp rbx, 'VMXh'; is it a reply from VMWare?
setz al ; set return value
movzx rax,al
pop rbx
pop rcx
pop rdx
ret
IsInsideVM endp
我在 cpp 文件中称这部分为:
__try
{
returnValue = IsInsideVM();
}
__except(1)
{
returnValue = false;
}
提前致谢。
【问题讨论】:
-
嗯,是的,尝试访问硬件端口,这是一项特权操作,会陷入用户代码中。您需要使用 SEH 捕获异常。看起来您正在尝试,但您没有显示 (1) 编译器选项或 (2) 调试器跟踪。
标签: visual-c++ assembly 64-bit vmware detection