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
.load 命令)```
0:000> .load sync
[sync.dll] DebugExtensionInitialize, ExtensionApis loaded3. 同步 WinDbg```
0:000> !sync
[sync] No argument found, using default host (127.0.0.1:9100)
[sync] sync success, sock 0x5a8
[sync] probing sync
[sync] sync is now enabled with host 127.0.0.1
例如,在 IDA 的输出窗口中``` [] << broker << dispatcher msg: add new client (listening on port 63898), nb client(s): 1 [] << broker << dispatcher msg: new debugger client: dbg connect - HostMachine\HostUser [sync] set debugger dialect to windbg, enabling hotkeys
如果 Windbg 的当前模块匹配 IDA 文件名```
[sync] idb is enabled with the idb client matching the module name.
注意:如果您遇到以下错误,则是因为您尚未按照上述步骤将文件复制到正确的文件夹。``` 0: kd> .load sync The call to LoadLibrary(sync) failed, Win32 error 0n2 "The system cannot find the file specified." Please check your debugger configuration and/or network access.
下面的错误通常意味着 Windbg 尝试加载了不正确的扩展版本,例如:用 ``x64`` 代替了 ``x86`` 的 `sync.dll`。```
0:000> .load sync
The call to LoadLibrary(sync) failed, Win32 error 0n193
"%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.
由于 WinDbg Preview 从同一目录加载两个插件(x86 和 x64),可以将 x86 文件重命名为 sync32.dll。```
0:000> .load sync32
## GNU gdb (GDB) 安装
1. 将 `ext_gdb/sync.py` 复制到你选择的目录
2. 加载扩展(参见 auto-load-scripts)```
gdb> source sync.py
[sync] configuration file loaded 192.168.52.1:9100
[sync] commands added
LLDB 支持目前是实验性的,但是:
~/.lldbinit 中)```
lldb> command script import sync## OllyDbg 1.10 安装
OllyDbg 1.10 支持是实验性的,但:
1. 使用VS解决方案构建插件(可选,见预编译二进制文件)
2. 将dll复制到OllyDbg的插件目录中
## OllyDbg2 安装
OllyDbg2 支持是实验性的,但:
1. 使用VS解决方案构建插件(可选,见预编译二进制文件)
2. 将dll复制到OllyDbg2的插件目录中
## x64dbg 安装
基于 testplugin,https://github.com/x64dbg/testplugin。x64dbg 支持是实验性的,但:
1. 使用VS解决方案构建插件(可选,见预编译二进制文件)。
可能需要不同版本的插件 sdk,
可在 x64dbg 的每个发行版中找到。
将 "``pluginsdk``" 目录粘贴到 "``ext_x64dbg\x64dbg_sync``" 中
2. 将 dll(扩展名为 ``.d32`` 或 ``.dp64``)复制到 x64dbg 的插件目录中。
# 用法
## **ret-sync** 调试器命令
对于面向命令行的调试器(主要是 Windbg 和 GDB),**ret-sync** 提供了一组命令
来辅助逆向工程任务。
以下命令是通用的(Windbg 和 GDB),请注意在 WinDbg 上需要加 `!` 前缀(例如:GDB 中为 `sync`,WinDbg 中为 `!sync`)。
| Debugger command | Description |
|----------------------------|-------------------------------------------------------------------------------------------|
| `synchelp` | 显示可用命令列表及简短说明 |
| `sync` | 开始同步 |
| `syncoff` | 停止同步 |
| `cmt [-a address] <string>` | 在反汇编器中当前指令指针位置添加注释 |
| `rcmt [-a address]` | 重置反汇编器中当前指令指针位置的注释 |
| `fcmt [-a address] <string>` | 在当前指令指针所在函数中添加函数注释 |
| `raddr <expression>` | 根据表达式计算重基地址并添加注释 |
| `rln <expression>` | 从反汇编器获取给定地址的符号 |
| `lbl [-a address] <string>` | 在反汇编器中当前指令指针位置添加标签名 |
| `cmd <string>` | 在调试器中执行命令,并将其输出作为注释添加到反汇编器中当前指令指针位置 |
| `bc <\|\|on\|off\|set 0xBBGGRR>` | 启用/禁用反汇编器中的路径着色 |
| `idblist` | 获取所有连接到调度器的 IDB 客户端列表 |
| `syncmodauto <on\|off>` | 启用/禁用基于模块名称的反汇编器自动切换 |
| `idbn <n>` | 将第 n 个客户端设置为活动的 IDB |
| `jmpto <expression>` | |
| `jmpraw <expression>` | 如果启用了某个 IDB,则将反汇编器的视图同步到结果地址。 |
| `translate <base> <addr> <mod>` | 根据模块名称和偏移量重新计算地址 |
WinDbg 特定命令:
| Debugger command | Description |
|----------------------------|-------------------------------------------------------------------------------------------|
| `curmod` | 显示当前指令偏移的模块信息(用于故障排除) |
| `modlist` | 调试器标记语言(DML)增强的模块列表,便于更流畅地切换活动 idb |
| `idb <module name>` | 将给定模块设置为活动的 idb(参见 `modlist` 增强版 `lm`) |
| `modmap <base> <size> <name>` | 将一个合成(“伪造”)模块(通过基址和大小定义)添加到调试器内部列表 |
| `modunmap <base>` | 移除之前映射在基址处的合成模块 |
| `modcheck <\|\|md5>` | 用于检查当前模块是否与 IDB 的文件匹配(例如:模块已更新) |
| `bpcmds <\|\|save\|load\|>` | **bpcmds** 包装器,保存并重新加载 **.bpcmds**(断点命令列表)输出到当前 IDB |
| `ks` | 调试器标记语言(DML)增强的 **kv** 命令输出 |
GDB 特定命令:
| Debugger command | Description |
|----------------------------|-------------------------------------------------------------------------------------------|
|`bbt` | 美化回溯。类似于 GDB 中的 **bt**,但从反汇编器请求符号 |
| `patch` | 基于实时上下文在反汇编器中打补丁字节 |
| `bx` | 类似于 GDB 的 **x**,但使用符号。符号将由反汇编器解析 |
| `cc` | 在反汇编器中继续到光标处 |
## IDA 用法
### IDA 插件的 GUI
“``Overwrite idb name``”输入字段用于更改默认的 IDB 名称。
这是插件用于向调度器注册的名称。IDB 自动切换基于模块名称匹配。如果出现
名称冲突(如 ``foo.exe`` 和 ``foo.dll``),可用此字段简化匹配。请注意,如果在同步处于活动状态时修改输入字段,则必须重新向调度器注册;可以通过使用“``Restart``”按钮完成此操作。
提醒一下,可以使用 ``.sync`` 配置文件默认设置别名。
### IDA 全局快捷键
**ret-sync** 在 IDA 中定义了以下全局快捷键:
* ``Alt-Shift-S`` - 运行 **ret-sync** 插件
* ``Ctrl-Shift-S`` - 切换全局同步
* ``Ctrl-H`` - 切换 Hex-Rays 同步
在调试工具栏中还有两个按钮用于切换全局和 Hex-Rays 同步。
### IDA 调试器命令绑定
``Syncplugin.py`` 还注册了调试器命令包装器热键。
* ``F2`` - 在光标地址处设置断点
* ``F3`` - 在光标地址处设置一次性断点
* ``Ctrl-F2`` - 在光标地址处设置硬件断点
* ``Ctrl-F3`` - 在光标地址处设置一次性硬件断点
* ``Alt-F2`` - 转换(在调试器中重新基址)当前光标地址
* ``Alt-F5`` - 运行
* ``Ctrl-Alt-F5`` - 运行(仅 GDB)
* ``F10`` - 单步执行
* ``F11`` - 单步跟踪
这些命令仅在当前 IDB 处于活动状态时可用。在可能的情况下,它们也已在其他调试器中实现。
## Ghidra 用法
### Ghidra 插件的 GUI
打开 RetSyncPlugin 后,您可以通过简单的拖拽将其添加到 CodeBrowser 窗口中:

如果您想要查看多个模块,需要在同一个 CodeBrowser 查看器中打开文件,只需将其他模块拖拽到 CodeBrowser 窗口中即可得到上述结果。
### Ghidra 全局快捷键
**ret-sync** 在 Ghidra 中定义了以下全局快捷键:
* ``Alt-S`` - 启用同步
* ``Alt-Shift-S`` - 禁用同步
* ``Alt-R`` - 重新启动同步
* ``Alt-Shift-R`` - 重新加载配置
### Ghidra 调试器命令绑定
还实现了对调试器命令的绑定。它们与 IDA 扩展的绑定类似(除了“运行”命令)。
* ``F2`` - 在光标地址处设置断点
* ``Ctrl-F2`` - 在光标地址处设置硬件断点
* ``Alt-F3`` - 在光标地址处设置一次性断点
* ``Ctrl-F3`` - 在光标地址处设置一次性硬件断点
* ``Alt-F2`` - 转换(在调试器中重新基址)当前光标地址
* ``F5`` - 运行
* ``Alt-F5`` - 运行(仅 GDB)
* ``F10`` - 单步执行
* ``F11`` - 单步跟踪
## Binary Ninja 用法
### Binary Ninja 全局快捷键
**ret-sync** 在 Binary Ninja 中定义了以下全局快捷键:
* ``Alt-S`` - 启用同步
* ``Alt-Shift-S`` - 禁用同步
### Binary Ninja 快捷键
还实现了对调试器命令的绑定。它们与 IDA 扩展的绑定类似。
* ``F2`` - 在光标地址处设置断点
* ``Ctrl-F2`` - 在光标地址处设置硬件断点
* ``Alt-F3`` - 在光标地址处设置一次性断点
* ``Ctrl-F3`` - 在光标地址处设置一次性硬件断点
* ``Alt-F2`` - 转换(在调试器中重新基址)当前光标地址
* ``Alt-F5`` - 运行
* ``F10`` - 单步执行
* ``F11`` - 单步跟踪
## WinDbg 用法
### WinDbg 插件命令
* **!sync**: 开始同步
* **!syncoff**: 停止同步
* **!synchelp**: 显示可用命令列表及简短说明。
* **!cmt [-a address] <string>**: 在 IDA 中当前指令指针位置添加注释```
[WinDbg]
0:000:x86> pr
eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
image00000000_00400000+0x30db1:
00430db1 57 push edi
0:000:x86> dd esp 8
0028ed94 00000000 00433845 0028eebc 00000032
0028eda4 0028f88c 00000064 002b049e 00000110
0:000:x86> !cmt 0028ed94 00000000 00433845 0028eebc 00000032
[sync.dll] !cmt called
[IDA]
.text:00430DB1 push edi ; 0028ed94 00000000 00433845 0028eebc 00000032
!rcmt [-a address]:在 IDA 中重置当前 IP 处的注释``` [WinDbg] 0:000:x86> !rcmt [sync] !rcmt called
[IDA] .text:00430DB1 push edi
* **!fcmt [-a address] <string>**: 为当前IP所在的函数添加函数注释```
[WinDbg]
0:000:x86> !fcmt decodes buffer with key
[sync] !fcmt called
[IDA]
.text:004012E0 ; decodes buffer with key
.text:004012E0 public decrypt_func
.text:004012E0 decrypt_func proc near
.text:004012E0 push ebp
Note: calling this command without argument reset the function's comment.
!raddr : 添加一个注释,其中包含从表达式计算出的重定位地址。
!rln : 从反汇编器中获取给定地址的符号。
!lbl [-a address] : 在反汇编器的当前指令指针处添加一个标签名称。``` [WinDbg] 0:000:x86> !lbl meaningful_label [sync] !lbl called
[IDA] .text:000000000040271E meaningful_label: .text:000000000040271E mov rdx, rsp
* **!cmd <string>**: 在 WinDbg 中执行一个命令,并将其输出作为注释添加到反汇编器中当前 ip 处```
[WinDbg]
0:000:x86> pr
eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
image00000000_00400000+0x30db1:
00430db1 57 push edi
[sync.dll] !cmd r edi
[IDA]
.text:00430DB1 push edi ; edi=00000064
currently connected idb(s): [0] target.exe
* **!syncmodauto <on|off>**:启用/禁用基于模块名称的反汇编器自动切换:```
[WinDbg]
0:000> !syncmodauto off
[IDA]
[*] << broker << dispatcher msg: sync mode auto set to off
current idb set to 0
在此示例中,当前活动的IDB客户端将被设置为:```
[0] target.exe.
Alt-F2),根据模块名称和偏移量重新计算地址的基址。!cmt、!rcmt 和 !fcmt 命令支持一个可选的地址选项:-a 或 --address。
地址应以十六进制值传递。命令解析基于Python的 argparse 模块。要停止行解析,请使用 --。```
[WinDbg]
0:000:x86> !cmt -a 0x430DB2 comment
地址必须是有效的指令地址。
## GNU gdb (GDB) 用法
与主机同步:```
gdb> sync
[sync] sync is now enabled with host 192.168.52.1
<not running>
gdb> r
Starting program: /bin/ls
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
使用命令,不要带 "!" 前缀``` (gdb) cmd x/i $pc [sync] command output: => 0x8049ca3: push edi
(gdb) synchelp
[sync] extension commands help:
> sync <host>
> syncoff
> cmt [-a address] <string>
> rcmt [-a address] <string>
> fcmt [-a address] <string>
> cmd <string>
> bc <on|off|>
> rln <address>
> bbt <symbol>
> patch <addr> <count> <size>
> bx /i <symbol>
> cc
> translate <base> <addr> <mod>
* **rln**: 从IDB获取给定地址的符号
* **bbt**: 漂亮回溯。与**bt**类似,但从反汇编器请求符号```
(gdb) bt
#0 0x0000000000a91a73 in ?? ()
#1 0x0000000000a6d994 in ?? ()
#2 0x0000000000a89125 in ?? ()
#3 0x0000000000a8a574 in ?? ()
#4 0x000000000044f83b in ?? ()
#5 0x0000000000000000 in ?? ()
(gdb) bbt
#0 0x0000000000a91a73 in IKE_GetAssembledPkt ()
#1 0x0000000000a6d994 in catcher ()
#2 0x0000000000a89125 in IKEProcessMsg ()
#3 0x0000000000a8a574 in IkeDaemon ()
#4 0x000000000044f83b in sub_44F7D0 ()
#5 0x0000000000000000 in ()
patch: 在反汇编器中基于实时上下文修补字节
bx: 美观显示。类似于 x 但使用符号。符号将由反汇编器解析。
cc: 在反汇编器中继续到光标处。这是使用 F3 设置一次性断点并用 F5 继续的替代方法。如果你更喜欢从 gdb 中操作,这很有用。```
(gdb) b* 0xA91A73
Breakpoint 1 at 0xa91a73
(gdb) c
Continuing.
Breakpoint 1, 0x0000000000a91a73 in ?? () (gdb) cc [sync] current cursor: 0xa91a7f [sync] reached successfully (gdb)
## LLDB 用法
1. 与宿主机同步```
lldb> process launch -s
lldb> sync
[sync] connecting to localhost
[sync] sync is now enabled with host localhost
[sync] event handler started
sync = synchronize with or the default value syncoff = stop synchronization cmt = add comment at current eip in IDA rcmt = reset comments at current eip in IDA fcmt = add a function comment for 'f = get_func(eip)' in IDA cmd = execute command and add its output as comment at current eip in IDA bc <on|off|> = enable/disable path coloring in IDA color a single instruction at current eip if called without argument lldb> cmt mooo
## OllyDbg 1.10 使用
1. 使用插件菜单或快捷键启用(``Alt+s``)/禁用(``Alt+u``)同步。
## OllyDbg2 使用
1. 使用插件菜单或快捷键启用(``Ctrl+s``)/禁用(``Ctrl+u``)同步。
由于 OllyDbg2 API 仍处于测试阶段,仅实现了以下功能:
- 图形同步 [使用 ``F7``;``F8`` 进行单步调试]
- 注释 [使用 ``CTRL+;``]
- 标签 [使用 ``CTRL+:``]
## x64dbg 使用
1. 使用插件菜单或命令启用("``!sync"``)或禁用("``!syncoff``”)同步。
2. 使用命令```
[sync] synchelp command!
[sync] extension commands help:
> !sync = synchronize with <host from conf> or the default value
> !syncoff = stop synchronization
> !syncmodauto <on | off> = enable / disable idb auto switch based on module name
> !synchelp = display this help
> !cmt <string> = add comment at current eip in IDA
> !rcmt <string> = reset comments at current eip in IDA
> !idblist = display list of all IDB clients connected to the dispatcher
> !idb <module name> = set given module as the active idb (see !idblist)
> !idbn <n> = set active idb to the n_th client. n should be a valid decimal value
> !translate <base> <addr> <mod> = rebase an address with respect to local module's base
> !insync = synchronize the selected instruction block in the disassembly window.
注意:在反汇编器(IDA/Ghidra)中使用 !translate 命令(Alt-F2 快捷键)将使反汇编器窗口“跳转”到特定地址(相当于在 x64dbg 命令行中运行 disasm )。
即使没有完整的调试环境或使用自定义工具,也可能需要使用 ret-sync 的核心功能(与反汇编器的位置同步、符号解析)。为此,已经提取了一个最小化的 Python 库。
下面的示例说明了如何将 Python 库与一个遍历基于事件的日志/跟踪工具输出的脚本一起使用。```python from sync import *
HOST = '127.0.0.1'
MAPPINGS = [ [0x555555400000, 0x555555402000, 0x2000, " /bin/tempfile"], [0x7ffff7dd3000, 0x7ffff7dfc000, 0x29000, " /lib/x86_64-linux-gnu/ld-2.27.so"], [0x7ffff7ff7000, 0x7ffff7ffb000, 0x4000, " [vvar]"], [0x7ffff7ffb000, 0x7ffff7ffc000, 0x1000, " [vdso]"], [0x7ffffffde000, 0x7ffffffff000, 0x21000, " [stack]"], ]
EVENTS = [ [0x0000555555400e74, "malloc"], [0x0000555555400eb3, "open"], [0x0000555555400ee8, "exit"] ]
synctool = Sync(HOST, MAPPINGS)
for e in EVENTS: offset, name = e synctool.invoke(offset) print(" 0x%08x - %s" % (offset, name)) print("[>] press enter for next event") input()
# 扩展
虽然最初专注于动态分析(调试器),但自然也可以扩展插件集并与其他工具集成。
- 与 **REVEN** 时间无关分析与调试平台(由 [Tetrane](https://www.tetrane.com/) 提供)集成:
- http://blog.tetrane.com/2015/02/reven-in-your-toolkit.html
- https://twitter.com/tetrane/status/1374768014193799175
- 与 **EFI DXE Emulator**(由 Assaf Carlsbad [@assaf_carlsbad](https://twitter.com/assaf_carlsbad) 开发)集成:
- https://twitter.com/assaf_carlsbad/status/1242114356881641474
- https://github.com/assafcarlsbad/efi_dxe_emulator
其他资源:
- "*结合静态与动态二进制分析 - ret-sync*",作者 Jean-Christophe Delaunay
- https://www.synacktiv.com/ressources/bieresecu1_ret-sync_en.pdf
# 待办事项
- 确实如此。
# 已知缺陷/限制
- 已在 Python 2.7/3.7、IDA 7.7(Windows、Linux 和 Mac OS X)、Ghidra 10.1.1、Binary Ninja 3.0.3225-dev、GNU gdb (GDB) 8.1.0 (Debian)、lldb 310.2.37 上测试。
- **双方之间没有任何身份验证/加密**;后果自负。
- 自修改代码不在支持范围内。
在 GDB 下:
- 使用 'return' 命令时似乎不会触发停止事件。
- 多线程调试存在信号相关的问题。
在 WinDbg 下:
- IDA 客户端插件即使遇到的断点使用了使其继续执行的命令字符串(``g``),仍然会收到通知。如果此类事件过多,可能会导致严重减速。已实现一个有限的修复,最佳方案仍然是临时关闭同步。
- 可能存在竞态条件。
在 Ghidra 下:
- 快捷键在反编译器窗口中无法正常工作。
在 IDA 下:
- 图形窗口对于大型图表的重绘速度相当慢。
- **ret-sync** 的快捷键在 Linux 环境中存在冲突。
冲突:
- 罗技更新软件已知使用相同的默认端口(9100)。一种解决方案是使用全局 `.sync` 配置文件来定义不同的端口。```
[INTERFACE]
host=127.0.0.1
port=9234
ret-sync 是自由软件:您可以根据自由软件基金会发布的GNU通用公共许可证(GPL)的条款(许可证第3版,或(根据您的选择)任何更高版本)重新分发和/或修改它。
本程序的分发是希望它有用,但没有任何担保;甚至没有适销性或特定用途的隐含担保。有关更多详细信息,请参阅GNU通用公共许可证。
您应该已随本程序收到一份GNU通用公共许可证副本。如果没有,请访问 http://www.gnu.org/licenses/。
Binary Ninja 插件根据 MIT 许可证发布。
感谢 Bruce Dang、StalkR、@Ivanlef0u、Damien Aumaître、Sébastien Renaud 和 Kévin Szkudlapski、@m00dy、@saidelike、Xavier Mehrenberger、ben64、Raphaël Rigo、Jiss 的友善、帮助、反馈和思考。感谢 Ilfak Guilfanov、Igor Skochinsky 和 Arnaud Diederen 在 IDA 内部机制和出色支持方面提供的帮助。感谢 Jordan Wiens 和 Vector 35。最后,还要感谢所有贡献者以及报告问题/错误的人。