首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

在考虑选择一个仿真器时,黑客们通常考虑如下的问题:安全性,可扩展性,是否有源代码,速度和仿真质量,是否有内置的调试器,以及使用快照机制的灵活性。

3.2.1  安全性

当你在一个仿真器中运行一个具有侵略性的程序时,很难不去想它是否会失去控制而摧毁整个系统。这种担心是很正常的。许多仿真器(例如DOSBoxVirtual PC)包含一些“漏洞”,允许被仿真的代码直接访问仿真器本身的内存(例如,提供这样的功能,即在仿真器特许下,在仿真器端调用宿主操作系统的任何API函数)。然而只有特别设计的程序能够中断仿真器。因此,虽然理论上存在这种危险,在实践中却不能实现。这种可能性接近于零,因为眼下仿真器的流行程度还不至于引起攻击者认真地攻击它们。

网络通信的情形则与此不同。虚拟局域网(LAN)的仿真保留了宿主操作系统的所有弱点。因此,网络蠕虫能够轻易地攻击它们!所以,宿主操作系统必须与虚拟LAN隔离。这种方法使虚拟机与外部世界的交互变得非常复杂。因此,这种可能性经常被忽略。顺便说一下,绝大多数的个人防火墙都不能控制虚拟LAN,不能保护它们免受攻击。

有些仿真器允许通过实现共享目录机制来与虚拟机进行交互。在这种情形中,宿主操作系统的目录是可见的,被看成是逻辑盘或者网络资源。虽然这种方法有许多的优点,但显然它是不安全的。因此,并未受到黑客们的欢迎。

3.2.2  可扩展性

为专业人士而设计的仿真器必须能够连接模拟非标准设备(比如HASP)的外部模块。这对于研究Star Force 3之类的保护机制来说是特别重要的。这类保护机制直接与硬件通信,并与其行为的特定方面绑定在一起。普通的仿真器通常不会意识到这种行为。

有些仿真器是可扩展的,而有些却不是。但是,即使是最具有可扩展性的仿真器也只能提供非常有限的扩展和配置能力,而且也只有很少的文档(如果有的话)。造成这种现象的原因可能是因为可扩展性很少被要求,需要这种特性的人也很少。毕竟仿真器并不是专为黑客开发的。这真是太不幸了。

3.2.3  是否有源程序

如果有源代码,那么可以部分地弥补糟糕的文档质量和仿真器的可扩展性所带来的问题。如果所测试的程序不能在仿真器中运行,那么源代码就可以帮你弄清楚出了什么问题,并修改其中的漏洞。另外,还可以在仿真器中安装需要的工具集。例如,可以增加内存转储程序和后向追踪程序,后者能使你进行反方向的程序追踪(这对黑客可真是很方便!)。源代码还能够实现动态地增加新处理器的未归档机器命令和指令集,你不认为这很酷吗?

令人遗憾的是,商业的仿真器并不提供源代码,而开放源码的仿真器都还处于初级阶段,因而都不适合用于解决严重的问题。

3.2.4  仿真质量

不能运行SoftIce的仿真器对黑客来说又有什么用处呢?虽然也可以使用其他的调试器(例如,OllyDbg),但是它们的功能要少很多。而且,有的保护程序根本就不能在质量糟糕的仿真器中运行。

为了提高仿真速度,大多数的开发人员都有目的地减少仿真命令集,仅仅提供需要的指令(特别是保护模式的特许运行指令、包括多媒体指令在内的数学协处理器命令,以及一些很少用到的实模式指令)。因此,辅助寄存器、追踪标志和许多其他的功能都很少被实现。然而,这样的仿真器还是比玩具要强。例如,它们可以作为“检疫”区,用来测试新下载的程序是否含有病毒(如图3.2所示),或者作为测试环境,用来做与不同的磁盘工具(比如磁盘编辑器)相关的试验。

3.2  测试VMware仿真器创建的虚拟机

商业仿真器主要利用动态仿真机制,即它们仅仅仿真特许运行指令,而在“真的”处理器上允许其他的所有指令,将它们运行在虚拟端口构成的“篱笆”所包围的孤立地址空间的阴暗地带。这在相当大的程度上提高了运行效率,并自动地增加了对最新的多媒体指令的支持(假设安装在计算机上的物理处理器支持多媒体指令)。

同时,仿真器(甚至动态仿真器)在处理异常、处理使用命令的标志,以及处理非法寻址方法等方面的行为表现经常与物理处理器不一样。保护代码可以揭示这一点。不过,如果保护程序拒绝在仿真器中执行,那么大多数的合法用户就会对此不满,因而会给其开发者带来许多问题。

3.2.5  一个内置的调试器

保护程序采用各式各样的方法来抵御调试器、反汇编器、转储程序,以及其他的黑客工具。它通常不会降低至ring 0,虽然有些保护机制(例如,eXtreme Protector)甚至会在ring 0上运行。有几十种方法(或者更多)能够使调试人员发疯,而且这些方法是很难破解的,特别是对于刚刚开始黑客生涯的新手来说,更是如此。

仿真器的威力在于它完全控制执行的代码,因此普通的反调试技术在此毫无用武之地。此外,被仿真的硬件处理器的局限并不会延伸到仿真器。特别地,“硬件”断点的数量并不需要像x86一样一定是四个。在需要的时候,仿真器可以支持几千个甚至几百万个断点,而且它们的条件可以是任何需要的奇异条件(例如,可以紧跟在对应于if (my_func())语句的TEST EAX,EAX命令后面的Jx指令处弹出)。

自然,为了这种目的,仿真器必须装备一个内置的交互调试器。任何其他运行在仿真器中的调试器(例如,SoftIce)都不会有额外的优点。可用的集成调试器是很少的,并且都没有提供比Debug.com更好的功能,而且往往比Debug.com更差。因此,我建议只有在普通调试器不能帮你克服保护问题的特殊情形下,才使用这类调试器。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论