0214、Windows 逆向入门:x64 基础与系统机制
这一部分从 x86 过渡到 x64。x64 不只是寄存器变宽,还涉及调用约定、栈布局、虚拟地址、WOW64、权限级别和页表转换等系统机制。
1、内容范围
| 小节 | 内容 | 复盘点 |
|---|---|---|
| 23.4 - 23.9 | x64 路线与架构差异 | 指令拓展、WOW64、寄存器、虚拟地址、调用约定 |
| 24.0 - 24.5 | x64 栈与地址 | 参数传递、栈空间、长跳、全局变量、指针宽度 |
| 24.6 - 24.9 | 手册与权限 | Intel 手册、CPUID、Ring0/Ring3、标志寄存器 |
| 25.0 - 25.9 | 段/控制/调试寄存器 | 段选择子、描述符、CR0/CR2、页表、调试寄存器、地址大小 |
| 26.0 - 26.3 | 断点和动态调试 | 断点类型、单步、基础路线收尾 |
2、x64 寄存器
x64 增加了寄存器数量和宽度。
| 类型 | 示例 |
|---|---|
| 通用寄存器 | RAX、RBX、RCX、RDX、R8-R15 |
| 指针寄存器 | RSP、RBP、RIP |
| SIMD 寄存器 | XMM、YMM |
| 标志寄存器 | RFLAGS |
3、WOW64
WOW64 让 32 位程序运行在 64 位 Windows 上。逆向时要区分目标进程是 x86、x64 还是 WOW64,否则寄存器、模块路径、调用约定都会看错。
4、x64 调用约定
Windows x64 常见前四个整数/指针参数:
1 | RCX, RDX, R8, R9 |
调用者还要预留 shadow space,栈需要保持对齐。
5、栈结构变化
x64 下很多参数不再先压栈,而是先进寄存器。多余参数才放栈上。逆向函数参数时不能再机械套 x86 [ebp+8]。
6、RIP 相对寻址
x64 常见 RIP 相对寻址:
1 | mov rax, [rip+1234h] |
它常用于访问全局变量、字符串和导入表相关地址。
7、虚拟地址与指针宽度
x64 指针通常 8 字节,但不是全部 64 位虚拟地址空间都可用。复盘时要区分虚拟地址、线性地址、物理地址和规范地址。
8、Ring0 与 Ring3
| 层级 | 含义 |
|---|---|
| Ring3 | 用户态,普通应用程序 |
| Ring0 | 内核态,驱动和内核代码 |
入门篇只建立概念,不做内核攻防展开。
9、控制寄存器与页机制
| 寄存器 | 复盘意义 |
|---|---|
CR0 |
保护模式、分页等控制位 |
CR2 |
页错误相关地址 |
CR3 |
页表基址 |
DR0-DR7 |
调试寄存器、硬件断点 |
这些内容后面看内存管理、断点、反调试会用到。
10、断点类型
| 类型 | 痕迹 |
|---|---|
| 软件断点 | 修改代码字节 |
| 硬件断点 | 使用调试寄存器 |
| 内存断点 | 页保护和异常 |
| 单步 | Trap Flag 和调试异常 |
11、学习检查清单
| 检查项 | 状态 |
|---|---|
| 能区分 x86、x64、WOW64 调试视角 | 待复盘 |
| 能说出 Windows x64 前四个参数寄存器 | 待复盘 |
| 能解释 RIP 相对寻址 | 待复盘 |
| 能说明 Ring0/Ring3 的边界 | 待复盘 |
| 能区分软件断点、硬件断点和内存断点 | 待复盘 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruiqy~!










