第15章 对抗反汇编

Author Avatar
kabeor 10月 18, 2018

第15章 对抗反汇编

1. 何谓对抗反汇编技术

实现对抗反汇编时,恶意代码编写者会创建一段代码序列,欺骗反汇编器,让反汇编器展示与真正执行的代码不同的指令列表。

2. 挫败反汇编算法

对抗反汇编技术是基于反汇编算法的天生漏洞而产生的。为了清晰地显示反汇编代码,反汇编器在事前都会做某种特定的假设。一旦这种假设不成立,恶意代码作者就有机会欺骗分析人员。

反汇编算法可以分为两种:线性反汇编算法和面向代码流的反汇编算法。其中线性反汇编算法容易实现,但也易出错。

线性反汇编

线性反汇编策略是遍历一个代码段,一次一条指令的线性反汇编,从不偏离。反汇编器使用的这个基本策略已经被反汇编写作教程采用,并且被调试器广泛使用。线性反汇编用已经反汇编的指!令大小来决定下一个要反汇编的字节,而不考虑代码流的控制指令

利用反汇编库libdisasm,C实现基于线性反汇编算法的反汇编器

本例中,名为 buffer的数据缓冲区包含需要反汇编的指令。函数x86 disasm将会用刚刚反汇编过的具体指令填充一个数据结构,然后返回这个指令的大小。如果反汇编是一条合法指令,这个循环会用size值递增 position变量(如1所示),否则递增1(如2所示)

这个代码片段中的许多指令拥有多个字节,恶意代码编写者利用线性反汇编算法的关键方法是植入能够组成多字节指令机器码的数据字节。例如,标准的本地ca11指令有5个字节,以机器码0xE8开头。如果16字节数据组成一个以值0xE8结尾的开关表,那么当反汇编器碰到Call指令的机器码时会将接下来的4个字节当作操作数对待,而不是当作下一个函数的开头。

线性反汇编算法不能区分代码与数据,因此最容易被恶意代码挫败。

From https://kabeor.github.io/第15章 对抗反汇编/ bye

This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接:https://kabeor.github.io/第15章 对抗反汇编/