15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 软件如何判断自己运行在虚拟机中?

软件如何判断自己运行在虚拟机中?

时间: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一下,减一减,你就能获得一个大致的指令执行周期数的数据。这个数字很不精确,但前面已经提到,虚拟机和真机上的执行速度有数量级的差距,所以很容易看出区别——当然也很容易弄错。

关键词:运行,虚拟,判断

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