最近看到如下代码混淆方法:
...
jump loc_1234
;-------------------------
Bunch of junk
;-------------------------
loc_1234:
code continued...
混淆机制背后的逻辑看起来非常简单。一堆垃圾被插入到带有跳转指令的代码中以跳过它。我想,目的是混淆线性扫描反汇编程序和混淆文件。我想了解更多。有谁知道它叫什么?这种方法对现代防病毒软件的效果如何?
最近看到如下代码混淆方法:
...
jump loc_1234
;-------------------------
Bunch of junk
;-------------------------
loc_1234:
code continued...
混淆机制背后的逻辑看起来非常简单。一堆垃圾被插入到带有跳转指令的代码中以跳过它。我想,目的是混淆线性扫描反汇编程序和混淆文件。我想了解更多。有谁知道它叫什么?这种方法对现代防病毒软件的效果如何?
这种反反汇编技术在实用恶意软件分析一书(第 1 版第 16 章第 336 页)中被描述为具有恒定条件的跳转指令。正如您所描述的,这个想法是有一个条件,即始终进行跳转,并在跳转后添加代码,这将在跳转位置生成错误的反汇编。由于反汇编器假定两个分支是一致的,因此它只会反汇编其中一个。
关于反病毒软件的有效性,他们大多使用模拟器。由于始终采用条件,因此模拟器将继续执行并查看正确的指令。
对此的一个变体是使用“分支函数”。基本思路如下:
这个基本方案可以用多种方式来阐述,例如:
但是,如上所述,这基本上是为了摆脱静态反汇编;它对动态分析没有太大作用。
另一个答案是,您正在查看手工编码的汇编程序,实际上并没有欺骗反汇编程序的努力。
当我进行代码汇编时,无论什么好的做法是,如果它是一小段代码,我会非常频繁地设置数据选择器以匹配代码选择器,并将我的数据直接嵌入到代码段中。例如,如果我正在编写实模式引导加载程序或其他一些短期代码,我尤其会这样做。
另一个我会这样做但仍然不会试图混淆事物的地方是一段漏洞利用代码。这允许我拥有可以可靠引用的变量,并且仍然拥有一段非常紧凑的 shell 代码。