banner
lca

lca

真正的不自由,是在自己的心中设下牢笼。

《从零开始学IDA逆向》学习笔记-3(寄存器)

image

3.2 寄存器#

比如说 ADD (加法) 指令,两个内存中的数就无法直接相加,处理器必须将其中一个数传输到寄存器中,再加上另一个内存地址中的数。

32 位通用寄存器有:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI 和 EIP。

image

image

  • EAX (accumulator, 累加器):EAX 常用于四则运法以及一些格式化指令。
  • EBX (Base index, 基址寄存器):EBX 常用于存储起始内存地址。
  • ECX (counter, 计数器):ECX 用于多种指令的计数器。同时也存储内存数据的地址偏移。使用计数器的指令包括字符串指令、偏移指令、移位指令以及循环。
  • EDX (data):EDX 通常用于存储乘积的部分位数以及除法的余数,同时也能存储起始内存地址。
  • EBP (base pointer):EBP 指向一个内存地址,主要作为一个函数中的参数以及变量的基址。
  • EDI (destination index):EDI 常用于字符串指令,指向目标字符串。
  • ESI (source index):ESI 常用于字符串指令,指向初始字符串。
  • EIP:存储即将执行的下一条指令的地址。
  • ESP:存储栈顶地址。

思维脑图如下:

image

image

对于 EBX 有 BX、BH 和 BL 子寄存器,对于 ECX 有 CX、CH 和 CL 子寄存器,对于 EDX 有 DX、DH 和 DL 子寄存器。其他通用寄存器的 9~16 位没有命名也无法直接获取内容。

最基本的是 BYTE 占用 1 个字节 (8 bit) 内存,WORD 占用 2 个字节 (16 bit) 内存,DWORD 占用 4 个字节 (32bit) 内存、QWORD 占用 8 个字节 (64 bit) 内存。

64-bit32-bit16-bit8-bit Low8-bit Highcomment
RAXEAXAXALAH
RBXEBXBXBLBH
RCXECXCXCLCH
RDXEDXDXDLDH
RSIESISISIL-
RDIEDIDIDIL-
RBPEBPBPBPL-base pointer
RSPESPSPSPL-stack pointer
R8R8DR8WR8B-
R9R9DR9WR9B-
R10R10DR10WR10B-
R11R11DR11WR11B-
R12R12DR12WR12B-
R13R13DR13WR13B-
R14R14DR14WR14B-
R15R15DR15WR15B-
RIPEIPIP--
RFLAGSEFLAGSFLAGS--

寄存器与子寄存器

image

Data TypeSize(Bits)Typical Use
Byte8Characters,small integers
Word16Characters,integers
Doubleword32Integers,single-precision floating-point
Quadword64Integers,double-precision floating-point
Double Quadword128Packed integers,packed floating-point

基础数据类型及内存占用

3.3 MOV 指令#

数据传输指令 MOV: 将其始操作单元 (src) 的内容复制到目标单元 (dest) 。

MOV EAX, EDI

image

大部分情况下,我们可以在寄存器间直接传输,但是 EIP 寄存器无法被直接赋值或者读取。例如MOV EIP, EAX这个指令就是非法的。

IDA 中,地址前面有OFFSET这个词时,指代的是这个地址本身的数值,而没有OFFSET这个词时,指代的是这个地址上存储的内容。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。