一、C 语言 ⇄ 汇编 的对应关系(逆向核心)

1️⃣ 函数调用约定(必会)

不同平台反汇编“看懂参数从哪来”靠它:

x86 / x64

  • x86(32 位)

    • cdecl:参数从右到左压栈,调用者清栈

    • stdcall:被调用者清栈(Windows 常见)

  • x64(主流)

    • Windows:RCX, RDX, R8, R9(前 4 个参数)

    • Linux/macOS:RDI, RSI, RDX, RCX, R8, R9

👉 逆向时看到寄存器赋值,就能反推出 C 函数参数


2️⃣ 栈帧结构(非常关键)

int func(int a, int b) {
    int x = 3;
    return a + b + x;
}

反汇编里你要会识别:

  • rbp / ebp:栈基址

  • rsp / esp:栈顶

  • 局部变量:[rbp - 0x10]

  • 参数:[rbp + 0x8](x86)

👉 逆向时 变量名全靠你给,看偏移猜类型


3️⃣ C 控制流 ⇄ 汇编跳转

C 结构

汇编特征

if / else

cmp + jz / jnz

for / while

cmp + jmp 循环

switch

jump table(jmp [table + eax*4]

break / continue

直接跳到固定地址

👉 看到 jump table = switch


二、指针 & 内存(逆向中出现频率最高)

4️⃣ 指针本质

*p = 10;

反汇编 ≈

mov dword ptr [rax], 0Ah

逆向要点:

  • [reg]:一级指针

  • [reg+offset]:结构体字段

  • [[reg]+offset]:二级指针


5️⃣ 数组 vs 指针(反编译最容易误导)

int a[10];
int *p;

反编译器经常混用:

  • a[i]*(a + i)

  • p[i]*(p + i)

👉 数组边界在汇编里是“不存在的”


6️⃣ 字符串与内存函数(高频)

重点函数:

  • strlen

  • strcmp / strncmp

  • memcpy / memmove

  • memset

逆向技巧:

  • 看到循环 + cmp byte ptr ⇒ 多半是 strlen

  • 看到 rep movsb ⇒ memcpy/memmove

  • 明文字符串是定位逻辑的锚点(xref)


三、结构体 / 类推断(逆向基本功)

7️⃣ 结构体识别

struct A {
    int x;
    char y;
    int z;
};

内存布局(常见):

offset 0x0 -> x
offset 0x4 -> y
offset 0x8 -> z   (中间 padding)

逆向方法:

  • 多次访问相同 [reg + offset]

  • offset 不连续 ⇒ padding

  • 多函数共用 ⇒ 全局结构体


8️⃣ this 指针 / 对象方法

obj->func(a, b);

反汇编:

  • 第一个参数是对象地址(this)

  • 后面才是真正参数

👉 逆 C++ 时尤为关键,但 C 里的“伪 OOP”也常见


四、函数指针 & 回调(非常重要)

9️⃣ 函数指针

int (*fp)(int);
fp(3);

反汇编特征:

call rax
call [rbx]

常见场景:

  • 回调

  • 状态机

  • 虚表(vtable)

  • 加密/反调度

👉 call 的不是固定地址 = 高价值逆向点


🔟 jump table / 表驱动逻辑

funcs[i]();

反汇编:

mov rax, [table + rdx*8]
call rax

👉 常用于:

  • 加密算法

  • 协议解析

  • VM / 虚拟指令解释器


五、编译器优化后的 C 代码识别

11️⃣ 内联函数

  • 反编译里“没有函数调用”

  • 大段重复逻辑

👉 别执着“找函数”,而要找“语义块”


12️⃣ 优化导致的“奇怪 C 代码”

  • 变量消失

  • 循环展开

  • 条件合并

if (a) x=1;
if (b) y=2;

可能被编译成一段复杂逻辑


六、未定义行为 & 反调试常用点

13️⃣ UB 在逆向中的用途

常见反调试/混淆:

  • 未初始化变量

  • 越界访问

  • 类型混淆(int ↔ pointer)

逆向时:

  • 不要假设代码“合理”

  • 要按“实际内存行为”分析


14️⃣ volatile / 时间 / 异常

volatile int flag;

常用于:

  • 反调试

  • 多线程标志

  • 自修改逻辑


七、常见逆向目标里的 C 逻辑

15️⃣ 校验 / 算法

  • hash / checksum

  • serial / license

  • token 生成

特征:

  • 大量位运算(xor / rol / ror)

  • 表查找

  • 循环 + 魔数


16️⃣ 协议 / 数据解析

struct packet {
    uint16_t len;
    uint8_t  type;
    uint8_t  data[];
};

逆向:

  • 长度字段

  • TLV 结构

  • 偏移逐步推进


八、你做逆向时一定会用到的能力

必须熟练

  • 指针 + 偏移脑补结构体

  • 栈帧手算变量

  • 从汇编还原 if / loop / switch

  • 看懂函数指针调用

进阶必备

  • 优化后代码理解

  • 表驱动 / 状态机

  • 自写结构体给 IDA / Ghidra


建议你的学习顺序(非常实战)

1️⃣ C 指针 + 内存模型
2️⃣ 栈帧 + 调用约定
3️⃣ 结构体偏移推断
4️⃣ 函数指针 / jump table
5️⃣ 优化与混淆代码