
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 является форком qb-sync, который я разрабатывал и поддерживал во время работы в Quarkslab.
Плагины отладчиков:
ext_windbg/sync: исходные файлы расширения WinDbg, после сборки: sync.dllext_gdb/sync.py: плагин GDBext_lldb/sync.py: плагин LLDBext_olly1: плагин OllyDbg 1.10ext_olly2: плагин OllyDbg v2ext_x64dbg: плагин x64dbgПлагины дизассемблеров:
ext_ida/SyncPlugin.pyext_ghidra/dist/ghidra_*_retsync.zip: плагин Ghidraext_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).
## 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 content extract:```
[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+. Для старых версий переключитесь на проект до тега ida9.2 из доступных Tags.
Для установки 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 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. Это извлечет папку retsync из архива в $GHIDRA_DIR/Extensions/Ghidra/4. В инструменте CodeBrowser Ghidra: используйте значки панели инструментов или сочетания клавиш для включения (``Alt+s``)/отключения (``Alt+Shift+s``)/перезапуска (``Alt+r``) синхронизации.
Окно состояния также доступно через ``Windows`` -> ``RetSyncPlugin``. Обычно его стоит разместить сбоку, чтобы интегрировать с окнами среды Ghidra.
## Binary Ninja extension
Поддержка Binary Ninja является экспериментальной, обязательно создавайте резервные копии ваших баз данных анализа.
### Binary Ninja prerequisites
**ret-sync** требует Binary Ninja версии не ниже 2.2, а также Python 3 (Python 2 не поддерживается).
### Install the Binary Ninja extension
**ret-sync** пока не распространяется через менеджер плагинов Binary Ninja; требуется ручная установка. Просто скопируйте содержимое папки `ext_bn` в папку плагинов Binary Ninja, например:
`%APPDATA%\Binary Ninja\plugins`
После перезапуска Binary Ninja в окне консоли должно появиться следующее сообщение:```
[sync] commands added
Loaded python3 plugin 'retsync'
Используйте решение Visual Studio 2017, предоставленное в ext_windbg. 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 требуется префикс `!` (например: `sync` в GDB, `!sync` в WinDbg).
| Команда отладчика | Описание |
|----------------------------|-------------------------------------------------------------------------------------------|
| `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 <module name>` | Установить указанный модуль в качестве активного IDB (см. расширенную версию `modlist` от `lm`) |
| `modmap <base> <size> <name>` | Синтетический ("фиктивный") модуль (определенный по базовому адресу и размеру) добавляется во внутренний список отладчика |
| `modunmap <base>` | Удалить ранее сопоставленный синтетический модуль по базовому адресу |
| `modcheck <\|\|md5>` | Используется для проверки, действительно ли текущий модуль соответствует файлу IDB (например, модуль был обновлен) |
| `bpcmds <\|\|save\|load\|>` | Обертка **bpcmds**, сохранение и перезагрузка вывода **.bpcmds** (список команд точек останова) в текущий IDB |
| `ks` | Расширенный вывод команды **kv** на языке разметки отладчика (DML) |
Специфичные команды GDB:
| Команда отладчика | Описание |
|----------------------------|-------------------------------------------------------------------------------------------|
|`bbt` | Красивый обратный трейс. Аналогичен **bt** в GDB, но запрашивает символы у дизассемблера |
| `patch` | Пропатчить байты в дизассемблере на основе живого контекста |
| `bx` | Аналогично GDB **x**, но с использованием символа. Символ будет разрешен дизассемблером |
| `cc` | Продолжить до курсора в дизассемблере |
## Использование в IDA
### Графический интерфейс плагина IDA
Поле ввода ``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
После открытия 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`` - Продолжить
* ``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>**: Добавить комментарий по текущему ip в 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]: Сбросить комментарий по текущему ip в IDA``` [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 адрес] <строка>: Добавить имя метки по текущему 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.
Адрес должен быть передан в виде шестнадцатеричного значения. Разбор команд основан на модуле argparse Python. Для остановки разбора строки используйте --.```
[WinDbg]
0:000:x86> !cmt -a 0x430DB2 comment
Адрес должен быть действительным адресом инструкции.
## GNU gdb (GDB) usage
Синхронизация с хостом:```
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 usage
1. Используйте меню плагинов или сочетания клавиш для включения (``Alt+s``)/отключения (``Alt+u``) синхронизации.
## OllyDbg2 usage
1. Используйте меню плагинов или сочетания клавиш для включения (``Ctrl+s``)/отключения (``Ctrl+u``) синхронизации.
Из-за бета-статуса API OllyDbg2 реализованы только следующие функции:
- Синхронизация графа [используйте ``F7``; ``F8`` для пошагового выполнения]
- Комментарий [используйте ``CTRL+;``]
- Метка [используйте ``CTRL+:``]
## x64dbg usage
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.
Примечание: использование команды !translate из дизассемблера (IDA/Ghidra,
сочетание клавиш Alt-F2) приведет к тому, что окно дизассемблера «перепрыгнет» на
конкретный адрес (аналог выполнения disasm в командной строке x64dbg).
Возможно, вы захотите использовать основные возможности 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()
# Extend
Хотя изначально проект был сосредоточен на динамическом анализе (отладчиках), конечно же, можно расширить набор плагинов и интегрироваться с другими инструментами.
- Интеграция с платформой **REVEN** Timeless Analysis and Debugging от компании [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
Другие ресурсы:
- "*Combining static and dynamic binary analysis - ret-sync*" от Jean-Christophe Delaunay
- 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'.
- отладка многопоточности имеет проблемы с сигналами.
С WinDbg:
- Плагин-клиент IDA получает уведомление, даже если встреченная точка останова использует строку команды, которая заставляет её продолжить ('``g``'). Это может вызвать значительное замедление, если таких событий слишком много. Было реализовано ограниченное исправление, но лучшее решение — временно отключить синхронизацию.
- Возможное состояние гонки
С Ghidra:
- Горячие клавиши работают не так, как ожидается, в виджете декомпилятора.
С IDA:
- Перерисовка окна графа довольно медленная для больших графов.
- Конфликты горячих клавиш **ret-sync** в средах Linux.
Конфликты:
- Известно, что программное обеспечение Logitech Updater использует тот же порт по умолчанию (9100). Решение — использовать глобальный конфигурационный файл `.sync` для указания другого порта.```
[INTERFACE]
host=127.0.0.1
port=9234
ret-sync является свободным программным обеспечением: вы можете распространять и/или изменять его в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной Фондом свободного программного обеспечения, либо версии 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. Наконец, спасибо также всем участникам и всем, кто сообщал о проблемах/ошибках.