0209、Windows 逆向入门:数据、全局变量与编码逆向
这一部分专门复盘“数据如何在二进制里表现”。同一串字节,可能是整数、小数、字符、指针、结构体字段或机器指令。逆向时要结合上下文解释字节,而不是看到十六进制就直接下结论。
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 | mov al, [addr] ; 1 字节 |
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 的区别 | 待复盘 |
| 能说明编码错误为什么会影响字符串逆向 | 待复盘 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruiqy~!











