x86/x64 汇编基础
汇编语言是逆向工程的基石,理解 x86/x64 汇编是分析二进制程序的前提条件。
一、寄存器体系
x86 架构拥有 8 个通用寄存器:EAX(累加器)、EBX(基址)、ECX(计数器)、EDX(数据)、ESI(源地址)、EDI(目标地址)、EBP(基址指针)、ESP(栈指针)。x64 扩展为 16 个 64 位寄存器(RAX-R15),并引入 RIP 相对寻址模式。标志寄存器 EFLAGS/RFLAGS 记录运算结果状态,包括零标志 ZF、进位标志 CF、符号标志 SF、溢出标志 OF 等。段寄存器(CS、DS、ES、FS、GS、SS)在 x64 中功能大幅简化。
二、指令集分类
x86/x64 指令集按功能可分为:数据传输指令(MOV、PUSH、POP、LEA)在内存和寄存器间移动数据;算术指令(ADD、SUB、MUL、DIV、INC、DEC)执行基本运算;逻辑指令(AND、OR、XOR、NOT、SHL、SHR)进行位操作;控制转移指令(JMP、Jcc、CALL、RET)改变执行流;比较指令(CMP、TEST)设置标志位供条件跳转使用;字符串指令(MOVS、CMPS、SCAS、LODS、STOS)批量处理内存块。
三、调用约定
调用约定定义了函数调用时参数传递和栈帧管理的规则。x86 平台常见约定:cdecl(调用者负责清理栈,参数从右向左入栈)、stdcall(被调用者清理栈,参数从右向左入栈)、fastcall(前两个参数通过 ECX/EDX 传递,其余从右向左入栈)。x64 平台统一使用 Microsoft x64 Calling Convention(前四个参数通过 RCX/RDX/R8/R9 传递)或 System V AMD64 ABI(前六个参数通过 RDI/RSI/RCX/RDX/R8/R9 传递)。
四、常见指令模式
逆向分析中常见以下指令模式。函数序言(Function Prologue):PUSH EBP; MOV EBP, ESP 建立栈帧。函数尾声(Function Epilogue):MOV ESP, EBP; POP EBP; RET 恢复栈帧。Switch 跳转表:JMP [table + index * 4] 实现多分支优化。循环通常编译为条件跳转组合。结构体成员访问:通过基址加偏移([base_reg + offset])实现。字符串比较使用 REPE CMPSB 指令对。
五、反汇编技巧
实际逆向中需要注意:编译器优化(内联函数消除 CALL 指令、循环展开、常量传播)会使生成的汇编与源码差异很大。混淆代码通过不透明谓词、控制流平坦化等技术增加分析难度。识别库函数(通过签名匹配 FLIRT、Fast Library Identification and Recognition Technology)可以跳过已知代码的分析。IDA Pro 的 F5 反编译功能可以大幅提升分析效率。