我正在尝试查找有关变质生成器的不同设计的参考资料,有人可以指出我正确的方向。我在 ACM 中浏览了一些论文,但找不到我要找的东西。
2 回答
如果您提到变形引擎,不幸的是我不知道有什么好的参考资料。我认为这源于该主题仍然是禁忌,因为病毒编写者通常如何使用它。我认为这是不合理的,因为这项技术本身就很有趣。我一直对自我修改和自我修复系统着迷。也可以说它与人工智能领域略有关系。
对于不知情的人来说,变形引擎是一个可执行文件,它本身会更改每个字节和指令,因此虽然新文件内容与上一代相比是唯一的,但整体算法是相同的。当病毒首次使用该技术时,反病毒软件供应商在识别病毒方面遇到了很大的困难,因为当每一代都不同时,简单地通过签名识别病毒是无效的。多态和变形病毒的引入标志着反病毒软件从通过签名识别转向启发式的时代。也就是说,与其查看确切的代码或字节流,不如尝试推断代码的作用。
在实现这样一个东西时会遇到几个问题,这取决于所使用的可执行格式和 CPU 架构:
一些 RISC 架构不能保存完整的 32 位立即数,因此代码段不可避免地会保存立即数的数据池,这是通过双重查找获取的。这是一个严重的阻碍,因为您需要一种明确地将代码与数据分开的方法。也就是说,某些数据值可以合法地表示为代码,反之亦然。如果您的程序链接到动态库,例如 C 运行时,您还需要重新计算重定位使用的信息,这很重要。
最大的问题是,对于每一代人来说,此类程序的规模往往呈指数级增长。如果最初的“简化器”算法(如下所述)做得不好,就会添加越来越多的垃圾代码。而“糟糕的工作”意味着它无法将代码完美地简化为原始代码。上一代的任何额外“膨胀”都会累积。
一般技术的工作原理如下:应用程序必须读取自身,并解析可执行格式(ELF、COFF、a.out、PE)。然后对每组N条指令,尽量简化算法。例如,值 X 的加法后跟 X 值的减法实际上是一个 noop,可以忽略。a*b+a*c
可以简化为a*(b+c)
,节省一条指令。所以这个简化器找到了整个算法的骨架,因为它之前经历了变质。
之后,您通过反向操作再次混淆代码。接受 N 条指令并将它们替换为具有相同功能的其他指令。其他阶段包括将数据立即拆分为几个部分,混淆字符串并将代码拆分为几个新函数,以及移动代码。所有这些都是在跟踪代码和数据引用的同时完成的。最后,代码被汇编并链接回它的形式作为一个可执行文件。
这是令人难以置信的复杂。仅适用于真正的铁杆汇编编码器。你被警告了。
寻找由 virii 作家编写的引擎:
1) z0mbie
2) mental driller (metaph0r)
3) vecna
也在谷歌上搜索“Project Bukowski”