ret-sync 代表逆向工程工具同步(Reverse-Engineering Tools SYNChronization)。它是一组插件,用于将调试会话(WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg)与反汇编器(IDA/Ghidra/Binary Ninja)同步。其核心理念很简单:从静态分析和动态分析两个世界中各取所长。
调试器和动态分析为我们提供:
!peb、!drvobj、!address 等)反汇编器和静态分析为我们提供:
主要功能:
ret-sync 是 qb-sync 的一个分支,我在 Quarkslab 工作期间开发并维护它。
调试器插件:
ext_windbg/sync:WinDbg 扩展源文件,构建后为:sync.dllext_gdb/sync.py:GDB 插件ext_lldb/sync.py:LLDB 插件ext_olly1:OllyDbg 1.10 插件ext_olly2:OllyDbg v2 插件ext_x64dbg:x64dbg 插件反汇编器插件:
ext_ida/SyncPlugin.pyext_ghidra/dist/ghidra_*_retsync.zip:Ghidra 插件ext_bn/retsync:Binary Ninja 插件以及库插件:
ext_lib/sync.py:独立的 Python 库IDA 和 GDB 插件需要有效的 Python 环境。支持 Python 2(>=2.7)和 Python 3。
WinDbg/OllyDbg/OllyDbg2/x64dbg 调试器的预构建二进制文件通过 Azure DevOps 流水线提供:
选择最新构建,并查看 Related 部分下的构件:6 published。

