一、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 控制流 ⇄ 汇编跳转
👉 看到 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️⃣ 字符串与内存函数(高频)
重点函数:
strlenstrcmp / strncmpmemcpy / memmovememset
逆向技巧:
看到循环 +
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️⃣ 优化与混淆代码
评论