这一部分专门复盘“数据如何在二进制里表现”。同一串字节,可能是整数、小数、字符、指针、结构体字段或机器指令。逆向时要结合上下文解释字节,而不是看到十六进制就直接下结论。

1、内容范围

小节 内容 复盘点
09.4 整数类型数据传输 MOV 数据宽度、寄存器和内存
09.5 有符号整数存储与端序 补码、小端序、符号解释
09.6 整数数据溢出 截断、回绕、标志位
09.7 MOVZX / MOVSX 零扩展和符号扩展
09.8 全局变量与局部变量特征 地址区域、访问方式、生命周期
09.9 PE 节区转文件数据并修改 文件偏移和内存地址关系
10.0 - 10.3 小数编码与指令 IEEE、FPU、SSE、AVX 入门
10.4 - 10.8 字符编码与字符串指令 区域设置、截断、MOVS/STOS/LODS
10.9 - 11.1 数字与字符安全 编码、校验和安全边界

2、MOV 与数据宽度

mov 只是搬运数据,不关心语义。真正决定语义的是宽度和后续使用方式。

1
2
3
4
mov al,  [addr]   ; 1 字节
mov ax, [addr] ; 2 字节
mov eax, [addr] ; 4 字节
mov rax, [addr] ; 8 字节

3、有符号、无符号与溢出

同样的字节可以按有符号或无符号解释。

字节 无符号 有符号 8 位
0x7F 127 127
0x80 128 -128
0xFF 255 -1

溢出分析要看使用场景:无符号关注 CF,有符号关注 OF。

4、MOVZX 与 MOVSX

指令 含义 示例
movzx 零扩展 0xFF 扩展为 0x000000FF
movsx 符号扩展 0xFF 扩展为 0xFFFFFFFF

这两个指令经常暴露程序是按有符号还是无符号解释小宽度数据。

5、全局变量与局部变量

类型 常见位置 访问特征
局部变量 栈 [ebp-xx]、[rsp+xx]
参数 栈或寄存器 [ebp+xx]、RCX/RDX 等
全局变量 数据节 固定模块偏移或 RIP 相对寻址
字符串常量 只读数据节 被多个位置引用

复盘时把变量名替换成“地址 + 大小 + 生命周期”。

6、PE 节区与文件数据

全局数据常落在 PE 的数据节或只读数据节。文件状态和内存状态不同,要区分 FOA、RVA、VA。

概念 含义
FOA 文件偏移
RVA 相对模块基址的内存偏移
VA 加载后的虚拟地址

7、小数编码

浮点数通常按 IEEE 754 表示,不是十进制文本直接存储。

类型 常见大小
float 4 字节
double 8 字节

逆向小数时要注意 FPU、SSE、AVX 指令和寄存器差异。

8、字符编码

字符不是只有 ASCII。中文环境里经常遇到 GBK、UTF-8、UTF-16。

编码 特点
ASCII 单字节英文
GBK 中文常见双字节编码
UTF-8 变长编码,兼容 ASCII
UTF-16 Windows API 中常见宽字符

编码错了,字符串显示、长度计算、截断逻辑都会错。

9、字符串指令

指令 作用
movs 从源复制到目的
stos 向目的填充
lods 从源加载到累加器
rep 按计数重复

这些指令常用于内存拷贝、清零、字符串处理。

10、学习检查清单

检查项 状态
能根据指令宽度判断读取了几个字节 待复盘
能区分 movzx 和 movsx 待复盘
能识别局部变量和全局变量的访问特征 待复盘
能解释 FOA、RVA、VA 的区别 待复盘
能说明编码错误为什么会影响字符串逆向 待复盘