计算机仿真器是非常棒的东西!无论你是高级用户、管理员、程序员,甚至是具有侵略性的黑客,仿真器都将营救和帮助你。惟一的问题是何时和如何帮助你。这就是我现在要谈论的话题。仿真器已经有了很广的用途,并不会失去其地位。相反,它们的数量似乎每天都在增长。我不会推销任何特定的仿真器。请根据自己的特定目的来选择最合适的仿真器。我将描述仿真器能做什么,换句话说,如何合理地使用仿真器。
3.5.1 一般用户使用的仿真器
设想你已经打开一些计算机杂志,正在阅读关于一个很酷的游戏的文章。你设法获得了这个游戏,很急迫地安装到你的计算机中,忽然发现它不能在你的操作系统中运行。这太扫兴了!FreeBSD的用户所处的情形最糟了,因为在该操作系统下只有很少的几款游戏。你如何解决这样的问题?在硬盘中还有安装Windows的空间,但是每当你要玩游戏时,都必须重新启动操作系统。我可不愿这样干!如果该游戏是给Mac机或者索尼PlayStation设计的,又当如何呢?可喜的是,现代计算机允许你在任何的“土著”硬件中仿真整台计算机(如图3.8所示),因而能发现一个无限大的软件世界。现在,你不用局限于一个特定的平台,而且能启动任何的程序,不论它是为何种计算机(ZX Spectrum还是X-Box)编写的。

图3.8 你的工作操作系统是什么并不重要,重要的是仿真器
主操作系统成了寄宿操作系统的基础。这个“旅店”的一个房间必须分配为隔离区。我们都知道,当安装一个新程序时,操作系统经常会出现问题,这可能是因为没有正确地使用安装程序、函数库之间存在冲突、广告软件或者只是因为偶然因素(比如因果报应)。只要能从其他渠道获得程序,就尽可能地不使用从不可靠的渠道获得的程序,这种做法是很明智的。只需在仿真器中分配一个单独的虚拟机,这类程序就不能摆脱虚拟机!
3.5.2 管理员使用的仿真器
从管理员的观点来看,仿真器主要是各种不同试验的测试区域:安装几十个不同的UNIX变体,并彻底地测试它们。安装一个系统,删除它,然后再重新安装,稍微修改一下其配置。为了获得一份工作,你不仅要有文凭,是你所工作的领域的一个专家,而且还必须具有实际工作经验。对于数据恢复方面的工作来说,也是如此。如果没有进行特殊的准备工作,并不推荐你在你的主操作系统中运行Disk Editor(对于Disk Doctor来说,更是如此)。这是因为,不能保证这类工具能够修正磁盘错误,而不会弄坏你的磁盘。简单地说,仿真器是很好的测试区域,这在过去是难以成真的美梦。
在大型机构中,管理员通常都有镜像服务器,所有的补丁程序都首先会在镜像服务器中进行测试。小型机构难以负担用于这种目的的额外机器。在这种情形中,仿真器就可以大展身手。此外,仿真器还可用于测试各种不同的试验程序。如果证实了程序的弱点,就可以采取紧急措施来改正它。
虚拟机与主操作系统和其他虚拟机之间的交互一般通过LAN(也是虚拟的)来进行。假定你的计算机有512 MB~1024 MB的RAM,就可以通过结构化查询语言(SQL)和Web服务器、一个“隔离带”、一个防火墙和几个工作站来创建一个内部网模型(如图3.9所示)。这个测试完全适合于在一台家用计算机中进行。换句话说,对于测试目的来说,仿真器比任何东西都适合。在仿真器中,你既可以攻击,也可以管理网络。
3.5.3 软件开发人员使用的仿真器
驱动程序开发人员是最喜爱仿真器的人群。内核不仅不会自行修正错误,还会报复性地破坏整个硬盘,使得多年积累的数据毁于一旦而不可恢复。对于驱动程序开发人员来说,就像铁道工习惯于火车轮子的咔嗒声,频繁地重新启动和死机是司空见惯的。另外,大多数内核级调试器都要求两台通过LAN或者至少调制解调器相连在一起的计算机。当然,从专业开发人员的观点来看,使用两台计算机并不是过分奢侈。然而,你如何摆放它们呢?不断地左右转动脑袋并不是一件舒服的事情。有时,这就像要将你的脑袋从脖子上拧下来一样!

