滴水逆向--01-15 通用寄存器_内存读写
通用寄存器
32 位通用寄存器的指定用途如下:
| 寄存器 | 主要用途 | 编号 | 存储数据的范围 |
|---|---|---|---|
| EAX | 累加器 | 0 | 0 - 0xFFFFFFFF |
| ECX | 计数 | 1 | 0 - 0xFFFFFFFF |
| EDX | I/O指针 | 2 | 0 - 0xFFFFFFFF |
| EBX | DS段的数据指针 | 3 | 0 - 0xFFFFFFFF |
| ESP | 堆栈指针 | 4 | 0 - 0xFFFFFFFF |
| EBP | SS段的数据指针 | 5 | 0 - 0xFFFFFFFF |
| ESI | 字符串操作的源指针;SS段的数据指针 | 6 | 0 - 0xFFFFFFFF |
| EDI | 字符串操作的目标指针;ES段的数据指针 | 7 | 0 - 0xFFFFFFFF |
通用寄存器:
| 32位 | 16位 | 8位 | 编号 (二进制) | 编号 (十进制) |
|---|---|---|---|---|
| EAX | AX | AL | 000 | 0 |
| ECX | CX | CL | 001 | 1 |
| EDX | DX | DL | 010 | 2 |
| EBX | BX | BL | 011 | 3 |
| ESP | SP | AH | 100 | 4 |
| EBP | BP | CH | 101 | 5 |
| ESI | SI | DH | 110 | 6 |
| EDI | DI | BH | 111 | 7 |

寄存器彼此之间不是独立的,大的包含小的(硬件发展历程)
1 | MOV EAX,0xAAAAAAAA |
基础指令
MOV 指令:
1 | MOV r/m8, r8 |
MOV 目标操作数, 源操作数
作用:拷贝源操作数到目标操作数
- 源操作数可以是立即数、通用寄存器、段寄存器、内存单元
- 目标操作数可以是通用寄存器、段寄存器、内存单元
- 操作数的宽度必须一样
- 源操作数和目标操作数不能同时为内存单元
ADD 指令:
1 | ADD AL, imm8 |
SUB 指令:
1 | SUB AL, imm8 |
AND 指令:
1 | AND AL, imm8 |
OR 指令:
1 | OR AL, imm8 |
XOR 指令:
1 | XOR AL, imm8 |
NOT 指令:
1 | NOT r/m8 |
内存读写
寄存器与内存的区别:
-
寄存器位于 CPU 内部,执行速度快,但比较贵
-
内存速度相对较慢,但成本较低,所以可以做的很大
-
寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的
-
寄存器常用的有 8 个:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI
-
计算机中的几个常用计量单位:BYTE WORD DWORD
BYTE 字节 = 1 byte 8(BIT)
WORD 字 = 16(BIT)
DWORD 双字 = 32(BIT)
-
内存的数量特别庞大,无法每个内存单元都起一个名字,所以用编号来代替。我们称计算机 CPU 是 32 位或 64 位的,有很多书上说之所以叫 32 位计算机是因为寄存器的宽度是 32 位,是不准确的,因为还有很多寄存器是大于 32 位的。正确的解释为寻址范围为 32 位。
内存编号范围:0x00000000~0xFFFFFFFF,内存的单位是字节,能存储的信息最多是 FFFFFFFF+1 字节,即 4G
-
只要是 32 位计算机,那么最多是别的内存为 4G,对吗?
不一定,可以通过打补丁等形式拓展
内存:
-
内存格式

-
从指定内存中写入/读取数据
1
2mov dword ptr ds:[0x0012FF34], 0x12345678
mov eax, dword ptr ds:[0x0012FF34]dword:要读/写多少(涉及到内存读写的,一定要指定宽度),byte = 1 字节,word = 2 字节,dword = 4 字节
ptr:point,代表后面是一个指针(不是值,是地址)
ds:段寄存器
0x0012FF34:内存编号,必须 32 位,前面的 0 可以省略
注意:地址编号不要随便写,因为内存有保护机制,并不是所有的都可以直接读写(需要特别处理),建议做练习时地址编号写成 esp 的值