
ret-sync は、デバッグセッション(WinDbg/GDB/LLDB/OllyDbg2/x64dbg)を IDA/Ghidra/Binary Ninja の逆アセンブラと同期させるプラグインのセットです。
ret-sync は Reverse-Engineering Tools SYNChronization(逆解析ツールの同期)の略です。これは、デバッグセッション(WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg)と逆アセンブラ(IDA/Ghidra/Binary Ninja)を同期するためのプラグイン群です。基本的な考え方は単純です:静的解析と動的解析の両方の長所を活かすことです。
デバッガと動的解析は、以下を提供します:
!peb、!drvobj、!addressなど)逆アセンブラと静的解析は、以下を提供します:
主な機能:
ret-sync は、私が Quarkslab 在籍中に開発・保守した qb-sync のフォークです。
デバッガプラグイン:
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 ファイルは作成されないことに注意してください。
以下に、設定ファイルが有用/必要となる3つの一般的なシナリオを詳しく説明します:
[INTERFACE] セクションは、ネットワーク関連の設定をカスタマイズするために使用します。例えば、IDA を仮想マシン(または別のホスト)内で動作するデバッガと同期させたい場合(一般的なリモートカーネルデバッグシナリオ)を考えます。
単純に2つの .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名)の代わりに一致させるように指示するだけです。
## gdbとQt Creatorデバッグフロントエンド
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のインストールでは、ext_idaからSyncplugin.pyとretsyncフォルダを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プラグインのトラブルシューティング
To troubleshoot issues with the IDA extension two options are available in the
file `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 Public 用です。
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 のプラグインフォルダにコピーしてください。例:
`%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.
As 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`)。
| デバッガーコマンド | 説明 |
|----------------------------|-------------------------------------------------------------------------------------------|
| `synchelp` | 利用可能なコマンドのリストを簡単な説明付きで表示します |
| `sync` | 同期を開始します |
| `syncoff` | 同期を停止します |
| `cmt [-a address] <string>` | 逆アセンブラ内の現在の IP にコメントを追加します |
| `rcmt [-a address]` | 逆アセンブラ内の現在の IP のコメントをリセットします |
| `fcmt [-a address] <string>` | 現在の IP が位置する関数に関数コメントを追加します |
| `raddr <expression>` | 式から評価された再ベースアドレスをコメントとして追加します |
| `rln <expression>` | 逆アセンブラから指定されたアドレスのシンボルを取得します |
| `lbl [-a address] <string>` | 逆アセンブラ内の現在の IP にラベル名を追加します |
| `cmd <string>` | デバッガーでコマンドを実行し、その出力を逆アセンブラ内の現在の IP にコメントとして追加します |
| `bc <\|\|on\|off\|set 0xBBGGRR>` | 逆アセンブラでのパスカラーリングを有効/無効にします |
| `idblist` | ディスパッチャーに接続されているすべての IDB クライアントのリストを取得します |
| `syncmodauto <on\|off>` | モジュール名に基づく逆アセンブラの自動切り替えを有効/無効にします |
| `idbn <n>` | アクティブな IDB を n 番目のクライアントに設定します |
| `jmpto <expression>` | |
| `jmpraw <expression>` | IDB が有効な場合、逆アセンブラのビューが結果のアドレスと同期されます。 |
| `translate <base> <addr> <mod>` | アドレスをモジュール名とオフセットに関して再ベースします |
WinDbg 固有のコマンド:
| デバッガーコマンド | 説明 |
|----------------------------|-------------------------------------------------------------------------------------------|
| `curmod` | 現在の命令オフセットのモジュール情報を表示します(トラブルシューティング用) |
| `modlist` | デバッガーマークアップ言語 (DML) 強化版モジュールリスト。アクティブな IDB の切り替えをスムーズに行います |
| `idb <モジュール名>` | 指定されたモジュールをアクティブな IDB に設定します (`modlist` の強化版 `lm` を参照) |
| `modmap <base> <size> <name>` | 合成(「偽の」)モジュール(ベースアドレスとサイズで定義)をデバッガーの内部リストに追加します |
| `modunmap <base>` | 指定したベースアドレスの合成モジュールマッピングを削除します |
| `modcheck <\|\|md5>` | 現在のモジュールが本当に IDB のファイルと一致しているか確認するために使用します(例:モジュールが更新された場合) |
| `bpcmds <\|\|save\|load\|>` | **bpcmds** ラッパー。**.bpcmds**(ブレークポイントコマンドリスト)出力を現在の IDB に保存/再読み込みします |
| `ks` | デバッガーマークアップ言語 (DML) 強化版 **kv** コマンドの出力 |
GDB 固有のコマンド:
| デバッガーコマンド | 説明 |
|----------------------------|-------------------------------------------------------------------------------------------|
|`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 同期を切り替えるための 2 つのボタンがあります。
### IDA のデバッガーコマンドへのバインド
``Syncplugin.py`` は、デバッガーコマンドラッパーのホットキーも登録します。
* ``F2`` - カーソルアドレスにブレークポイントを設定
* ``F3`` - カーソルアドレスにワンショットブレークポイントを設定
* ``Ctrl-F2`` - カーソルアドレスにハードウェアブレークポイントを設定
* ``Ctrl-F3`` - カーソルアドレスにワンショットハードウェアブレークポイントを設定
* ``Alt-F2`` - 現在のカーソルアドレスを変換(デバッガーで再ベース)
* ``Alt-F5`` - Go
* ``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 拡張のものと似ています("Go" コマンドを除く)。
* ``F2`` - カーソルアドレスにブレークポイントを設定
* ``Ctrl-F2`` - カーソルアドレスにハードウェアブレークポイントを設定
* ``Alt-F3`` - カーソルアドレスにワンショットブレークポイントを設定
* ``Ctrl-F3`` - カーソルアドレスにワンショットハードウェアブレークポイントを設定
* ``Alt-F2`` - 現在のカーソルアドレスを変換(デバッガーで再ベース)
* ``F5`` - Go
* ``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`` - Go
* ``F10`` - シングルステップ
* ``F11`` - シングルトレース
## WinDbg の使用法
### WinDbg プラグインコマンド
* **!sync**: 同期を開始
* **!syncoff**: 同期を停止
* **!synchelp**: 利用可能なコマンドのリストを簡単な説明付きで表示
* **!cmt [-a address] <string>**: IDA 内の現在の 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
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]: 現在の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
注:このコマンドを引数なしで呼び出すと、関数のコメントがリセットされます。
!raddr : 式から評価された再ベース済みアドレスでコメントを追加します
!rln : 指定されたアドレスの逆アセンブラからシンボルを取得します
!lbl [-a address] : 逆アセンブラの現在のIPにラベル名を追加します``` [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。
アドレスは16進数値として渡す必要があります。コマンドの解析は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.
Note: ディスアセンブラ(IDA/Ghidra、Alt-F2 ショートカット)から !translate コマンドを使用すると、ディスアセンブラウィンドウが特定のアドレスに「ジャンプ」します(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()
# 拡張
当初は動的解析(デバッガ)に焦点を当てていましたが、もちろんプラグインセットを拡張して他のツールと統合することも可能です。
- [Tetrane](https://www.tetrane.com/) による **REVEN** Timeless Analysis and Debugging Platform との統合:
- http://blog.tetrane.com/2015/02/reven-in-your-toolkit.html
- https://twitter.com/tetrane/status/1374768014193799175
- Assaf Carlsbad([@assaf_carlsbad](https://twitter.com/assaf_carlsbad))による **EFI DXE Emulator** との統合:
- https://twitter.com/assaf_carlsbad/status/1242114356881641474
- https://github.com/assafcarlsbad/efi_dxe_emulator
その他のリソース:
- Jean-Christophe Delaunay による「*Combining static and dynamic binary analysis - ret-sync*」
- https://www.synacktiv.com/ressources/bieresecu1_ret-sync_en.pdf
# TODO
- もちろん。
# 既知のバグ/制限事項
- 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' コマンドを使用した場合、stop イベントが呼び出されないようです。
- マルチスレッドデバッグではシグナルに問題があります。
WinDbg の場合:
- IDA のクライアントプラグインは、遭遇したブレークポイントが継続させるコマンド文字列(`g`)を使用している場合でも通知を受け取ります。これらのイベントが多すぎると、大幅な速度低下を引き起こす可能性があります。限定的な修正が実装されていますが、最善の解決策は一時的に同期をオフにすることです。
- レースコンディションの可能性
Ghidra の場合:
- 逆コンパイラウィジェットでショートカットが期待通りに動作しません。
IDA の場合:
- 大きなグラフの場合、グラフウィンドウの再描画が非常に遅いです。
- **ret-sync** のショートカットが Linux 環境で競合します。
競合:
- Logitech Updater ソフトウェアが同じデフォルトポート (9100) を使用することが知られています。解決策は、グローバルな `.sync` 設定ファイルを使用して別のポートを定義することです。```
[INTERFACE]
host=127.0.0.1
port=9234
ret-sync はフリーソフトウェアです。あなたはこれを、フリーソフトウェア財団によって発行されたGNU General Public License(バージョン3、または(あなたの選択により)それ以降のバージョン)の条件の下で再頒布および/または改変することができます。
このプログラムは有用であることを期待して配布されていますが、いかなる保証もありません。暗黙の商品性保証や特定目的への適合性の保証も含めて、一切の保証はありません。詳細については、GNU General Public Licenseをご覧ください。
このプログラムと共にGNU General Public Licenseの写しを受け取っているはずです。受け取っていない場合は、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 社に感謝します。最後に、すべてのコントリビューター、そして問題やバグを報告してくださった皆様にも感謝します。