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.4k3076 месяцев назадПроверено 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
  • Расширение
  • TODO
  • Известные ошибки/ограничения
  • Лицензия
  • Благодарности

Содержимое репозитория

Плагины отладчиков:

  • 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: Build Status

Выберите последнюю сборку и проверьте артефакты в разделе 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).

## 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"] ] }

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+. Для старых версий переключитесь на проект до тега ida9.2 из доступных Tags.

Установка расширения 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 Public.

  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. Это извлечет папку retsync из архива в $GHIDRA_DIR/Extensions/Ghidra/
  2. Перезапустите Ghidra, как будет предложено
  3. После перезагрузки Ghidra откройте модуль в CodeBrowser. Должно появиться сообщение о том, что обнаружен новый плагин расширения. Выберите "Да", чтобы настроить его. Затем отметьте "RetSyncPlugin" и нажмите OK. В консоли должно отобразиться что-то вроде:``` [*] retsync init [>] programOpened: tm.sys imageBase: 0x1c0000000
root@kitploit:~
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'

Расширение WinDbg

Сборка расширения WinDbg

Используйте решение Visual Studio 2017, предоставленное в ext_windbg. 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 требуется префикс `!` (например: `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 простым перетаскиванием:

![](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 (за исключением команды "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

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

Примечание: вызов этой команды без аргумента сбрасывает комментарий функции.

  • !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

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 (например, модуль был обновлен). При вызове без аргумента используется GUID PDB из Debug Directory. Альтернативно можно использовать md5, но только с локальным отлаживаемым объектом (не при удаленной отладке ядра).
  • !bpcmds <||save|load|>: Обертка bpcmds, сохранение и перезагрузка вывода .bpcmds (список команд точек останова) в текущую IDB. Отображает (но не выполняет) сохраненные данные при вызове без аргументов. Постоянное хранение осуществляется с помощью функции netnode IDA.
  • !ks: Расширенный вывод команды kv с разметкой языка отладчика (DML). Адреса кода являются кликабельными (!jmpto), а также адреса данных (dc).
  • !translate <база> <адрес> <мод>: Предназначена для использования из IDA (горячая клавиша Alt-F2), перебазирует адрес с учетом имени его модуля и смещения.

Необязательный аргумент адреса

Команды !cmt, !rcmt и !fcmt поддерживают необязательный параметр адреса: -a или --address. Адрес должен быть передан в виде шестнадцатеричного значения. Разбор команд основан на модуле argparse Python. Для остановки разбора строки используйте --.``` [WinDbg] 0:000:x86> !cmt -a 0x430DB2 comment

root@kitploit:~
Адрес должен быть действительным адресом инструкции.

## 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

Используйте команды, без префикса "!"``` (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 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).

Использование библиотеки 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:~
# 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. Наконец, спасибо также всем участникам и всем, кто сообщал о проблемах/ошибках.

Скачать инструмент