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

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、学习检查清单

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