在开发测试中,不少人会选择使用虚拟机环境来进行,以避免对主机产生影响,特别是一些软件类测试, 比如病毒分析等等。在实际测试中会发现,相当一部分软件或代码也在进行反虚拟机来逃避分析, 这种技术可以检测自己是否运行在虚拟机中,如果探测到自己在虚拟机中运行, 它就会执行与其本身行为不同的行为,这时候就无法达到我们测试的目的了。 因此我们可以考虑通过修改配置来达到让虚拟机内运行的软件无法探测到虚拟机环境的目标。 探测方向不管是通过 VMware 还是 Oracle VirtualBox 抑或是 Microsoft Hyper-V,只要是虚拟出来的环境, 都或多或少会有痕迹存在,目前用来探测的比较多的痕迹有以下几个。 MAC 地址这是最明显的特征。通常 MAC 地址的前三个字节标识一个提供商。 以 00:05:69、00:0c:29 和00:50:56 开始的 MAC 地址与 VMware 相对应; 以 00:03:ff 开始的 MAC 地址与 virtualpc 对应;以 08:00:27 开始的 MAC 地址与 VirtualBox 对应。 其他硬件信息虚拟机环境中,主板序列号、主机型号、系统盘所在磁盘名称等硬件信息,以及这些硬件采用的驱动, 通常都会带有 VMware、VirtualBox、VBOX、Virtual Machine 等字眼。 特定的进程信息为方便使用,比如自动捕获鼠标、分辨率自适应等, 我们会安装 VMware Tools 或者 VBoxGuestAdditions 等增强包, 这也是虚拟机环境非常明显的一个特征。通过进程快照读取当前进程信息, 查找是否存在虚拟机中特有的进程,如 VMware 中的 vmware.exe 和 VirtualBox 中的 VBoxService.exe。 特定的文件夹或文件信息通过查找磁盘中是否存在特定的文件夹或文件,判断当前是否在虚拟机中。 VMware 虚拟机中通常会有路径 C:\Program Files\VMware\VMware Tools\; VirtualBox 虚拟机中通常会有路径 C:\Program Files\Oracle\VirtualBox Guest Additions\。 特定的注册表信息通过读取主机具有虚拟机特性的注册表位置来判断是否处于虚拟机环境中。 针对 VMware 可以判断注册表项 HKEY_CLASSES_ROOT\Applications\VMwareHostOpen.exe; 针对 VirtualBox 可以判断注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBox Guest Additions。 当然,注册表中能被检测出的位置很多,这里只是举个例子。 特定的服务名通过获取主机当前具有虚拟机特性的服务信息,判断当前主机是否为虚拟机。 在 VMware 中通常会存在 VMware 物理磁盘助手服务和VMware Tools服务等; 在 VirtualBox 中通常会存在VirtualBox Guest Additions Service服务等。 时间差由于在虚拟机中,代码的运行速度通常不如真实主机。 所以通过运行一段特定的代码来比较这段代码在虚拟机和真实主机之中的相对运行时间, 以此来判断是否处于虚拟机之中。 其他上面说的几种方法都能够检测虚拟机,但检测的方法却不仅限于此,有兴趣的可以再深入研究。 反探测近年来,随着虚拟化技术的使用不断增加,采用反虚拟机技术的软件数量逐渐下降, 编写者已经开始意识到,目标主机是虚拟机,也并不意味着它就没有攻击价值, 特别在于目前云计算产业正在如火如荼地发展中。 以 VMware 为例,我们可以通过下面的方法来解决上文探测方向中的大部分痕迹。 由于修改信息可能会导致系统激活状态失效,或者修改后配置不生效,故建议在创建虚拟机时就修改好。 修改软件信息VMTools 接口直接将下面的代码贴到虚拟配置文件 .vmx 中(如果是 EXSi,建议通过 WEB 控制面板来修改配置), 屏蔽 VMware 特定信息的探测: [AppleScript] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | isolation.tools.getPtrLocation.disable = "TRUE"
isolation.tools.setPtrLocation.disable = "TRUE"
isolation.tools.setVersion.disable = "TRUE"
isolation.tools.getVersion.disable = "TRUE"
monitor_control.disable_directexec = "TRUE"
monitor_control.disable_chksimd = "TRUE"
monitor_control.disable_ntreloc = "TRUE"
monitor_control.disable_selfmod = "TRUE"
monitor_control.disable_reloc = "TRUE"
monitor_control.disable_btinout = "TRUE"
monitor_control.disable_btmemspace = "TRUE"
monitor_control.disable_btpriv = "TRUE"
monitor_control.disable_btseg = "TRUE"
monitor_control.restrict_backdoor = "TRUE"
|
驱动信息主要是显卡,可以采取先将驱动导出来,然后修改驱动中的安装文件 *.inf, 将 STRING 一节中的相关字眼修改掉,再还原驱动。 [AppleScript] 纯文本查看 复制代码 1 2 3 | DiskID = "NVIDIA Windows Driver Library Installation"
CompanyName = "NVIDIA"
SVGA = "GeForce GTX 660"
|
在这一步中,需要安装 VMware Tools 才会有显卡驱动,但是上面修改了配置, 将无法安装 VMware Tools,会提示“只应安装在虚拟机内”。 由于安装 VMware Tools 将会是一个非常明显的特征,因此不建议安装。 且虚拟机驱动其实都是一样的,因此可以从其他虚拟机中导出来直接使用。 修改硬件信息主板信息下面的代码表示延用实体机的主板信息: [AppleScript] 纯文本查看 复制代码 1 2 3 4 5 6 | SMBIOS.reflecthost = "TRUE"
SMBIOS.noOEMStrings = "TRUE"
SMBIOS.addHostVendor = "TRUE"
hw.model.reflectHost = "TRUE"
serialNumber.reflectHost = "TRUE"
board - id .reflectHost = "TRUE"
|
也可以自己编一个,比如在黑苹果中会用到的: [AppleScript] 纯文本查看 复制代码 1 2 3 4 5 6 7 8 | smbios.reflectHost = "FALSE"
smbios.vendor = "Apple Computer, Inc."
smbios. version = "MBA51.88Z.0055.B08.0610121"
smbios.family = "MacBook Pro"
smbios.model = "MacBookPro1.1"
smbios. date = "10/12/06"
smbios.manufacturer = "Apple Computer, Inc."
smbios.systemversion = "1.0"
|
磁盘信息如果在 scsi0 插槽上有 SCSI 虚拟磁盘作为系统驱动器,可以添加: [AppleScript] 纯文本查看 复制代码 1 2 | scsi 0 : 0. productID = "WDC_____WD10EZEX-57WN4D11"
scsi 0 : 0. vendorID = "WDC"
|
scsi0:0 表示第一个插槽,其他硬件也可以类似指定 ID。 网卡信息参考实体机 MAC 地址信息,自行编一个: [AppleScript] 纯文本查看 复制代码 1 2 | ethernet 0. checkMACAddress = "FALSE"
ethernet 0. address = "BC:30:5B:DD:D2:E8"
|
以上的方法能够解决大部分的虚拟机探测,但是一些使用寄存器值、 任务状态段(Task Status Segment, TSS)、I/O 接口等检测方法的软件,仍然骗不过。 |
沒有留言:
張貼留言