x64dbg
2026/5/29工具工具逆向工程x64dbg大约 7 分钟
x64dbg
链接
是什么
x64dbg 是一款开源的 Windows 用户模式调试器,支持 32 位和 64 位应用程序调试。它是 OllyDbg 的精神继承者,提供了现代化的界面和丰富的功能。x64dbg 是 Windows 平台逆向工程和 CTF 逆向题目分析的重要工具。
核心功能:
- 交互式调试:单步执行、断点管理、内存查看
- 反汇编视图:彩色化的汇编代码显示
- 内存映射:查看进程的内存布局
- 符号支持:加载 PDB 符号文件
- 脚本支持:支持 JavaScript/Python 脚本
- 插件系统:支持第三方插件扩展
- Trace 功能:指令追踪和条件追踪
- 脱壳辅助:内存断点和硬件断点
在 CTF 竞赛中,x64dbg 主要用于 Windows 逆向题目和恶意软件分析。
安装与配置
下载安装
- 访问官方 GitHub:https://github.com/x64dbg/x64dbg/releases
- 下载最新的 snapshot(快照版本)
- 解压到任意目录
x64dbg/
├── release/ # 64 位版本
│ ├── x96dbg.exe # 主程序
│ └── ...
├── release_x32/ # 32 位版本
│ ├── x32dbg.exe # 32 位主程序
│ └── ...
└── snapshot_2024-xx-xx/插件安装
# 常用插件
# ScyllaHide:反反调试插件
# SharpOD:反反调试插件
# xAnalyzer:指令分析增强
# TitanHide:内核级反反调试
# 安装方法:将插件 DLL 放入 plugins 目录
# 32 位插件放入 release_x32/plugins/
# 64 位插件放入 release/plugins/配置优化
在 Options -> Preferences 中调整:
- Events:配置程序入口断点
- Engine:配置调试引擎
- Appearance:调整界面外观
- Disassembly:配置反汇编显示
基本用法
界面布局
x64dbg 主要窗口:
- CPU:主反汇编视图(代码、寄存器、栈、内存dump)
- Log:日志输出窗口
- Breakpoints:断点管理窗口
- Memory Map:内存映射窗口
- Call Stack:调用栈窗口
- Symbol:符号信息窗口
- Threads:线程管理窗口
- Handles:句柄信息窗口
加载程序
1. 文件 -> 打开(或拖拽文件到窗口)
2. 可设置命令行参数和起始目录
3. 程序会在入口点断下常用快捷键
| 快捷键 | 功能 |
|---|---|
| F2 | 设置/删除断点 |
| F7 | 单步步入(Step Into) |
| F8 | 单步步过(Step Over) |
| F9 | 运行(Continue) |
| Ctrl+F9 | 运行到返回(Run until return) |
| Alt+F9 | 运行到用户代码(Run until user code) |
| F12 | 暂停 |
| Ctrl+G | 跳转到地址 |
| Ctrl+F | 搜索 |
| Space | 修改汇编指令 |
| Enter | 跟踪地址 |
| Esc | 返回上一位置 |
| Ctrl+N | 查看导入表 |
| Alt+B | 查看断点列表 |
断点类型
1. 软件断点(INT3)
- F2 在当前指令设置
- 修改指令第一个字节为 0xCC
- 可被检测到
2. 硬件断点(Hardware Breakpoint)
- 右键 -> Breakpoint -> Hardware
- 使用调试寄存器(DR0-DR3)
- 不修改代码,难以检测
- 最多 4 个
3. 内存断点(Memory Breakpoint)
- 右键 -> Breakpoint -> Memory
- 设置内存页的访问权限
- Read/Write/Execute
- 适合脱壳
4. 条件断点
- 设置断点后右键 -> Edit
- 设置条件表达式
- 可设置命中次数寄存器窗口
# 查看寄存器值
- 在右上角寄存器窗口直接查看
- 寄存器值变化时会高亮显示(红色)
# 修改寄存器
- 双击寄存器值
- 输入新值
# 标志寄存器
- 点击 ZF/CF/OF 等标志位可直接切换内存操作
# 查看内存
- 在内存 dump 窗口输入地址
- Ctrl+G 跳转到指定地址
# 搜索内存
- Ctrl+B 搜索字节序列
- 支持十六进制和字符串搜索
- 支持正则表达式
# 修改内存
- 在内存 dump 窗口选中字节
- 直接输入新值
# 内存映射
- 查看 -> Memory Map
- 显示所有内存区域的属性反汇编操作
# 跟随地址
- 双击 JMP/CALL 等跳转指令的操作数
- 按 Enter 键
# 返回上一位置
- 按 Esc 键
# 修改指令
- 选中指令,按 Space 键
- 输入新的汇编指令
- 右键 -> Patches -> Apply Patches 保存修改
# 注释
- 选中指令
- 按 ; 键添加注释
# 标签
- 选中地址
- 按 : 键添加标签CTF常用技巧
脱壳(Unpacking)
# 常见脱壳方法:
1. ESP 定律法
- 在入口点 F8 单步一次
- 在 ESP 值处设置硬件断点(Hardware Breakpoint on access)
- F9 运行,断在 OEP(Original Entry Point)
2. 内存断点法
- 在代码段(.text)设置内存执行断点
- F9 运行,断在 OEP
3. 单步跟踪法
- F7/F8 单步跟踪
- 遇到向上跳转用 F4 跳过循环
- 跟踪到 OEP
4. 使用插件脱壳
- ScyllaHide:自动脱壳
- SharpOD:自动脱壳调试加壳程序
# 使用 ScyllaHide 反反调试
1. 安装 ScyllaHide 插件
2. Options -> ScyllaHide
3. 启用所有反反调试选项
# 常见反调试检测:
- IsDebuggerPresent
- CheckRemoteDebuggerPresent
- NtQueryInformationProcess
- GetTickCount / QueryPerformanceCounter(时间检测)
- NtSetInformationThread(隐藏调试器)API 断点
# 在 API 函数处设置断点
1. Ctrl+N 打开导入表
2. 搜索目标 API(如 CreateFileA, ReadFile)
3. 选中 API,按 Enter 跟随
4. F2 设置断点
# 常用断点 API:
- 文件操作:CreateFileA/W, ReadFile, WriteFile
- 注册表:RegOpenKeyExA/W, RegQueryValueExA/W
- 网络:WSAStartup, connect, send, recv
- 加密:CryptEncrypt, CryptDecrypt
- 内存:VirtualAlloc, VirtualProtect
- 进程:CreateProcessA/W, ShellExecuteA/WTrace 追踪
# 指令追踪
1. 在起始地址设置断点
2. Debug -> Trace -> Trace Into
3. 设置追踪条件
4. 查看追踪日志
# 条件追踪
1. Debug -> Trace -> Conditional Trace
2. 设置条件表达式
3. 只记录满足条件的指令
# 导出追踪结果
- 右键 -> Export
- 保存为文本文件分析字符串搜索
# 搜索字符串
1. Ctrl+B 搜索
2. 输入要搜索的字符串
3. 支持 ASCII 和 Unicode
4. 搜索范围可选:所有内存、当前模块
# 搜索关键字符串
- "flag", "password", "key", "correct", "wrong"
- "注册成功", "注册失败", "请输入"
- Base64 编码后的字符串使用脚本
// JavaScript 脚本示例:自动单步跟踪
var count = 0;
while (count < 1000) {
StepOver();
WaitForEvent();
count++;
}
Log("Traced " + count + " instructions\n");# Python 脚本示例:搜索内存
import x64dbg
# 搜索字符串
result = x64dbg.Memory.FindString("flag")
if result:
print(f"Found at: {hex(result)}")
# 设置断点
x64dbg.Breakpoint.Set(0x401000)分析加壳程序的导入表
# 查看导入表
1. Ctrl+N 打开导入表
2. 分析导入的 API 函数
3. 推断程序功能:
- 文件操作 -> 可能在读写文件
- 注册表操作 -> 可能在修改系统设置
- 网络操作 -> 可能在联网验证
- 加密函数 -> 可能在加解密数据修改程序行为
# 修改跳转指令
1. 选中跳转指令(如 JNZ)
2. 按 Space 键
3. 修改为相反跳转(JNZ -> JZ)
4. 右键 -> Patches -> Apply Patches
# NOP 指令
1. 选中指令
2. 右键 -> Binary -> Fill with NOPs
# 修改比较值
1. 选中 CMP 指令的操作数
2. 按 Space 键修改调试多线程程序
# 查看线程
- 查看 -> Threads
- 显示所有线程及其状态
# 切换线程
- 在 Threads 窗口双击线程
# 暂停特定线程
- 右键线程 -> Suspend
# 线程相关断点
- 在 CreateThread API 设置断点
- 跟踪新创建的线程常见问题
程序无法运行
原因:缺少运行时库或反调试检测。
解决:
- 安装 Visual C++ 运行时库
- 使用 ScyllaHide 反反调试插件
- 检查是否有驱动级反调试
断点无效
原因:程序可能使用了反调试技术。
解决:
- 使用硬件断点替代软件断点
- 使用内存断点
- 使用 ScyllaHide 插件
程序检测到调试器
解决:
1. 安装 ScyllaHide 插件
2. 启用所有反反调试选项
3. 使用硬件断点
4. 使用 TitanHide 内核级隐藏32 位和 64 位选择
说明:
- 32 位程序使用 x32dbg
- 64 位程序使用 x64dbg
- 可通过 PE 头判断:File Header -> Machine
中文显示乱码
解决:
- 在内存 dump 窗口选择正确的编码
- 右键 -> Text -> 选择编码
- 使用插件增强字符显示
符号加载失败
解决:
1. 确保 PDB 文件路径正确
2. Options -> Symbols -> 配置符号路径
3. 使用 Microsoft 符号服务器
srv*C:\Symbols*https://msdl.microsoft.com/download/symbols