我读过几篇文章,解释如何修改系统参数来模拟物理机器。你可以改变一切,直到 CPUID,即使是通过汇编代码获取的,也可以通过查询正确的寄存器来改变。
一些恶意软件可以知道它们是否在虚拟机中工作,然后在了解这一点后尝试访问物理机器。
有没有明确的方法可以知道您是否以编程方式在虚拟机(Virtual Box、VMWare、Hyper-V 等)中工作?
答案1
可以使用以下 PowerShell 命令完成此操作(下面有 3 个示例)
PS C:\Windows\system32> Get-CimInstance win32_computersystem | select Model
Model
-----
HP EliteDesk 800 G3 TWR
PS C:\Windows\system32> Get-CimInstance win32_computersystem -ComputerName ServerA | select Model
Model
-----
Virtual Machine
PS C:\Windows\system32> Get-CimInstance win32_computersystem -ComputerName ServerB | select Model
Model
-----
ProLiant DL380p Gen8
如您所见,在第一个命令中我检查了本地机器,在第二个和第三个命令中我检查了远程机器。
当机器是虚拟的时,它将返回以下任意值:
Virtual Machine
(Hyper-V)VMware Virtual Platform
(VMWare)VirtualBox
(VirtualBox)
可以安全地假设其他任何东西都是物理的,或者是我在此未列出的另一种类型的虚拟机。
答案2
由于虚拟机的本质,攻击者可以使用的任何确定其是否在虚拟机中运行的方法都可能被系统所有者拦截和反击。
另一方面,攻击者占据优势,因为系统所有者必须猜测他们的下一步方法,以便在攻击发生之前抢先阻止攻击。
没有办法 100% 保证明确证明您正在运行的机器是物理的还是虚拟的。这是一场移动目标、猫捉老鼠的游戏。
答案3
我刚刚在为我正在编写的脚本查找了这一点。我发现最简单的方法就是检查风扇。虚拟机没有风扇,但物理机有。
Get-CimInstance -Namespace root/CIMV2 -ClassName Win32_Fan