图3.9 虚拟网络的一个示例
使用仿真器就容易得多。不会损失数据,不用重新启动,而且所有工作都可以在同一台计算机中完成。当然,完全不重新启动计算机是不可能的。然而,当重新启动一台虚拟机时,你可以在主机中做一些事情(比如,修改你驱动程序的源代码)。此外,还可以将命令写到日志中,通过检查该日志就能发现什么问题导致驱动程序出错(令人遗憾的是,并非所有的仿真器都支持这种查错方法)。
在FreeBSD的GENERIC内核中没有调试器,而debug内核在系统中引入了副作用。在该内核中可能正常工作的驱动程序,却可能在GENERIC内核中出错。Windows调试器的表现也与此类似。因此,新驱动程序的最终测试必须在“无菌的”配置中进行,使得开发人员不能使用任何的调试和监测工具。
对于应用程序开发人员又如何呢?仿真器允许他们使用操作系统的所有功能。因此,程序员能够根据每一个操作系统的特定行为特征来定制他们的程序。在Windows世界中,只有两类不同的操作系统家族,即Windows NT和Windows 9x。即使在这种情形下,依然很容易迷失在细节中,开发人员会变得思维混乱。UNIX变体的数量更大,情形就更加复杂。
程序漏洞的讨厌之处就在于它们只会在一定的条件下出现。安装额外的程序,而不重编译内核,就可能“把它们吓跑”。这就意味着在发现程序漏洞之前不能修改系统的任何东西。在主机中很难满足这种要求。然而,在仿真器中就能轻易地实现这一目标!与网络(包括虚拟网络)断开的虚拟机不需要补丁程序。可是,在这种情形中,如何进行数据交换呢?其实,你手边总有软盘和CD-R或者CD-RW可用。
最重要的一点是,仿真器能“创建”系统状态的快照,并随时随意地返回快照所记录的系统状态。这大大简化了重现错误的任务难度(换句话说,就是确定发生问题的条件)。这样的快照和出错内存转储有什么区别呢?根据其名称,转储仅仅包含内存信息,而快照包含系统所有部分的信息,包括磁盘、内存和控制器的寄存器。
仿真器也可以减轻网络应用程序开发人员的工作难度。在过去,需要给一些测试人员(符合资格的测试人员除外)提供第二台计算机,并向每一个人解释需要按哪些键。现在,调试网络应用程序已经尽可能地得到了简化(如图3.10所示)。

图3.10 在仿真器中调试程序
3.5.4 黑客使用的仿真器
仿真调试技术出现于MS-DOS时代,并立即大行其道。这并不令人吃惊!标准的保护机制使用两种主要的抗调试技术,即被动检测调试器和主动获取调试资源,使调试不可能进行。这些方法对仿真调试器都无能为力,因为仿真调试器不使用被仿真进程的任何资源,并且处于比虚拟处理器更低的层面(因此,对于被调试的程序来说,它是不可见的)。
系统快照对于破解使用时间有限的程序是极有帮助的。安装程序,创建快照,重置时期,再生成另一个快照。然后对比这两个快照,看看有什么改变,就能得出结论。之后,就能从程序中删除保护代码。绕过保护的最简单的方法如下:将受保护的程序安装到一个单独的虚拟机中。创建快照。这就成了!你可以无限多次地运行该快照,而那个程序会认为它只是第一次运行。不可能与硬件关联在一起,因为被仿真的硬件并不依赖于实际的硬件环境;因此,这就提供了很多选择后者的可能性。
同时,仿真器还避免了在你的主计算机中安装要破解的程序。如果检测到有人试图破解它,有的程序就会试图在硬盘上做手脚。即使他们不这样做,程序也会死机。因此,最好让他们在仿真器中出问题。
3.5.5 如何在VMware中配置SoftIce
当想要在从VMware中启动的Windows 2000中使用SoftIce时,你会遇到很多的问题。SoftIce只能在最大化到整个屏幕的文本模式下运行(启动FAR管理器,按快捷键<ALT>+<ENTER>,然后按<CTRL>+<D>)。在所有其他的模式中,它都会使系统死机。在Windows 98中,它运行正常;但是,移植到Windows 98却是一个根本不能考虑的方法。
这是SoftIce的一个众所周知的漏洞,NuMega承认这是一个问题,但是仅在Driver Studio 3.1版中进行了修正(根据官方信息,这是“VMware支持”)。可以在文档(参见\Compuware\DriverStudio\Books\Using SoftIce.pdf,附录E“SoftIce与VMware”)中找到详细的信息。除了该文档中所说的,还必须在虚拟机的配置文件(virtual_machine_ name.vmx)中添加如下的字符串:svga.maxFullscreenRefreshTick = "2"和vmmouse.present = "FALSE"。
3.5.6 用于其他设备的仿真器
除了PC仿真器之外,还有许多的仿真器,分别用于仿真移动电话、个人数字助理(PDA),以及控制器等(图3.11显示了其中的一种)。比如,考虑一部手机。它并没有包含开发工具。这就意味着通过按它的键是不可能进行编程的(而且其中也没有安装开发环境的空间——处理器的速度和内存资源都不足够)。在这种情形中,仿真器提供了惟一可用的方法。这不仅是方便的问题,而且是生存的问题!

图3.11 内置设备的Z80仿真器






