Windows 10任务管理器(taskmgr.exe)可以知道它是否正在物理机器或虚拟机上运行。如果您查看“性能”选项卡,您会注意到处理器数量标签的文字要么是“逻辑处理器:”,要么是“虚拟处理器:”。此外,如果在虚拟机中运行,则还有一个标签“虚拟机:是”。请参见以下两个屏幕截图:
我的问题是,任务管理器是否使用了文档化的API调用来进行此类检测?
我简短地查看了反汇编代码,似乎检测代码与GetLogicalProcessorInformationEx和/或IsProcessorFeaturePresent和/或NtQuerySystemInformation有关。
然而,我不知道如何做到这一点(至少不花费更多时间分析汇编代码)。
此外:我认为这个问题与其他现有的问题不相关,例如“如何检测我的程序是否在虚拟机内运行?”因为我没有看到任何代码尝试将smbios表字符串或CPU供应商字符串与已知的针对虚拟机监控程序(“qemu”,“virtualbox”,“vmware”)的字符串进行比较。我不能排除低级API实现会这样做,但我在taskmgr.exe中没有看到这种代码。
更新:我也可以排除taskmgr.exe使用CPUID指令(使用EAX=1并检查ECX中的hypervisor位31)来检测矩阵。
我简短地查看了反汇编代码,似乎检测代码与GetLogicalProcessorInformationEx和/或IsProcessorFeaturePresent和/或NtQuerySystemInformation有关。
然而,我不知道如何做到这一点(至少不花费更多时间分析汇编代码)。
此外:我认为这个问题与其他现有的问题不相关,例如“如何检测我的程序是否在虚拟机内运行?”因为我没有看到任何代码尝试将smbios表字符串或CPU供应商字符串与已知的针对虚拟机监控程序(“qemu”,“virtualbox”,“vmware”)的字符串进行比较。我不能排除低级API实现会这样做,但我在taskmgr.exe中没有看到这种代码。
更新:我也可以排除taskmgr.exe使用CPUID指令(使用EAX=1并检查ECX中的hypervisor位31)来检测矩阵。
更新:仔细查看反汇编代码后发现确实有一个检查位31的操作,只是没有明显地展示出来。
下面我会自己回答这个问题。
CheckVirtualStatus()
使用CPUID进行多个检测任务(例如签名、制造商ID字符串),但仅在EAX=1的情况下使用一次,并且在这种情况下,只分析ECX的第5位以检查VMX扩展。而缺少VMX标志并不是虚拟机的合适指示器。 - gollum