引言
最近在学习逆向,这里是浅浅记录的笔记。俗话说磨刀不误砍柴工,以前并没有严格的去要求自己去理解底层,只是知道有这个东西,技术债趁此机会补一补。
基本通用寄存器(General Purpose Registers)
| 寄存器 | 名称 | 用途说明 |
|---|---|---|
| EAX | 累加器(Accumulator) | 常用于算术/逻辑运算的结果。某些指令默认使用它(如MUL、DIV)。 |
| EBX | 基址寄存器(Base) | 可用作指针,访问内存。常用于数据存储。 |
| ECX | 计数器(Counter) | 用作循环计数器,很多循环/字符串操作指令默认用它计数。 |
| EDX | 数据寄存器(Data) | 常与 EAX 配合用于乘法/除法(比如高位/低位)。 |
| 寄存器 | 名称 | 用途说明 |
|---|---|---|
| ESI | 源索引寄存器(Source Index) | 在字符串处理(如MOVS,LODS)中用于指向源地址。 |
| EDI | 目的索引寄存器(Destination Index) | 与 ESI 配合,用于字符串操作的目标地址。 |
| EBP | 基址指针寄存器(Base Pointer) | 通常用于函数调用时保存栈帧基址,辅助访问函数参数和局部变量。 |
| ESP | 栈指针寄存器(Stack Pointer) | 始终指向当前栈顶,在函数调用、返回、局部变量分配时使用。 |
控制寄存器
| 寄存器 | 名称 | 用途说明 |
|---|---|---|
| EIP | 指令指针寄存器(Instruction Pointer) | 存储下一条将要执行的指令地址,控制程序流程。不能直接修改,只能通过跳转/调用指令间接改变。 |
段寄存器
| 寄存器 | 名称 | 用途 |
|---|---|---|
| CS | Code Segment | 代码段寄存器,指向当前执行代码所在的段。配合EIP一起定位当前指令地址。 |
| DS | Data Segment | 数据段寄存器,默认用于访问一般变量数据。 |
| SS | Stack Segment | 栈段寄存器,默认用于ESP、EBP指向的内存访问。 |
| ES | Extra Segment | 额外段寄存器,通常与字符串操作指令配合使用(比如MOVS、STOS)。 |
| FS | FS Segment | 一般用于线程局部存储(TLS),Windows 下很多结构(如 TEB)通过它访问。 |
| GS | GS Segment | 类似 FS,通常也用于访问特定系统数据或线程相关数据(Linux 下使用较多)。 |
小提示
- “E” 前缀表示 Extended(扩展)*,是对早期 16 位寄存器(AX, BX, etc.)的扩展。
- 在 64 位系统中,它们被扩展为 RAX、RBX、RCX、RDX、RSP、RBP、RSI、RDI、RIP 等 (E-->R)。
小栗子🌰
这里是一个简单的C语言的代码
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 5);
return 0;
}
转换成汇编语言大概是这个样子
main:
push ebp ; ① 保存旧栈帧指针,方便返回时恢复
mov ebp, esp ; ② 设置新的栈帧基址,方便访问函数参数/局部变量
sub esp, 10h ; ③ 为局部变量分配空间(例如 result),这里是 16 字节
push 5 ; ④ 将参数 b 压栈,先压后用(右边的参数先压)
push 3 ; ⑤ 再将参数 a 压栈
call add ; ⑥ 调用 add 函数,压入返回地址,然后跳转
add esp, 8 ; ⑦ 清理栈上两个参数(2 × 4 字节)
mov [ebp-4], eax ; ⑧ 将 add 返回的结果(存在 eax)保存到局部变量 result
mov eax, 0 ; ⑨ 返回值为 0,表示 main 函数结束
leave ; ⑩ 恢复 esp 和 ebp(等价于:mov esp, ebp → pop ebp)
ret ; ⑪ 从栈中弹出返回地址到 EIP,跳回操作系统
add:
push ebp ; ⑫ 保存调用者的栈帧指针
mov ebp, esp ; ⑬ 设置新的栈帧基址
mov eax, [ebp+8] ; ⑭ 读取参数 a 到 eax 寄存器
add eax, [ebp+0Ch] ; ⑮ 把参数 b 加到 eax 上
pop ebp ; ⑯ 恢复旧栈帧
ret ; ⑰ 弹出返回地址,跳回调用点
寄存器的用法
| 寄存器 | 用法说明 |
|---|---|
| EAX | 存放add函数的返回值,调用后EAX=8,被保存到 result 中。 |
| EBP | 建立栈帧,[EBP+8]和[EBP+0Ch]分别是函数参数 a 和 b 的位置。 |
| ESP | 指向栈顶,push/pop会修改它。 |
| EIP | call指令时保存下一条地址,跳转到add函数,执行完后ret取出返回地址继续执行。 |
栈布局(add 函数执行时)
ESP →
+------------+ ← [EBP+0Ch] = b (5)
| 参数 b |
+------------+ ← [EBP+8] = a (3)
| 参数 a |
+------------+
| 返回地址 |
+------------+
| 上一个 EBP |
+------------+ ← EBP


评论 0
还没有评论,来说点什么吧。