其他多态变形技术

文档编号:

S001-F013

原作者:

flush / MGL

译者:

月中人[ptg]

审校:

 

发布时间:

2007-01-11

原文:

Other techniques of polymorphism

关键词:

多态引擎,暴力解密,操作码可变性,入口点隐藏,分布式解密器,置换

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

 

多态性是病毒必备性质之一。 Buz[FS] 为我们编写代码提出一些颇有价值的见解。[他的文章非常连贯,写得好。但是忽略了一些我们应该提到的东西。

l      暴力解密

使扫描复杂化的有趣方法,它的第一次面世是由于病毒IDEA - 因为它使用名为Idea的密码算法加密它的病毒体。它延长了模拟该解密算法所需时间,以致防病毒程序因为超时而中止其模拟器。因为即使是病毒自己也不知道解密器密钥,而是通过测试所有组合找出它。比如说它用一秒钟时间,而防病毒程序中的模拟器则要花上几十或几百秒 - 这当然是不可接受的。但是你要记住,防病毒程序可以因为发现解密器(或甚至更不明确的目标)而怀疑它是一个病毒,而且对于防病毒程序来说,根本没有必要暴力查找密钥。但是如果这个算法是相当多态的,而且防病毒程序在其中侦测不到任何模式,这确实会非常有效。

你也要记住,应该使用一个好的加密算法(不要用简单的异或),要不然的话,防病毒程序会在你的密钥查找程序结束之前完成密码分析。

l      操作码可变性

你最近可能听说:这个多态引擎使用 fpu 指令,那个多态引擎使用 pentium 操作码,还有其他使用 mmx 操作码的。所有这些听起来是不错,但是兼容性一点也不好。例如旧的CyrixAMD处理器根本没有MMX。而且有的pentium甚至486也没有mmx。在那些机器上你的病毒将会挂起 - 而这就是不知情使用者发现它的最佳方式。

没错,使用许多特效操作码是好办法,因为这样更难识别也更难跟踪。但是你不应该使用不兼容的操作码。该如何解决呢?好吧,我的建议是使用某些专门标志来启用那些额外的操作码。因为PE格式是基本i386兼容的,感染一般的文件时应该保持在这个层次。但是在病毒感染系统文件以便在新的计算机上给它自已安家(比如安装些DLLVXD)的时候,你可以尽量使用当前机器支持的操作码。因为这些文件没有机会(或机会很小)离开当前计算机。但是如果传送病毒,因为你不知道目标机器有什么样的处理器,所以应该保持与将要感染的原始文件相同的兼容性(检查它的PE头中CPU标志)。为此,你可以阅读我们有关操作码的其他文章。

 

l      入口点隐藏

现在,我们必须打破全世界公认的多态性最普遍定义。大家对多态病毒的理解是,病毒把固定部分存放在文件中,藉由解密器译码固定部分。用以避免病毒体被轻易地侦测到,因此防病毒程序必须侦测和分析多态引擎生成的解密器。但是这种理解不全对。虽然这是人们了解病毒的唯一方法,但是也有其他技术打破了这个规则。入口点隐藏,最早在Dark Avenger(事实上目前已知的多态发明者)Commander Bomber病毒代码中非常成功地做了示范。

Commander bomber的病毒体完全没有被加密(这对杀毒者来说是多么的幸运啊),但是实际上你找不到它。它只感染com文件,因此虽然可以通过扫描整个文件而发现病毒(这是该病毒的一个弱点),但是一般来说你不知道哪些才是病毒代码:它把几个代码片断分别放在宿主文件中某些地方,之间用一些跳转、有条件跳转和调用/返回相连接。同样一流的多态引擎生成这些代码片断,杀毒者难以识别它们是不是属于Commander bomberCommander bomber使用优秀的代码生成器,Dark想不加密病毒代码,但是恕我直言,不管怎样都因此而便宜了杀毒者。

使用这项技术的病毒不容易被扫描到,因为防病毒程序并没有载入整个文件(想想怎么在1MBPE文件上扫描),而仅凭跟随所有的代码片断无法从整体上了解病毒。

l      分布式解密器

这个方法有点类似于上面和解密程序一起提到的隐藏入口点。在普通的多态引擎中情形与图1类似,而分布式多态解密器则如图2

1

2





受感染宿主



解密器

加密的病毒体


受感染宿主的一部份

解密器的一部份


受感染宿主的一部份

解密器的一部份

受感染宿主的一部份

加密的病毒体


受感染宿主的一部份

分布式解密器这个主题的前奏曲已经由保加利亚的程序员Dark Avenger编写的Commander Bomber病毒(已经提到)吹响。(就我所知道)第一个现实的但没有充分实现的分布式解密器可以说是VyvojarOne_Half病毒,它的解密器被分割成10个部份。然而它太容易了,我们不应认为它是真正的多态,因为它的加密模式一目了然甚至连笨蛋都看得出来。不过即使它如此简单,也把杀毒者整得够呛。可能你还记得。

那么理想的分布式解密器应该是什么样的呢?想象一下,解密器散布在整个宿主文件中,没有特定的位置(当然是近乎没有),各代码片断通过有条件跳转和无条件跳转、调用、兼有线性结构和环路结构的循环、超时攻击、壳保护和反调试代码相互连接。说得容易,编起来难。但是为什么不试试?它的示范实例有Vyvojar的病毒EMM3 (Explosion Mutation Machine 3)

l      置换病毒代码

我们不能老停留在加密器级别的多态方式。多态的又一个级别 - 置换(如果你愿意,我们可以把它叫做多构的,polymorphical)病毒本体。它更容易做到每次生成的病毒完全地具有不同形式。EnderTMC:Level_42第一次做了演示,在这一期我们也提供了这个病毒 (或者修订版的TMC: Level_6x9 - 如果你知道Hitch Hiker的星系指南)TMC代表Tini Mutation Compiler(极微型变种编译器),其实这个名字不合适 - 因为它实际上是一个Mutation Linker(变种链接器)。它能够把它自己的代码在指令层次上打破成片断后放在不同位置,用原生的有条件跳转或生成的跳转来相互连接这些片断,并且链接所有的跳转和内存引用以修正偏移量。

我们可把置换定义为修改内存位置但保持病毒代码本身的代码流。这相当足以给扫描器带来大麻烦,因为它们必须捕捉所有的样本。通过扫描任何选择字串的杀毒方法可能会失败,因为病毒可以在一个字串里面被打断而不再被侦测到。为做到这一点,病毒必须把它自已的代码以某种可以置换的形式(含有链接信息)储存,或者有如何置换已连续代码的规则(以及保持链接信息方法)。

l      真正的多态

病毒体的每个实例真的能在指令层次上做到不一样吗?嗯,现在还没有任何病毒做这一点。不过我认为这是有可能的。因为有许多方法可以让你编出执行任务相同而在二进制和指令层次上却完全不同的子程序(它们甚至使用相同的算法)。最可能的方法是每次装配要使用某种预编译模板,而不使用它本身的代码作为模板(这也许是可行的,但也更难实现)。这些想法在NavrharASM vs. HLL一文中有更详细的讨论。