• 标 题:多态引擎如何工作在病毒中(译)
  • 作 者:virtualspace
  • 时 间:2003年9月27日 09:27
  • 链 接:http://bbs.pediy.com

小弟截译了一篇短文,虽然东西较老,但可能对于初次了解多态引擎的原理有点益处。由于水平很低,各位大侠多多包涵,不清楚的地方,敬请参见原文,谢谢。
www.fuhs.de/en Encryption Generators Used in Computer Viruses Part 2
Copyright (C) 05/1995 by Howard Fuhs

内置变化引擎 
以下我们通过一个简单的实例来演示多态引擎时如何在病毒中工作的。这个演示用的引擎(我们取名MutaGen变换器)很简单,它仅需要几个参数去初始化,为了它能够运行,下面的语句应该在你的病毒源代码开始处放置: extm -MUTAGEN:near
MutaGen 要求如下的参数来初始化: 
·  DS:DI = 被加密代码的地址
·  ES:DI = 被加密代码的区域. 分配足够的空间用于加密模块的工作。缺省长度 40 - 180 字节.
·  CX 代码的总长度.
·  DX 加密模块的内存偏移地址.
当 MutaGen工作完成后,CX 包含被加密代码和解密钥的长度, DS:DX 指向被加密的程序. 
 
变化器如何工作 
为了保护一个病毒有效地隐藏自身避免被扫描程序捕获一个多态引擎必须具有许多功能: 
  
·  1. 特征性固有代码必须被加密.
·  2. 加密必须采用不同的加密键key甚至不同的算法,由此,经处理的加密部分,看上去没有两个相同的加密实例存在,即每次加密过的病毒代码完全不同。
·  3. 解密程序必须是改变的,它的生成基于每一个新产生的加密模块,去保证对应的正确解码,维持固有的功能特性。任何两个解密程序应该具有足够的相异性.
如果上述2,3条没有包含在病毒中,这个病毒很容易被检查程序通过扫描字符串发现
病毒包含解密程序去还原自身代码,多态引擎是内嵌在被加密的病毒体之中。
当程序执行时,如下的事件将会发生: 
程序开始处,一条直接跳转指令JMP首先将IP转到解密程序,它解密包含由多态引擎的病毒程序。一旦病毒代码被解密,它就可以象任何其他程序一样被执行在它完成自己的使命后,转交控制权给原先被感染的程序。 
病毒感染一个文件,首先在目标程序开头写一个跳转命令jmp,简单的方法,可以是指向被感染文件的结束处,因为这里准备放入病毒自身的代码。下一步是调用多态引擎去产生一个使用新的加密方法加密的病毒体和相应的解密键KEY,并将他们合并到被感染的程序,最后在病毒执行代码结束处设置jmp指令,返回被感染程序.
以上是对多态引擎很简单的描述. 
 
多态加密程序
多态加密程序采用几种不同的加密算法去加密病毒代码. 这不仅是为了阻止病毒被发现,也是为了能够以尽量小的代码量产生更多的不同的被加密的病毒版本(实例)。为了产生更多的变化,这个过程需要许多不同的变量来初始化。比如利用日期,时间,被感染文件的大小等等不确定因素来保证最大可能的变化性.病毒可能会根据一个结论来决定是否继续繁殖自身。因为在一个固定的环境下,可能不再有适合的可变化因素提供产生足够多的不同加密方法。
 
垃圾代码生成器(混淆器) 
病毒代码的加密依然不足以对抗字符串扫描。多态引擎的最弱一环是它自身的解密器.因为解密器本身需要首先用于转换被加密的病毒代码到可执行代码,它必须是可执行的,同样的解密程序被用于所有被加密的病毒中,扫描器可能通过字符串扫描发现这个解密器的特征,它的加密是个大问题。因此,为了避免解密器被侦测,需要在其中插入足够的无意义的代码片断和指令(如NOP 或者 MOV BX:BX)这些合法但没什么作用的代码,去迷惑扫描器。许多多态引擎带有垃圾代码生成器(混淆器)以一定的规则参照执行主机的特性去改变解密程序的代码同时保留它的完整功能性. 这里的一个基本条件是需要一个伪随机数发生器去随机地产生和插入程序代码到解密程序中。还有更多的技术用于保护解密程序不被扫描器发现。
 
不同的加密程序 
使用一组相同的加密指令,但不断改变被使用的寄存器,如此增加了许多病毒的特征
在被加密的程序中使用许多可交换的代码片断,一个代码片断可以出现在不同的程序位位置,整个执行效果相同,因此,对于一个解密器,许多代码执行序列是有效的。
更好的方式是组合各种有效的方法去增强病毒的随机变化性。