
Плагин для внедрения интерактивных символов в ваш отладчик из вашего декомпилятора.
Реверс-инжиниринг включает как статический (дизассемблер), так и динамический (отладчик) анализ, однако мы часто используем эти виды анализа без обмена знаниями между ними. В случае реверса статических бинарных файлов переключение контекста между ассемблером отладчика и символами, восстановленными в декомпиляторе, может быть неэффективным.
decomp2dbg стремится сократить разрыв переключения контекста между декомпилятором и отладчиком, представляя универсальный API для синхронизации символов из декомпилятора в отладчик. По сути, давая реверс-инженеру возможности его отладчика с символами и строками декомпиляции, которые он восстанавливает в декомпиляторе.

Интересуетесь, как decomp2dbg выглядит на практике? Посмотрите записанный доклад на CactusCon 2023, где демонстрируется отладка удаленного arm32 бинарного файла с x64 машины с использованием символов Ghidra.
Для активной помощи присоединяйтесь к Discord BinSync ниже, где мы отвечаем на вопросы по decomp2dbg:
Установка через pip, затем использование встроенного установщика для декомпиляторов:
pip3 install decomp2dbg && decomp2dbg --install
Это откроет подсказку, где вас попросят ввести путь к вашему декомпилятору и отладчику по выбору.
Для Ghidra вам нужно запустить в режиме PyGhidra и включить плагин (d2d_client.py), как показано здесь.
Если вы установили декомпиляторную часть через Binja Plugin Manager, вам все равно нужно установить отладчикную часть с помощью вышеуказанного.
Примечание: вы должны установить decomp2dbg в то же окружение Python, что и ваш декомпилятор и отладчик.
Примечание: Возможно, потребуется разрешить входящие соединения на порт 3662 (или используемый вами порт), чтобы decomp2dbg мог подключиться к декомпилятору. Если вы устанавливаете decomp2dbg с GEF или pwndbg, важно, чтобы в вашем ~/.gdbinit файл d2d.py был подключен после GEF или pwndbg.
Пропустите это, если вам удалось использовать вышеуказанную установку без ошибок. Если вы не можете использовать вышеуказанный встроенный скрипт (установка для декомпилятора на Windows без WSL), следуйте шагам ниже:
Если вам нужна только декомпиляторная часть, скопируйте соответствующий плагин декомпилятора в папку плагинов декомпилятора. Вот как это сделать в IDA:
Сначала клонируйте репозиторий:
git clone https://github.com/mahaloz/decomp2dbg.git
Установка:
pip install .
Скопируйте файл сервера:
cp ./decomp2dbg/d2d_server.py /path/to/ida/plugins/
Если вам также нужно установить часть для gdb, используйте строку ниже:
cp ./decomp2dbg/d2d_client.py ~/.d2d.py && echo "source ~/.d2d.py" >> ~/.gdbinit
Сначала запустите сервер декомпиляции в вашем декомпиляторе. Возможно, вы захотите подождать, пока ваш декомпилятор завершит обычный анализ, прежде чем запускать его. После обычного анализа это можно сделать с помощью горячей клавиши Ctrl-Shift-D или выбрав вкладку decomp2dbg: configure в соответствующей вкладке плагинов. После запуска сервера вы должны увидеть сообщение в вашем декомпиляторе:
[+] Starting XMLRPC server: localhost:3662
[+] Registered decompilation server!
Затем в вашем отладчике выполните:
decompiler connect <decompiler_name>
Если вы запускаете декомпилятор на виртуальной машине или другом компьютере, вы можете дополнительно указать хост и порт для подключения. Вот пример:
decompiler connect ida --host 10.211.55.2 --port 3662
Вы можете узнать, как использовать все команды, запустив команду декомпилятора с флагом --help.
Первое подключение может занять до 30 секунд для регистрации в зависимости от количества глобальных переменных в бинарном файле. Если всё в порядке, вы должны увидеть:
[+] Connected to decompiler!
Если вы используете decomp2dbg для библиотеки, то есть основной бинарный файл, к которому подключился ваш отладчик, не является бинарным файлом, для которого вы хотите получить исходный код, тогда вам следует взглянуть на раздел Расширенное использование - Общие библиотеки readme.
При каждом событии точки останова вы теперь будете видеть декомпиляцию, а также строку, на которой вы находитесь, связанную с адресом останова.
Функции и глобальные переменные из вашей декомпиляции теперь отображаются в вашем GDB как обычные символы уровня исходного кода. Это означает, что обычные команды GDB, такие как печать и просмотр, работают нативно:
b sub_46340
x/10i sub_46340
p dword_267A2C
x dword_267A2C
Некоторые переменные, хранящиеся локально в функции, являются стековыми переменными. Для переменных, которые можно отобразить в стек или регистры, мы импортируем их как удобные переменные. Вы можете просмотреть их содержимое как обычную удобную переменную GDB:
p $v4
Стековые переменные всегда будут хранить свой адрес в стеке. Чтобы увидеть, какое значение на самом деле находится в этой стековой переменной, просто разыменуйте переменную:
x $v4
Это также работает с аргументами функций, если применимо (результат может отличаться):
p $a1
Примечание: $v4 в этом случае будет отображаться только до тех пор, пока вы находитесь в той же функции. Как только вы покинете функцию, она может быть отменена или переназначена на другое значение.
Когда вы хотите отобразить декомпиляцию (и символы) для участка памяти, который не является основным бинарным файлом, например при отладке общей библиотеки, вам нужно выполнить несколько дополнительных шагов. В настоящее время d2d поддерживает только одно подключение декомпилятора за раз, это означает, что если у вас в данный момент подключен какой-либо декомпилятор, не относящийся к библиотеке, вам нужно отключить его.
После выполнения обычной настройки, чтобы ваш декомпилятор запускал сервер d2d для вашей общей библиотеки, вам нужно вручную указать базовый адрес этой библиотеки и её конечный адрес:
decompiler connect ida --base-addr-start 0x00007ffff7452000 --base-addr-end 0x00007ffff766d000
Чтобы узнать базовый адрес, по которому ваша библиотека загружена в память, рекомендуется использовать что-то вроде команды vmmap из GEF для поиска имени библиотеки в пространстве памяти. После подключения с этим вручную заданным адресом символы будут работать как в обычном d2d. Декомпиляция будет выводиться на экран только тогда, когда вы находитесь в диапазоне этого адресного пространства.