好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

虚拟机去虚拟化及检测技术攻防.doc

31页
  • 卖家[上传人]:桔****
  • 文档编号:535186826
  • 上传时间:2024-01-03
  • 文档格式:DOC
  • 文档大小:760KB
  • / 31 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以 提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是 应用 越来越来广泛这里我们所谓的虚拟机(Virtual Machine)是指通过软件 模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算 机系 统通过虚拟机软件(比如VMware, Virtual PC ,VirtualBox),你可以在一 台物理计算机上模拟出一台或多台虚拟的计算机, 这些虚拟机完全就像真正的 计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源 等等攻击者为了提高恶意程序的隐蔽性以及破坏真实主 机的成功率,他们都 在恶意程序中加入检测虚拟机的代码,以判断程序所处的运行环境当发现程序 处于虚拟机(特别是蜜罐系统)中时,它就会改变操作行为或者 中断执行,以 此提高反病毒人员分析恶意软件行为的难度本文主要针对基于Intel CPU的虚 拟环境VMware中的Windows XP SP3系统进行检测分析,并列举出当前常见的 几种虚拟机检测方法方法一:通过执行特权指令来检测虚拟机Vmware为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“IN” 指令来读取特定端口的数据以进行两机通讯,但由于IN指令属于特权指令,在 处于保护模式下的真机上执行此指令时,除非权限允许,否则将会触发类型为 “EXCEPTION_PRIV_INSTRUCTION”的异常,而在虚拟机中并不会发生异常,在 指定功能号0A (获取VMware版本)的情况下,它会在EBX中返回其版本号 “VMXH” ;而当功能号为0x14时,可用于获取VMware内存大小,当大于0时 则说明处于虚拟机中。

      VMDetect 正是利用前一种方法来检测 VMware 的存在,其 检测代码分析如下:代码: bool IsInsideVMWare()push edx pushmov ebx, 0 //ecx, 10 // 指定功能号{ bool rc = true; __try { __asm {ecx push ebx mov eax, 'VMXh'将ebx设置为非幻数'VMXH'的其它值 mov用于获取VMWare版本,当它为0x14时用于 获取VMware内存大 取VMware版本到eax//若上面指定功能号为0x14时,可通过判断eax中的值是 否大于 0,若是则说明处于虚拟机 中 cmp ebx, 'VMXh' // 判断 ebx 中是否包含VMware版本’VMXh',若是则在虚拟机 中 setz [rc] // 设置返回小 mov edx, 'VX' // 端口号in eax, dx // 从端口 dx 读值 pop ebx pop ecx pop edx } } __except(EXCEPTION_EXECUTE_HANDLER) // 如果未处于 VMware 中,则触发此异 常 { rc = false; } return rc;}测试结果:"J W ndows XP SP3 - V Mware Worlkststion冋頁回口囲【VMWar^?Virtual TC^密 Windows XP 5P3Mi I ruriTLing inside a Yirtn:il ma chine?确定 Info,rhTl'4iF:.帚肩■巳宣胃沁曲绑kM,分詛;T?面口「口图1如图1所示,VMDetect成功检测出VMWare的存在。

      方法二:利用IDT基址检测虚拟机利用IDT基址检测虚拟机的方法是一种通用方式,对VMware和 Vir tual PC 均适用中断描述符表 IDT ( In terrup t Descrip tor Table)用于 查找处理中断时所用的软件函数,它是一个由 256 项组成的数据,其中每一中断 对应一项函数为了读取IDT基址,我们需要通过SIDT指令来读取IDTR (中 断描述符表寄存器,用于IDT在内存中的基址),SIDT指令是以如下格式来存 储 IDTR的内容: 代码: typedef struct{ WORD IDTLimit; // IDT 的大 小 WORD LowIDTbase; // IDT 的低位地址 WORD HiIDTbase; // IDT 的高位地址} IDTINFO;由于只存在一个IDTR,但又存在两个操作系统,即虚拟机系统和真主机 系统为了防止发生冲突,VMM (虚拟机监控器)必须更改虚拟机中的IDT地址, 利用真主机与虚拟机环境中执行sidt指令的差异即可用于检测虚拟机是否存 在著名的“红丸"(redpill)正是利用此原理来检测VMware的Redpill 作者在VMware上发现虚拟机系统上的IDT地址通常位于OxFFXXXXXX,而 Virtual PC通常位于0xE8XXXXXX,而在真实主机上正如图2所示都位于 0x80xxxxxx。

      Redpill仅仅是通过判断执行SIDT指令后返回的第一字节是否大 于0xD0,若是则说明它处于虚拟机,否则处于真实主机中Redpill的源码甚是精简,源码分析如下:代码:#include int main () { unsigned char m[2+4], rpill[] = "\x0 f \x01\x0d\x00\x00\x00\x00\xc3"; // 相当于 SIDT[adrr], 其中 addr 用于保 存 IDT 地址 * ((unsigned*)&rpill[3]) = (unsigned)m; // 将 sidt[addr] 中 的 addr 设为 m 的地 址 ((void(*)())&rpill)(); // 执行 SIDT 指令,并将读 取后 IDT 地址保存在数组 m中 printf ("idt base: %#x\n", *((unsigned*)&m[2])); // 由于前 2 字节 为 IDT 大 小,因此从 m[2] 开始即为 IDT 地址 if (m[5]>0xd0) printf ("Inside Matrix!\n", m[5]); // 当 IDT 基址大 于 0xd0xxxxxx 时则说明程序处于 VMware中 else printf ("Not in Matrix.\n"); return 0;} 测试结果如图 2 所示:弓 W ndov/s XP SP3 - V Mware VVprkgtatfon |文祥旧歸[E) MiV) 曲卿筋且⑴固口门〕帮肋(刊1 B凹童 Windows XP 5P3命令提示静p: \Daciiments idt base: Bxf rnside Matrix!图2利用此 IDT 检测的方法存在一个缺陷,由于 IDT 的值只针对处于正在运行 的处理器而言,在单 CPU 中它是个常量,但当它处于多 CPU 时就可能会受到影响 了,因为每个CPU都有其自己的IDT,这样问题就自然而然的产生了。

      针对此问 题, Offensive Computing 组织成员提出了两种应对方法, 其中一种方法就是 利用 Redpill 反复地在系统上循环执行任务,以此构造出一张当前系统的 IDT 值变化统计图,但这会增加 CPU 负担;另一种方法就是 windows API 函数Set ThreadAffini tyMask()将线程限制在单处理器上执行,当执行此测试时只能 准确地将线程执行环境限制在 本地处理器,而对于将线程限制在 VM 处理器上就 可能行不通了,因为 VM 是计划在各处理器上运行的, VM 线程在不同的处理器上 执行时, IDT 值将会发生变 化,因此此方法也是很少被使用的为此,有人提 出了使用 LDT 的检测方法,它在具有多个 CPU 的环境下检测虚拟机明显优于 IDT 检测方法,该方法具体内容 参见下节内容方法三:利用 LDT 和 GDT 的检测方法在 《Intel® 64 and IA-32 Architecture Software Developer's Manual Volume 3A: Syst em Programming Guide》第二章的 Vol・3 2-5 一页(我的 Intel 开发 手册是2008版的)中对于LDT和GDT的描述如下(以下内容为个人翻 译):在 保护模式下,所有的内存访问都要通过全局描述符表(GDT)或者本 地描述符表(LDT )才能进行。

      这些表包含有段描述符的调用入口各 个段描述符都包含有 各段的基址,访问权限,类型和使用信息,而且 每个段描述符都拥有一个与之相匹配的段选择子,各个段选择子都为软 件程序提供一个GDT或LDT索引(与之相关联的段描述符偏移量), 一个全局/本地标志(决定段选择子是指向GDT还是LDT),以及访问 权限信息若想访问段中的某一字节,必须同时提供一个段选择子和一个偏 移量段选择子为段提供可访问的段描述符地址(在GDT或者LDT中) 通过段描述符, 处理器从中获取段性地址空间里的基址,而偏移 量用于确定字节地址相对基址的位置假定处理器在当前权限级别(CPL) 可访问这个段,那么通过这种机制 就可以访问在GDT或LDT中的各种 有效代码、数据或者堆栈段,这里的CPL是指当前可执行代码段的保护 级别GDT的线性基址被保存在GDT寄存器(GDTR)中,而LDT的线性 基址被保存在LDT寄存器(LDTR)中由于虚拟机与真实主机中的GDT和LDT并不能相同,这与使用IDT 的检测方法一样,因此虚拟机必须为它们提供一个“复制体”关 于 GDT 和 LDT 的基 址可通过 SGDT 和 SLDT 指令获取虚拟机检测工具 Scoopy suite 的作者 Tobias Klein 经测试发现,当 LDT 基址位于 0x0000 (只有两字节)时为真实主机,否则为虚拟机,而当GDT基址位 于0xFFXXXXXX时说明处于虚拟机中,否则为真实主机。

      具体实现代码 如 下:代码:#include void LDTDetect(void){ unsigned short ldt_addr = 0; unsigned char ldtr[2]; _asm sldt ldtr ldt_addr = *((unsig ned short *)&ldtr); printf("LDT BaseAddr: 0x%x\n", ldt_addr); i f(ldt_addr == 0x0000) { printf("Native OS\n"); } elseprintf("Inside VMware\n");}void GDTDetect(void){ unsigned int gdt_addr = 0; unsigned char gdtr[4]; _asm sgdt gdtr gdt_ addr = *((unsigned int *)&gdtr[2]); printf("GDT BaseAddr:0x%x\n", gdt_addr); if((gdt_addr >> 24) == 0xff) { printf("Inside VMware\n"); } else printf("Native OS\n");}int main(void ){ LDTDetect(); GDTDetect(); return 0;}测试结果如图3所示:3 0 0 dA起始页Windows KP 5P3'■ XP SP3 - VMware WorkststronPress ke t u cent in tiePl tp<; //blog, 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.