软件如何判断自己运行在虚拟机中?
时间:2024-01-02 02:12:01 | 来源:网站运营
时间:2024-01-02 02:12:01 来源:网站运营
软件如何判断自己运行在虚拟机中?:关于这个问题可以推荐篇论文
《Towards an Understanding of Anti-virtualization and Anti-debugging Behavior in Modern Malware》
--------PATCH----------
看到评论里说例子太少,稍微补充一点。
首先是两个工具
https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/checkvm/checkvm.chttp://www.trapkit.de/tools/scoopyng/checkvm和scoopyNG,都是针对VMware虚拟机的检测工具。
各个检测方法的例子补充下下面的分类当中,不过有些例子可能只能在旧版本和特定厂商的虚拟机中起作用。
--------PATCH----------
有很多种不同的方法,我大致回忆一下:
前面就有回答提到过,vbox和vmware这类的软件都会在虚拟机中创建一些特定名称的device和驱动,只要检测到这些东西的存在就多半是虚拟机了。
e.g. 经常配置VMware虚拟机的同学们肯定会注意到,安装了VMware的Host与虚拟机内部都会多出来两个(虚拟)网卡设备:一个是VMnet1,使用Host Only的方式联网;一个是VMnet8,采用NAT的方式联网。
类似的,还有Bus- Logic BT-958,VMware提供的SCSI驱动报错中会出现这个设备名称信息。
由于虚拟机实现的问题,很多细节会与真实设备不同。比如某些特定指令的效果,再比如操作系统中某些特定功能的实现。
.e.g. IDT(Interrupt Descriptor Table)是Windows处理中断时用于查找中断处理程序的一块内存,为了隔离Host与Guest OS,虚拟机与宿主机的IDT在内存当中的地址是不同的,Red Pill这个工具就通过获取IDT的地址来进行区分,当地址为0xff开头时为真机、为0xe8开头时为虚拟机(32位系统上)。
一些机器码中无效的指令(Invalid Opcode)被虚拟机使用作为后门以便于虚拟机的管理,因此通过执行这些无效的指令、检查是否触发Exception的方法同样可以识别虚拟机。比如VMware当中的IN指令,在真机上不能在ring3下执行,但虚拟机中可以用于与宿主机通信。
虚拟机上可能安装有一些特定的软件、运行了一些特定的进程或服务(比如VMware的vmtools)。
e.g. 如上面说的,检查VMware tools是否安装在系统中。可以检查注册表项HKEY_CLASSES_ROOT/Installer/Products/C2A6F2EFE6910124C940B2B12CF170FE/ProductName,其值为"VMware Tools"
软件模拟CPU执行指令和直接硬件执行的速度有数量级的差距,很有那么一些指令的执行速度可以用于判断是否在虚拟机中。
e.g. x86指令集中RDTSC这个指令可以用于获得cpu启动以来的运行周期数,所以只要RDTSC一下,存结果,随便执行一个指令,再RDTSC一下,减一减,你就能获得一个大致的指令执行周期数的数据。这个数字很不精确,但前面已经提到,虚拟机和真机上的执行速度有数量级的差距,所以很容易看出区别——当然也很容易弄错。