软件安全分析与应用(5)

Hello world,hello blog!

Posted by 吴柚 on June 12, 2019

反汇编及对抗技术

汇编语言

  1. 寻址方式:寄存器寻址、立即寻址、直接寻址、寄存器间接寻址、基址变址寻址、寄存器相对寻址和相对基址加变址寻址、比例变址寻址。

这里主要介绍两种寻址方式:直接数据寻址和寄存器间接寻址。

  1. 直接数据寻址:将位移量加到默认数据段地址或其他段地址上形成地址。

特点:操作数或源操作数中有一项为寄存器,另一项为存储有数据的地址存储单元。

MOV  AL,Number       ;将数据段存储单元Number中的8位数据复制到AL寄存器中
MOV  Home,AX         ;将AX寄存器中的16位数据复制到 字存储单元Home中
MOV  EDI,DS:[2000H]  ;将数据段中0x2000存储单元中的双字数据复制到EDI中
  1. 寄存器间接寻址:是通过BP、BX、DI、SI等保存偏移地址的一种寻址方式。

特点:上述寄存器内保存的是操作数的地址

MOV  CL,[EBX]      ;将数据段中EBX寻址单元的1字节内容复制到CL寄存器中

反汇编

  1. 返回便是将机器语言转换成汇编代码的过程。

  2. 基本反汇编流程包括以下四个步骤:

确定反汇编的代码区域,即区分出程序需的代码和数据段;

确定了反汇编代码入口之后,读取该位置的二进制机器指令,执行表查找,将机器码的值与它对应的汇编语言助记符提取出来,然后根据指令状态机提取操作数;

获取指令并解码出所有操作数之后,需要对它的汇编语言等价形式进行格式化,输出反汇编代码;

完成一条指令的反汇编以后,重复上述过程,继续反汇编下一条指令,直到反汇编完程序文件中的指令代码。

  1. 两种算法:线性扫描和递归下降扫描算法。

  2. 线性扫描:扫描整个代码段,逐条解析每一条指令进行反汇编,知道代码段结尾。

优点:能够完全覆盖程序所有代码;

缺点:不会通过识别分支等非线性指令提取程序的控制流。

代码混淆

  1. 代码混淆是一种将计算机程序代码转换成一种功能上等价,但是难以阅读和理解的变形。

  2. 分为两大类:一种是“反反汇编”的混淆,及针对反汇编缺陷进行设计使反汇编出错,或者对代码加密混淆使其无法得到真正的运行代码;另一种是指令控制流混淆,用来增加理解、分析反汇编代码的难度。

  3. “反反汇编”型混淆主要为在指令内部插入不完整的指令数据或者通过加密、加壳的技术对代码进行保护。

反调试

  1. 基于调试特征检测的反调试

由书中给出的几个例子可以得到这个结论:PEB结构和进程堆(两个例子)都有特定标志,读取该标志即可知道程序是否处于调试状态。

  1. 基于调试特征隐藏代码

当程序未被调试时,程序可以正常运行,执行TrueFunc函数;当程序处于调试状态时,在int3指令处中断一次,随后只能执行FalseFunc函数,这就起到了反汇编的作用。