Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
ret-sync — ret-sync 是一组插件,用于将调试会话(WinDbg/GDB/LLDB/OllyDbg2/x64dbg)与 IDA/Ghidra/Binary Ninja 反汇编器同步。 | Kitploit
工具/GitHubGitHub/bootleg/ret-sync
动态分析 (沙盒)逆向工程调试器实用工具与框架二进制分析
GitHubbootleg/ret-sync

ret-sync

ret-sync 是一组插件,用于将调试会话(WinDbg/GDB/LLDB/OllyDbg2/x64dbg)与 IDA/Ghidra/Binary Ninja 反汇编器同步。

查看仓库
2.4k307166个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

ret-sync

ret-sync 代表逆向工程工具同步(Reverse-Engineering Tools SYNChronization)。它是一组插件,用于将调试会话(WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg)与反汇编器(IDA/Ghidra/Binary Ninja)同步。其核心理念很简单:从静态分析和动态分析两个世界中各取所长。

调试器和动态分析为我们提供:

  • 局部视图,具有实时动态上下文(寄存器、内存等)
  • 内置的特殊功能/API(例如:WinDbg 的 !peb、!drvobj、!address 等)

反汇编器和静态分析为我们提供:

  • 模块的宏观视图
  • 代码分析、签名、类型等
  • 精美的图形视图
  • 反编译
  • IDB/GPR 中知识的持久化存储

主要功能:

  • 将图形和反编译视图与调试器状态同步
  • 无需处理 ASLR,地址会自动重定基址
  • 将数据(注释、命令输出)从调试器传递到反汇编器
  • 可同时同步多个 IDB/GPR,便于轻松跟踪多个模块
  • 反汇编器和调试器可位于不同主机/虚拟机上

ret-sync 是 qb-sync 的一个分支,我在 Quarkslab 工作期间开发并维护它。


目录

  • 仓库内容
  • 通用先决条件
  • 二进制发布
  • ret-sync 配置
  • 安装
    • IDA 扩展
    • Ghidra 扩展
    • Binary Ninja 扩展
    • WinDbg 扩展
    • GNU gdb (GDB) 安装
    • LLDB 安装
    • OllyDbg 1.10 安装
    • OllyDbg2 安装
    • x64dbg 安装
  • 用法
    • ret-sync 调试器命令
    • IDA 用法
    • Ghidra 用法
    • Binary Ninja 用法
    • WinDbg 用法
    • GNU gdb (GDB) 用法
    • LLDB 用法
    • OllyDbg 1.10 用法
    • OllyDbg2 用法
    • x64dbg 用法
    • Python 库用法
  • 扩展
  • 待办事项
  • 已知 Bug/限制
  • 许可证
  • 致谢

仓库内容

调试器插件:

  • ext_windbg/sync:WinDbg 扩展源文件,构建后为:sync.dll
  • ext_gdb/sync.py:GDB 插件
  • ext_lldb/sync.py:LLDB 插件
  • ext_olly1:OllyDbg 1.10 插件
  • ext_olly2:OllyDbg v2 插件
  • ext_x64dbg:x64dbg 插件

反汇编器插件:

  • ext_ida/SyncPlugin.py
  • ext_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 配置

对于大多数典型设置的用户(调试器和反汇编器位于同一主机,模块名称匹配),ret-sync 应该开箱即用。

尽管如此,在某些情况下可能需要特定配置。为此,扩展和插件会检查用户主目录中一个可选的全局配置文件,名为 .sync。它必须是有效的 .INI 文件。

此外,IDA 和 Ghidra 插件还会先在 IDB 或项目目录(<project>.rep)中查找配置文件,以允许每个 IDB/项目级别的本地设置。如果存在本地配置文件,则忽略全局配置文件。

这些配置文件中声明的值会覆盖默认值。请注意,默认情况下不会创建 .sync 文件。

下面我们详细介绍了三种常见需要配置文件的场景:

  • 远程调试
  • 模块名称不匹配
  • 缺少 PID

远程调试:调试器和反汇编器位于不同主机

[INTERFACE] 部分用于自定义网络相关设置。假设有人想要将 IDA 与虚拟机(或另一台主机)中运行的调试器同步,这是常见的远程内核调试场景。

只需创建两个 .sync 文件:

  • 一个放在安装了 IDA 的机器上的 IDB 目录中:
  • 对于 Ghidra,放在主目录中,例如 "/home/user" 或 "C:\Users\user"。``` [INTERFACE] host=192.168.128.1 port=9234
root@kitploit:~
它告诉 **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 会导致奇怪的错误。

IDB 和调试器模块名称不同```

