黑客反汇编揭秘(第二版) 口软件开发人员使用的仿真器 驱动程序开发人员是最忠实的仿真器粉丝。内核是不允许出错的,否则,可能毁灭性地破坏整 个硬盘而导致多年积累的全部数据丢失而没有恢复的机会。频繁的重启与挂起是司空见惯的问题, 任何一位驱动程序开发人员都会对此习以为常了,就像火车工程师对车轮的卡嗒卡嗒声一样。此外, 大多数内核级调试器需要有两台通过LAN或者至少是零调制解调器电缆连接的计算机。两台计算 机对于一名专业开发人员来说,这算不上是一种奢侈。不过,把它们放在哪里好呢?不停地扭动脑 袋而向前后左右看,是很不舒服的。有时候,脑袋就好像要从脖子上被拧下来一样! 有了仿真器,事情就好办多了一没有数据丢失,几乎不需要重启系统,以及所有工作都可以 在一台计算机上进行。完全不重启系统几乎是不可能做到的。不过,在重启虚拟机时,在主机上做 些有用的事情(比如,更正驱动程序的源代码)则是可能的。除此以外,也可以在日志文件中写入 命令,而后通过检查这个日志来找出驱动程序崩遗的原因(遗憾的是,不是每个仿真器都具备发现 这种问题的能力)。 在FreeBSD的GENERIC核之中没有配调试器,因此,debug核会对FreeBSD引起副作用。在 这个内核中,虽然驱动程序可能运行正常,但是,在GENERIC内核中则可能崩溃。Windows调试 器的情况也差不多。可见,新驱动程序的最终测试应该在设置为“无菌”的环境中进行,而把开发 人员手中的所有调试与监视工具全部收起来。 那对于应用程序的开发人员又怎么样呢?仿真器让他们可以使用所有可用的操作系统。于是, 程序员就能够针对各个操作系统的行为特性定制自己的程序。在Windows世界,只有两个操作系 统系列,Windows NT系列与Windows9x系列。即便如此,程序员也很容易在操作系统的细节知 识中迷失方向,而且他们还必须让自己的脑子就像旋转木马一样转个不停。UNX操作系统的克隆 版数量更多,因而在这方面的情况会更加糟糕。 程序中的“bug”往往只是在某些配置下才会暴露自己。重新编译内核,或者安装一些附加软 件,就可以使它们“现出原形”。但是,这意味着,在发现“bug”之前,不能改变系统的任何东西。 这样的要求一般在主机中是很难满足的,不过,利用仿真器却能很容易达成目标。与网络(包括虚 拟网络)断开的虚拟机器不需要补丁。不过,应该如何交换数据呢?这个…你手边总是会有磁盘、 CD-R或者CD-RW刻录盘可用吧! 最重要的是,仿真器能够创建系统当前状态的“快照”,然后视需要在任何时候按任何方式去 访问这些“快照”。这样一来,就极大地简化了故障重建(即确定引起故障的情景)的工作。那么, 这样的快照与内存崩溃转储内容之间存在什么样的不同呢?从名称上就可以看得出,转储内容只是 包括内存,但快照却涵盖了系统的所有组件,包括磁盘、内存,以及控制器的寄存器等。 另外,网络应用开发人员也会对仿真器的应用感到欢欣鼓舞。早期,必须为测试人员另外配备 一台计算机(资深测试人员可以不配),并且尽可能详尽地向他解释清楚要按哪些键。现在,网络 应用程序的调试已经得到了最大限度地简化(如图3.4所示)。 贝黑客使用的仿真器 DG 仿真型调试器随着MS-DOS时代的来临而迅速流行起来。这没有什么好奇怪的!标准保护机 制使用两种主要的反调试技术一被动监测调试器与主动捕获调试资源,它们使调试操作无法进 30 溜客安全网WwW.I76Ku.CoM
第3章调试器与仿真器的仿真 行。这些方法在仿真型调试器上是不可用的,因为这类调试器不使用被仿真进程的任何资源,并位 于比虚拟处理器更低的地址空间(因而,它对于被调试的应用程序来说是不可见的)。 Ele Eat Power Snapshet yiew Window Help ■围D©日5n0nt2片96时n风过 winXFPm x hw线 N Modify build peoceas to control 1n211L1n3 #Wrep execution in an eval block to catcho 倍以n 1-L118 start 传 团巨后 图3.4在仿真器下调试应用程序 系统快照在破解用途有限的程序时是很有用的。黑客只需在计算机里安装程序,创建快照,重 置日期,并建立另外一份快照。然后,对这些快照进行比较,找出什么东西发生了变化,就能得 出结论。经过这样的操作之后,就有可能从程序之中删除保护代码。绕过保护机制的最简单途径 是,将受保护程序安装在一台独立的虚拟机上。接下来,就是创建快照!好家伙,就这些!黑客 想运行快照多少次就运行多少次,但程序总以为自己是第一次启动。仿真器是不会捆绑到硬件上 的,因为被仿真的硬件并不依赖于实际的硬件环境,这样一来,就为用户选用硬件设备提供了无 限的可能性。 与此同时,仿真器免除了黑客在自己的主机上安装待破解程序的必要性。一些程序在已经侦测 到有人在试图破解它时,会试图在硬盘上玩弄一些愚意的小把戏。即使它们不这样做,通常被破解 的命运也是不可避免的。那好吧,黑客会说,就让它们把仿真器下的系统搞瘫吧! 3.2.2硬件虚拟 幸运的是,前面所描述的人们对仿真器的低性能的厌恶,已经是陈年旧事了。20O6年中期。○ tel与AMD向大型服务器市场进军,发布了硬件虚拟技术。在做这件事情的过程中,他们引进了 31 溜客安全网WwW.I76Ku.CoM
黑客反汇编揭秘(第二版) 另外一个保护环,在该环之中,系统管理程序可以捕获所有需要引起注意的事件。实际上,这极大 地降低了仿真开销。目前,现代处理器的能力足以让我们仿真整个PC,以可以接受的速度来实时 地运行程序。现在,虚拟机的性能已经达到大约90%的主CPU的性能。这看起来太诱人了,不禁 使人产生一种无法抗拒的冲动,期待尽可能快地熟悉仿真器。而且,新的硬件虚拟技术已经得到 VMware5.5、Xen与其他几种产品的支持,有关这方面的内容在本章稍后还要详细介绍。 需要针对仿真器做些什么实验?如果不介意性能低的话,那么对硬件的要求只要适度就行了。 例如,若要求比较充裕地运行Windows2000与FreeBSD4.5,那么有主频为733MHz的Pentium IⅢ 处理器(VMware将它变成PentiumⅢ336MHz,而Microsoft Virtual PC将它变为PentiumⅢ187 MHz)就行了。这可以玩游戏Quake I了,尽管运行几乎处在一种行将垮掉的边缘状态之中。 即便是在今天,计算机的内存容量仍然是最为紧缺的资源。一般地说,主操作系统至少需要 128MB内存,每台虚拟机(也就是客操作系统)则要分配128~256MB内存。很自然,需要的内 存量与被仿真的操作系统类型有关。例如,如果仿真MS-DOS,只要4MB内存就足够了。而256MB 的内存容量,足以仿真在Windows2000或者任何类似操作系统上运行的Windows2000/XP/2003. 通常,硬盘空间不是一个很重要的问题。虚拟机不是为收集数据而创建的。除了很少的例外情 况,虚拟机只包含典型的操作系统安装程序与所需要的最小限度的附加应用程序,全部加起来所占 据的磁盘空间不会超过1GB。虚拟磁盘映像存储在一般文件中,仍然完全处于主操作系统的控制 之下。一般地说,只要有两种类型的虚拟磁盘一它们是固定磁盘与动态磁盘(用得很少)。在创 建固定磁盘时,仿真器立即将映像文件“传播”到所请求的磁盘卷中,即使映像文件不包含任何有 用信息。相反,动态磁盘只存储那些在映像文件中用到的虚拟扇区,以后随着实际数据的填充在必 要时再去扩充映像尺寸。这是一个有趣的领域,不是吗? 如果仿真器的性能很重要,情况会有所不同。为了享用硬件的虚拟能力,你需要有合适的处理 器。有一些型号的Intel处理器支持硬件虚拟,它们是Pentium46x2、Pentium D9xx、Xeon7xxx、 Core Duo与Core2Duo(Vanderpool技术),以及Itanium(Silvervale技术)。几乎所有在2006年5 月以后制造的AMD处理器(Socket AM2、SocketS1与Socket F一Athlon64、Turion64)以及2006 年8月以后制造的AMD Opteron处理器也支持硬件虚拟技术,这种技术称之为Pacifica。Intel与 AMD为自己实现的硬件虚拟技术所给出的官方名称分别是VT-X与AMD-V。 自然地,你应该为自己的处理器找一个合适的主板,或许还需要一个基本输入/输出系统 (BIOS)升级版。有些BIOS的实现形式允许用户选择激活或者禁用硬件虚拟支持功能。需要注意 的是,在有些BOS版本中,硬件虚拟支持的默认设置是“禁用”的。 在购买了所需的硬件并做好了使用的准备之后,就该选取合适的仿真器了。 3.3流行的仿真器 在所有可用的仿真器产品中,最为流行的莫过于DOSBox、Bochs、Microsoft Virtual PC与 VMware了。每种仿真器都有自己特定的功能、优势与劣势,当然也有自己的粉丝群体。 PDG 3.3.1 DOSBox DOSBox是提供源代码的免费仿真器软件。它只能仿真MS-DOS5.5这一个操作系统,主要用 32 溜客安全网WwW.I76Ku.CoM
第3章调孩器与仿真器的份真金 于运行旧版游戏程序。DOSBox不仿真硬盘(磁盘输入/输出的仿真以INT21h作为结束),因而 SoftICE在该仿真器上不可用。不过,cup386(用做可执行软件的解包器外加调试器,下载地址为 ftp:/ftp.elf.stuba..sk/pub/pc/pack/ucfcup32.zip)在DOSBox表现得很好(如图3.5所示)。另外, 还有一个集成的调试器是可用的(虽然可用,但是需要设置调试选项来重新编译该仿真器)。 4500.0 ggB0119 a×19B1 I-Halp r2-Bkpt F-Here Fu-Stey -m Fio-Menu 图3.5在DOSBox仿真器控制下启动的cpu386调试器(cpu386不能直接在Windows下启动) 看起来,专门提供这个仿真器的扩展版的可能性不大。不过,由于有结构良好的源代码可用, 这使得是否推出扩展版的问题显得不那么重要了。在使用过程中,完全可以根据自己的需要添加任 何功能(比如,实现一个虚拟硬盘)。 DOSBox支持的仿真模式大致有三种一全仿真、部分仿真与动态仿真。虽然完整地提供“全” 仿真功能是一种惯常的做法(毕竞,S0CE没法使用),不过,部分仿真模式对于绝大多数程序来 说已经够用了。这两种仿真模式都很可靠,挣脱仿真器钳制的可能性几乎为零。只是处于部分仿真 模式下的虚拟机的性能远远谈不上完美,这是因为733MHz的PentiumⅢ处理器降为13.17MHz 运行一慢了50倍。在“实况”处理器上运行代码的动态仿真模块还处在开发过程之中,目前的 版本还有很多错误,其中一些错误是致命的。因此,不提倡大家使用它,尽管它的性能比部分仿真 模式快了4倍。 DOSBox与外部世界之间的数据交换是通过直接访问CD-ROM或者在物理盘上为虚拟逻辑盘 装配目录来实现的。这些操作由仿真器通过INT21h接口来实现,借此抵抗恶意程序的攻击而确 保了运行的可靠性。这类恶意程序可破坏所装配的目录,但是不能破坏其他东西。 DOSBox适合于针对大多MS-DOS病毒(可能要将那些需要INT13h中断或者输入/输出端 口的病毒排除在外)做实验,也可以用于破解在实模式与保护模式下运行的程序。 33 溜客安全网WwW.I76Ku.CoM
为 黑客反汇编揭秘(第二版)》 3.3.2 Bochs 著名的Bochs是名副其实的面向专业人士的黑客仿真器。Bochs仿真器(如图3.6所示)创建 了一台全副武装的虚拟PC。即便只有一个物理CPU存在,它也能够仿真具有双处理器或者四处理 器的机器。此外,这是唯一可以在x86处理器上支持x86-64体系结构的仿真器。 罗Bocht lo Window:-Ditplay ☒ 监题留留简等工以巴δ he hash tahle entrin0561ardt4,5536t】 图3.6通过Bochs仿真器,就可以在x86处理器上运行x86-64版本的Linux-Debian 有必要指出的是,Bochs并不适合缺乏经验的人士使用,它实在是太复杂了。Bochs的整个配 置都是基于文本配置文件来完成的一从处理器的数量到虚拟磁盘的分布。 Bocs仿真器是一个源代码公开的非商业产品,并且仿真质量很棒。对集成驱动器电子 (integrated drive eletronics,IDE)型驱动器的软硬盘控制器的仿真,是在输入/输出端口级实施的, 这确保了在几乎所有低级程序上的兼容性。保护处理器模式是经过完全仿真的。SoCE(如图3.7 所示)可以在这个仿真器上平稳运行一尽管由于虚拟键盘不时冻结而使操作不那么稳定。与此同 时,Bocs仿真器还提供了一个很不错的集成调试器,该调试器可设置数量不限的虚拟断点与回溯 函数。 Bochs仿真器适合于探查病毒,调试运行在MS-DOS与Linux或FreeBSD终端模式下的故障 程序,以及做不同文件系统的实验(见图32)。 Bochs的完整源代码可以从http:/ochs.sourceforge..net免费下载。在这个站点,还有仿真器 的Windows版与Linux版二进制代码,是可以拿来就用的。令人感到遗憾的是,要在Bochs上运 行Windows2000,必须购买性能最强的处理器,即便如此,运行性能也低得令人失望。 以Bocs为基础,另外一个名为QEMU的优秀仿真器在市场上出现了。QEMU使用动态仿真 模式而将运行性能提高了数十倍。用不着深入研究技术细节,QEMU差不多可“编译”机器码。 然后,对于重复类型的运行操作,代码全速运行在“实况”硬件之上。在处理循环操作时,这样做 DG 所带来的性能增益是很大的。 34 溜客安全网WwW.I76Ku.CoM