反汇编及对抗技术
汇编语言
- 寻址方式:寄存器寻址、立即寻址、直接寻址、寄存器间接寻址、基址变址寻址、寄存器相对寻址和相对基址加变址寻址、比例变址寻址。
这里主要介绍两种寻址方式:直接数据寻址和寄存器间接寻址。
- 直接数据寻址:将位移量加到默认数据段地址或其他段地址上形成地址。
特点:操作数或源操作数中有一项为寄存器,另一项为存储有数据的地址存储单元。
MOV AL,Number ;将数据段存储单元Number中的8位数据复制到AL寄存器中
MOV Home,AX ;将AX寄存器中的16位数据复制到 字存储单元Home中
MOV EDI,DS:[2000H] ;将数据段中0x2000存储单元中的双字数据复制到EDI中
- 寄存器间接寻址:是通过BP、BX、DI、SI等保存偏移地址的一种寻址方式。
特点:上述寄存器内保存的是操作数的地址
MOV CL,[EBX] ;将数据段中EBX寻址单元的1字节内容复制到CL寄存器中
反汇编
-
返回便是将机器语言转换成汇编代码的过程。
-
基本反汇编流程包括以下四个步骤:
确定反汇编的代码区域,即区分出程序需的代码和数据段;
确定了反汇编代码入口之后,读取该位置的二进制机器指令,执行表查找,将机器码的值与它对应的汇编语言助记符提取出来,然后根据指令状态机提取操作数;
获取指令并解码出所有操作数之后,需要对它的汇编语言等价形式进行格式化,输出反汇编代码;
完成一条指令的反汇编以后,重复上述过程,继续反汇编下一条指令,直到反汇编完程序文件中的指令代码。
-
两种算法:线性扫描和递归下降扫描算法。
-
线性扫描:扫描整个代码段,逐条解析每一条指令进行反汇编,知道代码段结尾。
优点:能够完全覆盖程序所有代码;
缺点:不会通过识别分支等非线性指令提取程序的控制流。
代码混淆
-
代码混淆是一种将计算机程序代码转换成一种功能上等价,但是难以阅读和理解的变形。
-
分为两大类:一种是“反反汇编”的混淆,及针对反汇编缺陷进行设计使反汇编出错,或者对代码加密混淆使其无法得到真正的运行代码;另一种是指令控制流混淆,用来增加理解、分析反汇编代码的难度。
-
“反反汇编”型混淆主要为在指令内部插入不完整的指令数据或者通过加密、加壳的技术对代码进行保护。
反调试
- 基于调试特征检测的反调试
由书中给出的几个例子可以得到这个结论:PEB结构和进程堆(两个例子)都有特定标志,读取该标志即可知道程序是否处于调试状态。
- 基于调试特征隐藏代码
当程序未被调试时,程序可以正常运行,执行TrueFunc函数;当程序处于调试状态时,在int3指令处中断一次,随后只能执行FalseFunc函数,这就起到了反汇编的作用。