一、逆向分析的主要方法
逆向分析主要是将二进制机器码进行反汇编得到汇编代码,在汇编代码的基础上,进行功能分析。经过反编译生成的汇编代码中缺失了源代码中的符号、数据结构等信息,因此需要尽可能地通过逆向分析还原以上信息,以便分析程序原有逻辑和功能。逆向分析主要包括静态和动态分析。
1.静态分析
是在不执行代码文件地情况下,对代码进行静态分析,通过对代码外部特征进行观察,主要包括静态反汇编、反编译。
文件类型分析主要是用于了解程序是什么语言编写的,或者是用什么编译器编译的,以及程序是否被加密处理过。
在逆向过程中,主要是使用反汇编工具查看内部代码,分析代码结构。
2.动态分析
是在程序文件的执行过程中对代码进行动态分析的一种方法,其通过调试来分析代码,获取内存的状态等。在逆向过程中,通常使用调试器来分析程序内部结构和实现原理。
二、汇编指令体系结构
1.x86指令架构
(1)寄存器组
通用寄存器:包括EAX、EBX、ECX、EDX、ESI、EBP、ESP
指令指针寄存器(EIP):指向当前要执行的指令
状态标识寄存器(EFLAGS):根据状态标识寄存器中状态的值控制程序的分支转跳
段寄存器:CS、DS、SS、ES、FS、GS。在当前的操作系统,CS、DS、SS和ES的段寄存器的基地址通常为0.
特殊寄存器:包括DRO-DR7,用于设置硬件断点
(2)汇编指令集
x86汇编语言有两种语法记法:intel和AT&T,常用的IDA pro、OD、MASM这些逆向分析工具使用intel记法,而UNIX系统上的工具gcc通常遵循AT&T记法,intel记法更常用
intel的汇编语言格式为:
操作项 目的操作数,源操作数
操作项:汇编语言中的一些指令,比如add(加法)、mov(移动)等指令
目的操作数和源操作数:寄存器、内存地址或者立即数
(3)数据传送指令
数据传送指令是使用最频繁的指令,其格式为:
MOV DEST,SRC
功能:将一个字节、字或者双子从原操作数SRC传送至目的操作数DEST
(4)栈操作与函数调用
入栈PUSH,出栈POP,函数调用与返回通过CALL/RET指令实现,CALL指令将当前的EIP保存到堆栈中,RET指令读取堆栈,得到返回地址。
入栈:PUSH SRC 功能:ESP-=4;[ESP]=SRC
出栈:POP DEST 功能:DEST-=[ESP];ESP+=4
调用函数:CALL FUNC 功能:PUSH EIP;EIP=FUNC
函数返回:RET 功能:EIP=[ESP];ESP+=