是汇编语言还是HLL

文档编号:

S001-F014

原作者:

Navrhar

译者:

月中人[ptg]

审校:

 

发布时间:

2007-01-11

原文:

Assembly language or HLL

关键词:

多态,跨平台,预编译,链接,实时编译,代码变形

原文链接:http://vx.netlux.org/lib/static/vdat/miscella.htm#polyinvir

l       简介

如果说即使象PE文件这样复杂的目标我们尚可对付,那么我们现在的遗憾就是,能感染Intel平台上的文件的病毒却不能在其他平台上传播。这个公理罕见的例外是Esperanto病毒(Sandman先生发布在29A Nr. 2),它是最早出现的这类病毒,能够在各种不同的平台和处理器上传播。崇拜Sandman先生,但不幸的是,这种方式不能够用于较大的项目。整个Esperanto的由两个基本组成部分实现 - 一部分用于intel处理器,另一部份用于Mac处理器,必需代码的大小几乎增加一倍。它似乎不是理想的解决方案,想象一下为三种处理器准备的50KB病毒代码,结果将是高达到大约 150 kb 的特大病毒。

l       要点

我想使用另一种方式解决这个问题。我的方式会更难(但不是不可能)编码。在此声明一下,我还不准备亲自参与这样的一个计划(没有时间和勇气)。我想找一些能吃苦的新人来做。要点很简单 - 我们应该携带处于某种预编译状态的代码体,它应该是容易被翻译到每一个目标处理器的汇编语言的。

想象一下,我们有一个C语言编译器,它产生的输出介于C语言和汇编语言之间的层次。"介于C语言和汇编语言之间"意谓,代码被装配之前必须先用特殊的C语言编译器编译。事实上可以做到,结果代码应该是最基层的,因为我们需要用它在高层的各种不同体系结构上装配病毒。因此代码应该独立于寄存器和存储器寻址模式。我最喜欢的一个模型是有直接存储器寻址模式(只有栈顶数值是一个存储器地址)的栈机器(使用RPL - 逆波兰式逻辑)和。当然,这意味着编译后“代码”将会比正常的intel代码更大。

这样,为若干个处理器准备的结果代码就会有相当高的可变性(因为以后每一个翻译都可能变成使用另外的指令或寄存器)。而且,这种情况下结果代码将会十分接近用C语言编译器生成的代码 - 近乎标准的栈框架,栈、寄存器、变量的使用也是相似的,等等 - 如果没有进一步的分析,仅凭启发式技术将会很难区别它们。而且辨别各变体甚至将会更难(如果不说是不可能的话)[注:由于这种真实性以及没有使用Encryptor/Decryptor]因此对于使用复杂化的(而且不可模拟的)多态程序如解密器之类的问题就没有必要考虑了。为了不成为简单目标,唯一需要做的就是,把“源码”(因为它的性质或多或少是静态的)编成密码,并且仅当需要复制时才解码。

当然,预编译的“源代码”必须含有全部所支持处理器的“汇编器”。汇编器 - 作为病毒体的核心 - 使病毒具有可变性和复杂性,因此汇编器的好坏决定了侦测该病毒的难易。这就是为什么virii可以存在很久的原因。要做一流的多态程序只有5KB左右是不够的。这(或许)就是为什么这样的病毒不通过电子邮件传播。但是除此之外,代码与标准语言是非常地相似的。你不需要处理通常的感染文件问题,因为你可以把数据区链接到任何需要的地方,因此不必使用可写入的代码段 - 在我看来这是最有效的启发式标志。

l       实时编译

另一个潜在可能性是在运行时编译代码 - 你不需要在宿主文件中加入全部的编译后代码。你可以在需要的时候再编译其余部分。至少,这样可以少增加文件尺寸。我不能保证这样是不是足够安全、不被发现,但是我认为编译过程的复杂程序足以大大减慢仿真过程,而且可能使扫描速度慢得让人无法接受,因此对方只好另觅新的侦测方法。

l       代码变形

另外的一个优点是可以最大限度地修改的预编译代码。因为你完全知道你代码的意图,以及可以对它做什么类型的修改。因为新的病毒从它的父母那里继承代码,经历10世代之后,现有变体之间将会有一个非常大的差异。只须想象一下块排列(模块或仅仅函数)和较小的代码改变,如c=a+b -> c=b+a。我想从父母到孩子就足以完全改变virii的外观,更不必说远亲变体之间的差异。而且还可以有更复杂一点的变化 - 当然,这取决于源语言和你。

l       缺点 — 尺寸

在我看来,主要缺点是尺寸。因为用来实现它的技术太难了,我甚至不指望结果代码小于50KB,恕我直言,现如今尺寸是小问题。首先你不能使用邮寄策略传播它本身。下载150KB的邮件需要花点时间 :-(。我听说,300KB算不上什么,不久到处会是100MBs的媒体,但是主要限制因素是软盘和英特网,在我们生活的现实世界里,3KB/s是高速 (家庭上网使用33KB调制解调器是很平常的)

在干扰层上会有一些问题 (在该层面上,宿主和病毒直接相接触)。我们还没有依据来断定,它是可以完全由编译器控制,或是需要特别处理依赖不同平台PE格式的代码。但是这应该不是个大问题。

l       最后来点科幻:

或许,我们开始所有的这一切的第一个动机是探索如何实现病毒遗传。这会让你更好地控制代码模块化和代码换代。我们的最远理想是产生能够为了最优化自身和适应当时环境而交换模块的virii。这会让你有更高的存活率,但需要你为它创造强而有效的基因交换环境 - 这是困难的。现在回到真实世界......

l       结束语

现在有以下结论。预编译代码的主要优点是跨平台感染的潜在可能性。此外,这种方式至少在今天的多态引擎级别上开创了又一个新级别。在永恒的“隐藏身体游戏”中,相对于建造“防弹”墙式的对抗代码,它朝着给予病毒体“环境适应颜色”的方向走得更远。它决不会降低代码的可变性。由于具有上述性能,这个方法导致出现类TMC的病毒。

另一个附加好处就是,用HLLHigh-Level Language高级语言)编程比较舒服、而且更快,更可读。如果不提到基地址独立的话是这样 :-)

考虑一下!