笔记
学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师
微信 i-xiaodi
这里的内容,不懂就查,不要死记硬背
学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师
微信 i-xiaodi
x86寄存器
在 x86 架构中,寄存器是 CPU 内部的高速存储区域,通常用于存放数据、指令地址和计算结果。
寄存器的大小通常与 CPU 的位数相关:
在 32 位的 x86 架构中,寄存器的大小是 32 位(4 字节)(内存地址也是)
在 64 位的 x86-64 架构中,寄存器的大小是 64 位(8 字节)(内存地址也是)
x86 架构的寄存器可以分为几类,每类寄存器有不同的用途:
通用寄存器、段寄存器、指令指针寄存器、标志寄存器等。
1. 通用寄存器(General-Purpose Registers)
x86 架构中有 8 个通用寄存器,每个寄存器的大小是 32 位,在 64 位的 x86-64 架构中,这些寄存器的大小扩展为 64 位。
32 位(x86)架构下的通用寄存器:
- EAX:累加寄存器(Accumulator),常用于算术运算、I/O 操作。
-
- Windows 的代码中通常用来存放结果(返回值)
- EBX:基址寄存器(Base),用于指向数组或数据结构的基址。
- ECX:计数寄存器(Count),常用于循环计数器或移位操作。
-
- 在 Windows x86 调用约定(如 stdcall 和 fastcall)中,ECX 通常用于传递函数的参数。具体来说,在 fastcall 调用约定中,ECX 存放函数的第一个参数。
- 在 stdcall 调用约定中,参数通常是通过栈传递的,但 ECX 仍然可以用作 临时数据存储 或 循环计数器。
- 在面向对象的 C++ 编程中,
this
指针指向当前对象的内存地址。当你调用类的成员函数时,this
指针会隐式地作为该成员函数的一个参数传递。 - 在 C++ 中的成员函数 中,
this
指针并没有一个固定的寄存器,而是由 编译器决定。对于 Windows x86 编译器(如 MSVC),通常情况下,this
指针会被传递给成员函数的 第一个参数,而这个参数的传递方式可能依赖于调用约定。具体来说,在 fastcall 调用约定中,第一个参数(通常是this
指针)会存放在 ECX 寄存器中。
- EDX:数据寄存器(Data),用于存储乘法、除法的结果,或与 I/O 操作相关。(也可以和eax结合存储64位数据,格式为
EDX:EAX
) - ESI:源索引寄存器(Source Index),用于指向源操作数,尤其是在字符串操作中。
- EDI:目的索引寄存器(Destination Index),用于指向目标操作数,尤其是在字符串操作中。
- EBP:基指针寄存器(Base Pointer),用于保存栈帧的基地址(尤其是函数调用时,栈的管理非常依赖它)。
-
- 栈底 — 因为 EBP 指向栈这种数据结构的底部,所以叫栈底
- ESP:堆栈指针寄存器(Stack Pointer),用于指向当前栈顶位置,栈的 push/pop 操作都依赖于它。
-
- 涉及堆栈平衡非常重要
- 栈顶 — 因为 ESP 指向栈这种数据结构的顶部,所以叫栈顶
在 x86-64(64 位)架构中,寄存器的名称略有变化,但功能类似:
- RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP —— 这些是 64 位的扩展版本。
此外,R8 到 R15 也是在 64 位架构中新增的通用寄存器。
32 位寄存器与 64 位寄存器的区别:
- 32 位寄存器(如 EAX) 被拓展为 64 位寄存器(如 RAX),扩展部分会用于更大的数据处理。
- 指令集操作符 也支持对 64 位寄存器进行操作。
小作业:描述哪一行用到了栈底和栈顶的寄存器