Ghidra 插件的预构建插件存档位于 ext_ghidra/dist 中。
对于大多数典型设置的用户(调试器和反汇编器位于同一主机,模块名称匹配),ret-sync 应该开箱即用。
尽管如此,在某些情况下可能需要特定配置。为此,扩展和插件会检查用户主目录中一个可选的全局配置文件,名为 .sync。它必须是有效的 .INI 文件。
此外,IDA 和 Ghidra 插件还会先在 IDB 或项目目录(<project>.rep)中查找配置文件,以允许每个 IDB/项目级别的本地设置。如果存在本地配置文件,则忽略全局配置文件。
这些配置文件中声明的值会覆盖默认值。请注意,默认情况下不会创建 .sync 文件。
下面我们详细介绍了三种常见需要配置文件的场景:
[INTERFACE] 部分用于自定义网络相关设置。假设有人想要将 IDA 与虚拟机(或另一台主机)中运行的调试器同步,这是常见的远程内核调试场景。
只需创建两个 .sync 文件:
它告诉 **ret-sync** ``IDA`` 插件在接口 ``192.168.128.1`` 上监听,端口为 ``9234``。显而易见,此接口必须能够从远程主机或虚拟机访问。
* 在调试器执行所在的机器上,位于用户主目录中:```
[INTERFACE]
host=192.168.128.1
port=9234
它告知 ret-sync 调试器插件连接到先前配置为监听此接口的 ret-sync IDA 插件。
注意: 必须在此处指定真实 IP,不能使用 0.0.0.0。这是因为该变量被多个来源同时用于绑定和连接,因此使用 0.0.0.0 会导致奇怪的错误。
[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe
``[ALIASES]`` 部分用于自定义反汇编器(IDA/Ghidra)用于向调度器/程序管理器注册模块的名称。
默认情况下,反汇编器插件使用输入文件的名称。但用户可能事先重命名了文件,导致其不再匹配调试器所见的实际进程或加载模块的名称。
这里我们简单地告诉调度器匹配名称 `ntkrnlmp.exe`(真实名称)而不是 `ntoskrnl_vuln.exe`(IDB 名称)。
## 使用 Qt Creator 调试前端的 gdb
Qt Creator 调试前端改变了 gdb 命令输出的记录方式。由于这会干扰同步,提供了一个选项,可以使用原始 gdb 输出进行同步,而不是临时文件。在 .sync 配置文件中使用```
[GENERAL]
use_tmp_logging_file=false
如果您希望为目标使用Qt调试前端。
/proc/<pid>/maps在某些场景中,例如通过串口调试嵌入式设备或QEMU中的原始固件时,gdb无法感知PID,因此无法访问 /proc/<pid>/maps。
在这些情况下,使用 [INIT] 部分向插件传递自定义上下文。它允许覆盖某些字段,例如PID和内存映射。
.sync 内容提取:```
[INIT]
context = {
"pid": 200,
"mappings": [ [0x400000, 0x7A81158, 0x7681158, "asav941-200.qcow2|lina"] ]
}
映射中的每个条目是:``mem_base``, ``mem_end``, ``mem_size``, ``mem_name``。
## 绕过自动地址重定位
在某些场景中,例如调试嵌入式设备或连接到极简调试接口时,绕过反汇编器插件中实现的自动地址重定位功能可能更为方便。
`use_raw_addr` 选项目前仅支持 Ghidra。在 .sync 配置文件中使用:```
[GENERAL]
use_raw_addr=true
需要 IDA 9.2 或更高版本。对于旧版本,请从可用的 Tags 中检出 ida9.2 标签之前的项目。
对于 IDA 安装,将 Syncplugin.py 和 retsync 文件夹从 ext_ida 复制到 IDA 插件目录,例如:
C:\Program Files\IDA Pro 7.4\plugins%APPDATA%\Hex-Rays\IDA Pro\plugins~/.idapro/pluginsAlt-Shift-S)或 Edit -> Plugins -> ``ret-sync`````
[sync] default idb name: ld.exe
[sync] sync enabled
[sync] cmdline: "C:\Program Files\Python38\python.exe" -u "C:\Users\user\AppData\Roaming\Hex-Rays\IDA Pro\plugins\retsync\broker.py" --idb "target.exe"
[sync] module base 0x100400000
[sync] hexrays #7.3.0.190614 found
[sync] broker started
[sync] plugin loaded
[sync] << broker << dispatcher not found, trying to run it
[sync] << broker << dispatcher now runs with pid: 6544
[sync] << broker << connected to dispatcher
[sync] << broker << listening on port 63107### IDA 插件故障排除
要排查 IDA 扩展的问题,文件 `retsync/rsconfig.py` 中提供了两个选项:```
LOG_LEVEL = logging.INFO
LOG_TO_FILE_ENABLE = False
设置 LOG_LEVEL 的值为 logging.DEBUG 可使插件输出更详细的日志。
将 LOG_TO_FILE_ENABLE 设置为 True 会触发将来自 broker.py 和 dispatcher.py 的异常信息记录到专用文件。日志文件生成在 %TMP% 文件夹中,命名模式为 retsync.%s.err 。
可以使用 ext_ghidra/dist 文件夹中的预构建版本,或按照说明自行构建。每个扩展构建仅支持插件文件名中指定的 Ghidra 版本。例如,ghidra_9.1_PUBLIC_20191104_retsync.zip 适用于 Ghidra 9.1 公开版。
3. 为你的 Ghidra 安装构建扩展(将 `$GHIDRA_DIR` 替换为你的安装目录)```bash
cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR=$GHIDRA_DIR
File -> Install Extensions...,点击 + 符号并选择 ext_ghidra/dist/ghidra_*_retsync.zip 文件,然后点击 OK。这将把 zip 中的 retsync 文件夹解压到 $GHIDRA_DIR/Extensions/Ghidra/ 中。4. 通过 Ghidra CodeBrowser 工具:使用工具栏图标或快捷键启用(``Alt+s``)/禁用(``Alt+Shift+s``)/重启(``Alt+r``)同步。
状态窗口也可从 ``Windows`` -> ``RetSyncPlugin`` 获取。通常建议将其拖放到侧边,以便与 Ghidra 环境窗口集成。
## Binary Ninja 扩展
Binary Ninja 支持为实验性功能,请确保备份您的分析数据库。
### Binary Ninja 前提条件
**ret-sync** 最低需要 Binary Ninja 2.2 版本以及 Python 3(不支持 Python 2)。
### 安装 Binary Ninja 扩展
**ret-sync** 尚未通过 Binary Ninja 的插件管理器分发;需要手动安装。只需将 `ext_bn` 文件夹的内容复制到 Binary Ninja 的 plugins 文件夹,例如:
`%APPDATA%\Binary Ninja\plugins`
重新启动 Binary Ninja 后,控制台窗口应显示以下输出:```
[sync] commands added
Loaded python3 plugin 'retsync'
使用 ext_windbg 中提供的 Visual Studio 2017 解决方案。Visual Studio Community Edition 2017 和 2026 已成功测试(中间版本也应该可以正常工作)。
这将构建 x64\release\sync.dll 文件。
您需要将生成的 sync.dll 文件复制到相应的 Windbg 扩展路径中。
对于早期版本的 Windbg,路径类似于这样(注意 x86/x64 版本),例如
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\sync.dll
存储扩展的文件夹似乎基于 PATH,因此您需要将其放在查询的位置之一。
一个示例是放在这里:
C:\Users\user\AppData\Local\Microsoft\WindowsApps\sync.dll