algorithm - 变质发生器

标签 algorithm assembly artificial-intelligence self-interpreter

我正在尝试查找有关变形生成器的不同设计的引用资料,有人可以为我指明正确的方向吗?我浏览了 ACM 中的一些论文,但找不到我要找的东西。

最佳答案

如果您提到变质引擎,很遗憾,我不知道有什么好的引用资料。我认为这源于由于病毒编写者通常使用它的方式,该主题仍然是禁忌。我认为这是不合理的,因为该技术本身就很有趣。我一直对 self 修改和 self 修复的系统着迷。也可以说它与人工智能领域略有关联。

对于不知情的人来说,变质引擎是一个可执行文件,它会更改自身的每个字节和指令,因此虽然新文件内容与上一代相比是独一无二的,但总体算法是相同的。当病毒首次使用该技术时,防病毒软件供应商在识别病毒时遇到了很大的困难,因为当每一代都不同时,简单地通过签名识别病毒是无效的。多态和变质病毒的引入标志着反病毒软件从通过签名识别转向启发式识别的时代。也就是说,与其查看确切的代码或字节流,不如尝试推断代码做什么

在实现这样的东西时会遇到几个问题,这取决于所使用的可执行格式和 CPU 架构:
一些 RISC 架构不能保存完整的 32 位立即数,因此代码段将不可避免地保存立即数的数据池,这是通过双重查找获取的。这是一个严重的阻碍,因为您需要一种方法来明确地将代码与数据分开。也就是说,一些数据值可以合法地表示为代码,反之亦然。 如果你的程序链接到动态库,比如 C 运行时,你还需要重新计算重定位使用的信息,这是非常重要的。
最大的问题是,对于每一代,此类程序的规模往往呈指数级增长。如果最初的“简化器”算法(如下所述)做得不好,就会添加越来越多的垃圾代码。而“糟糕的工作”意味着它无法将代码完美地简化回原来的状态。上一代的任何额外“膨胀”都会累积。

一般技术的工作原理如下: 应用程序必须自行读取并解析可执行格式(ELF、COFF、a.out、PE)。然后对于每组 N 条指令,它试图简化算法。例如,值 X 的加法和值 X 的减法实际上是空操作,可以忽略。 a*b+a*c可以简化为a*(b+c),节省一条指令。所以这个简化器找到了整个算法的骨架,因为它之前经历过变质。
之后,您通过执行相反的操作再次混淆代码。获取 N 条指令并用其他执行相同操作的指令替换它们。其他阶段涉及将数据即时拆分为几个部分、混淆字符串并将代码拆分为几个新函数,以及四处移动代码。所有这些都是在跟踪代码和数据引用的同时完成的。最后,代码被组装并链接回其作为可执行文件的形式。

这是令人难以置信的复杂。仅适用于真正的硬核汇编编码器。您已收到警告。

关于algorithm - 变质发生器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1892576/

相关文章:

c - 在 C 中实现互斥锁

image-processing - 人车识别

algorithm - COLCOIN - 收集硬币

arrays - 具有最大乘积的行列或对角线

assembly - 如何遍历汇编中的字符串,直到到达null? (strlen循环)

c# - 理解 Minimax 算法

algorithm - Markov Decision Process : value iteration, 它是如何工作的?

c# - 幂集生成函数的时间复杂度

string - CodeJam 2014 : How to solve task "New Lottery Game"?

linux - 使用断点和符号调试时的gdb问题