这种混淆方法叫什么?

逆向工程 拆卸 恶意软件 混淆
2021-06-24 09:59:20

最近看到如下代码混淆方法:

...
jump loc_1234
;-------------------------
         Bunch of junk
;-------------------------

loc_1234:
code continued...

混淆机制背后的逻辑看起来非常简单。一堆垃圾被插入到带有跳转指令的代码中以跳过它。我想,目的是混淆线性扫描反汇编程序和混淆文件。我想了解更多。有谁知道它叫什么?这种方法对现代防病毒软件的效果如何?

3个回答

这种反反汇编技术实用恶意软件分析一书(第 1 版第 16 章第 336 页)中被描述为具有恒定条件的跳转指令正如您所描述的,这个想法是有一个条件,即始终进行跳转,并在跳转后添加代码,这将在跳转位置生成错误的反汇编。由于反汇编器假定两个分支是一致的,因此它只会反汇编其中一个。

关于反病毒软件的有效性,他们大多使用模拟器。由于始终采用条件,因此模拟器将继续执行并查看正确的指令。

对此的一个变体是使用“分支函数”。基本思路如下:

  • 跳转指令“jmp L”转换为“call branch_fn”,在call指令后插入N字节的垃圾;
  • 被调用方 branch_fn 将 N 添加到其返回地址,然后返回。

这个基本方案可以用多种方式来阐述,例如:

  • 多次跳转可以使用同一个分支函数,可以有不同的N值(返回地址需要调整的量)。分支函数使用返回地址来识别调用点,从而识别正在考虑的特定跳转指令,从中它可以确定必要的调整量N(例如,使用基于返回地址的表查找)。
  • 应用于返回地址的调整量 N 不需要“以明文形式”存储,但可以通过表达式的评估动态计算。例如,使用完美的哈希函数将返回地址映射到调整值 N 可以生成非常难以理解的代码。
  • 分支函数不必调整自己的返回地址,因为这相对容易被发现。相反,它可以使用一系列调用 branch_fn0 --> branch_fn1 --> ... --> branch_fnK ,其中序列中的最后一个“到达”调用堆栈来执行返回地址调整。

但是,如上所述,这基本上是为了摆脱静态反汇编;它对动态分析没有太大作用。

另一个答案是,您正在查看手工编码的汇编程序,实际上并没有欺骗反汇编程序的努力。

当我进行代码汇编时,无论什么好的做法是,如果它是一小段代码,我会非常频繁地设置数据选择器以匹配代码选择器,并将我的数据直接嵌入到代码段中。例如,如果我正在编写实模式引导加载程序或其他一些短期代码,我尤其会这样做。

另一个我会这样做但仍然不会试图混淆事物的地方是一段漏洞利用代码。这允许我拥有可以可靠引用的变量,并且仍然拥有一段非常紧凑的 shell 代码。