我试图找到关于变形发生器的不同设计的参考,有人可以指出我正确的方向.我在ACM看过一些文章,却找不到我要找的东西.
如果你提到变形引擎,我很遗憾不知道任何好的引用.我认为这源于主题仍然是禁忌,因为它通常被病毒编写者使用.我认为这是不合理的,因为这项技术本身就很有意义.我一直对自我修改和自我修复系统着迷.还可以说它与人工智能领域略有关系.
对于不知情的,变形引擎是可执行文件,其自身改变每个字节和指令,使得新文件内容与前一代相比是唯一的,整体算法是相同的.当病毒首次使用该技术时,反病毒软件供应商在识别病毒方面遇到了很大的麻烦,因为当每一代产品不同时,通过签名简单地识别病毒并不是有效的.多态和变形病毒的引入标志着反病毒软件从签名识别转向启发式的时代.也就是说,您宁愿尝试推断代码的作用,而不是查看确切的代码或字节流.
在实现这样的事情时会遇到几个问题,这取决于所使用的可执行格式和CPU架构:
某些RISC架构无法保存完整的32位即时,因此代码段将不可避免地保留数据池,使用双重查找获取.这是一个严肃的显示阻止,因为你需要一种方法来明确地将代码与数据分开.也就是说,一些数据值可以合法地表示为代码,反之亦然.如果你的程序链接动态库,比如说C运行时,你还需要重新计算重定位所使用的信息,这是非常重要的.
而最大的问题是这些程序往往会以每个新一代的规模呈指数级增长.如果初始"简化"算法(如下所述)做得不好,则会添加越来越多的垃圾代码.而"糟糕的工作"意味着它无法将代码完美地简化为原始代码.来自上一代的任何额外"膨胀"累积.
一般技术的工作原理如下:应用程序必须自己读取,并解析可执行格式(ELF,COFF,a.out,PE).然后,对于每组N条指令,它尝试简化算法.例如,添加值X后跟减值X实际上是一个noop,可以忽略.a*b+a*c
可以简化为a*(b+c)
,保存一条指令.因此,这个简化器找到了整个算法的裸骨架,因为它先前经历了变质.
然后,通过执行相反操作再次对代码进行模糊处理.接受N指令并将其替换为执行相同操作的其他内容.其他阶段涉及将数据immediates分成几个部分,混淆字符串并将代码分成几个新函数,以及移动代码.所有这些都是在跟踪代码和数据引用的同时完成的.最后,代码被组装并链接回其形式作为可执行文件.
这令人难以置信的复杂.仅适用于真正的铁杆装配编码员.你被警告了.