[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe

root@kitploit:~
``[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"] ] }

root@kitploit:~
映射中的每个条目是:``mem_base``, ``mem_end``, ``mem_size``, ``mem_name``。


## 绕过自动地址重定位

在某些场景中,例如调试嵌入式设备或连接到极简调试接口时,绕过反汇编器插件中实现的自动地址重定位功能可能更为方便。

`use_raw_addr` 选项目前仅支持 Ghidra。在 .sync 配置文件中使用:```
[GENERAL]
use_raw_addr=true

安装

IDA 扩展

IDA 前提条件

需要 IDA 9.2 或更高版本。对于旧版本,请从可用的 Tags 中检出 ida9.2 标签之前的项目。

安装 IDA 扩展

对于 IDA 安装,将 Syncplugin.py 和 retsync 文件夹从 ext_ida 复制到 IDA 插件目录,例如:

  • C:\Program Files\IDA Pro 7.4\plugins
  • %APPDATA%\Hex-Rays\IDA Pro\plugins
  • ~/.idapro/plugins

运行 IDA 扩展

  1. 打开 IDB
  2. 在 IDA 中运行插件(Alt-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
root@kitploit:~
### 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 。

Ghidra 扩展

构建 Ghidra 扩展

可以使用 ext_ghidra/dist 文件夹中的预构建版本,或按照说明自行构建。每个扩展构建仅支持插件文件名中指定的 Ghidra 版本。例如,ghidra_9.1_PUBLIC_20191104_retsync.zip 适用于 Ghidra 9.1 公开版。

  1. 安装 Ghidra
  2. 安装 gradle```bash apt install gradle
root@kitploit:~
3. 为你的 Ghidra 安装构建扩展(将 `$GHIDRA_DIR` 替换为你的安装目录)```bash
cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR=$GHIDRA_DIR

安装 Ghidra 扩展

  1. 在 Ghidra 项目管理器中:File -> Install Extensions...,点击 + 符号并选择 ext_ghidra/dist/ghidra_*_retsync.zip 文件,然后点击 OK。这将把 zip 中的 retsync 文件夹解压到 $GHIDRA_DIR/Extensions/Ghidra/ 中。
  2. 按提示重启 Ghidra
  3. 重新加载 Ghidra 后,在 CodeBrowser 中打开一个模块。它应提示检测到新扩展插件。选择“是”进行配置。然后勾选“RetSyncPlugin”并点击 OK。控制台应显示类似内容:``` [*] retsync init [>] programOpened: tm.sys imageBase: 0x1c0000000
root@kitploit:~
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'

WinDbg 扩展

构建 WinDbg 扩展

使用 ext_windbg 中提供的 Visual Studio 2017 解决方案。Visual Studio Community Edition 2017 和 2026 已成功测试(中间版本也应该可以正常工作)。

这将构建 x64\release\sync.dll 文件。

安装 WinDbg 扩展

您需要将生成的 sync.dll 文件复制到相应的 Windbg 扩展路径中。

  • WinDbg Classic:

对于早期版本的 Windbg,路径类似于这样(注意 x86/x64 版本),例如

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\sync.dll

  • Windbg Preview

存储扩展的文件夹似乎基于 PATH,因此您需要将其放在查询的位置之一。

一个示例是放在这里:

C:\Users\user\AppData\Local\Microsoft\WindowsApps\sync.dll

运行 WinDbg 扩展

  1. 在目标上启动 WinDbg
  2. 加载扩展(.load 命令)``` 0:000> .load sync [sync.dll] DebugExtensionInitialize, ExtensionApis loaded
root@kitploit:~
3. 同步 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

root@kitploit:~
如果 Windbg 的当前模块匹配 IDA 文件名```
      [sync] idb is enabled with the idb client matching the module name.

WinDbg 安装故障排除

注意:如果您遇到以下错误,则是因为您尚未按照上述步骤将文件复制到正确的文件夹。``` 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.

root@kitploit:~
下面的错误通常意味着 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

root@kitploit:~
## 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 安装

LLDB 支持目前是实验性的,但是:

  1. 加载扩展(也可以添加到 ~/.lldbinit 中)``` lldb> command script import sync
root@kitploit:~
## 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 窗口中:

![](https://assets.kitploit.com/production/public/readmes/3693/c6d122e27a256e4f99d0f760d2d6febb89648881dbdee9d6ffd84092bb0d9931.png)

如果您想要查看多个模块,需要在同一个 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

root@kitploit:~
* **!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

root@kitploit:~
* **!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
  • !bc <||on|off|set 0xBBGGRR> : 启用/禁用反汇编器中的路径着色。 这并不是一个代码追踪工具, 已经有高效的工具来完成该工作。每个手动单步执行的指令都会在图中着色。 如果不带参数调用,则对当前 IP 处的单条指令着色。 "set" 参数用于使用新的十六进制 RGB 码设置路径颜色(如果调用的值大于 0xFFFFFF,则重置颜色)。
  • !idblist: 获取连接到调度器的所有 IDB 客户端列表:``` [WinDbg] 0:000> !idblist

    currently connected idb(s): [0] target.exe

root@kitploit:~
* **!syncmodauto <on|off>**:启用/禁用基于模块名称的反汇编器自动切换:```
    [WinDbg]
    0:000> !syncmodauto off

    [IDA]
    [*] << broker << dispatcher msg: sync mode auto set to off
  • !idbn : 将活动IDB设置为第n个客户端。n应为一个有效的十进制数值。 这是一种半自动模式(对伟大的jj的个人致敬)``` [WinDbg] 0:000:> !idbn 0

    current idb set to 0

root@kitploit:~
在此示例中,当前活动的IDB客户端将被设置为:```
	[0] target.exe.
  • !jmpto :以参数形式给出的表达式会在当前调试器状态的上下文中进行求值。 如果注册了匹配的模块,则反汇编器的视图会与结果地址同步。 可以视为手动同步,重定位会自动实时执行。 特别适用于随机重定位的二进制文件。
  • !jmpraw :以参数形式给出的表达式会在当前调试器状态的上下文中进行求值。 如果启用了IDB,则反汇编器的视图会与结果地址同步。地址不会重新基址化,也不会进行IDB切换。 特别适用于动态分配/生成的代码。
  • !modmap :将一个合成的(“伪造的”)模块(使用其基地址和大小定义)添加到调试器内部列表中。 来自MSDN:“如果所有模块被重新加载——例如,通过调用Reload并将Module参数设置为空字符串——所有合成模块将被丢弃。” 它可以用于更轻松地调试动态分配/生成的代码。
  • !modunmap :移除之前映射的位于基地址的合成模块。
  • !modcheck <||md5>:用于检查当前模块是否真的与IDB的文件匹配(例如:模块已更新) 当不传参调用时,使用调试目录中的PDB的GUID。也可以选择使用md5,但仅适用于本地调试目标(不适用于远程内核调试)。
  • !bpcmds <||save|load|>:bpcmds的包装器,保存并重新加载 .bpcmds(断点命令列表)输出到当前IDB。 如果不带参数调用,则显示(但不执行)已保存的数据。 持久化存储通过使用IDA的netnode功能实现。
  • !ks:调试器标记语言(DML)增强的 kv 命令输出。代码地址是可点击的(!jmpto),数据地址也是可点击的(dc)。
  • !translate :旨在从IDA中使用(快捷键 Alt-F2),根据模块名称和偏移量重新计算地址的基址。

可选的地址参数

!cmt、!rcmt 和 !fcmt 命令支持一个可选的地址选项:-a 或 --address。 地址应以十六进制值传递。命令解析基于Python的 argparse 模块。要停止行解析,请使用 --。``` [WinDbg] 0:000:x86> !cmt -a 0x430DB2 comment

root@kitploit:~
地址必须是有效的指令地址。

## 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 插件命令

使用命令,不要带 "!" 前缀``` (gdb) cmd x/i $pc [sync] command output: => 0x8049ca3: push edi

root@kitploit:~
(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>
root@kitploit:~
* **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)

root@kitploit:~
## LLDB 用法

1. 与宿主机同步```
    lldb> process launch -s
    lldb> sync
    [sync] connecting to localhost
    [sync] sync is now enabled with host localhost
    [sync] event handler started
  1. 使用命令``` lldb> synchelp [sync] extension commands help:

    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

root@kitploit:~
## 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 )。

Python 库使用

即使没有完整的调试环境或使用自定义工具,也可能需要使用 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()

root@kitploit:~
# 扩展

虽然最初专注于动态分析(调试器),但自然也可以扩展插件集并与其他工具集成。

- 与 **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。最后,还要感谢所有贡献者以及报告问题/错误的人。

下载工具