
Quokka: быстрый и точный экспортёр бинарных файлов
изображение создано DALL-E
Quokka — это экспортер бинарных файлов: на основе дизассемблирования программы он создает экспортный файл, который можно использовать без дизассемблера. В настоящее время в качестве бэкендов дизассемблирования поддерживаются IDA Pro, Ghidra и Binary Ninja.
Основная цель Quokka — позволить полностью манипулировать бинарным файлом, ни разу не открывая дизассемблер после первоначального экспорта. Кроме того, он абстрагирует API дизассемблера, предоставляя пользователям чистый интерфейс.
Quokka во многом вдохновлен BinExport, экспортером бинарных файлов, используемым в BinDiff.
IDA Pro Ghidra Binary Ninja
│ │ │
IDA Plugin (C++) Ghidra Plugin (Java) BinaryNinja Plugin (Python)
│ │ │
└────────────── quokka.proto ─────────────────┘
(protobuf schema)
│
.quokka files
│
Python bindings (quokka.Program)
├── Capstone backend (primary)
└── Pypcode backend (optional)
Плагин собирается в CI и доступен в реестре.
Его можно установить напрямую через PIP с помощью такой команды:
$ pip install quokka-project
Примечание: плагин IDA не требуется для чтения файла, созданного Quokka. Он используется только для их генерации.
Quokka совместим с IDA 9.1+.
Quokka опубликован в репозитории плагинов Hex-Rays и может быть установлен с помощью hcli:
user@host:~$ hcli plugin install quokka
Плагин также собирается в CI и доступен на вкладке Releases.
Чтобы загрузить плагин, возьмите файл с именем quokka_plugin.so (или архив quokka-ida<version>.zip для вашей версии IDA) и скопируйте его в каталог plugins вашей IDA.
Quokka также поддерживает экспорт из Ghidra (>= 12.0.3) с помощью специального расширения. Оно создает те же .quokka protobuf-файлы, которые может загружать библиотека Python.
Инструкции по сборке, установке и использованию см. в README расширения Ghidra.
Quokka также поддерживает экспорт из Binary Ninja с помощью Python-плагина. Он создает те же .quokka protobuf-файлы, которые может загружать библиотека Python.
Сведения об установке и использовании см. в README расширения BinaryNinja.
Первый ручной способ экспорта бинарного файла — использовать плагин внутри IDA Pro. Сочетание клавиш по умолчанию в IDA — Alt+A. Открывается следующий диалог:

Доступны следующие режимы:
Примечание: режим FULL еще не реализован. В настоящее время работает только режим LIGHT.
Примечание: для этого требуется рабочая установка IDA.
$ idat -OQuokkaAuto:true -OQuokkaDecompiled:true -A /path/to/hello.i64
Все доступные параметры описаны в разделе Использование.
Примечание: вместо ida используется idat, чтобы увеличить скорость экспорта, поскольку графический интерфейс не нужен.
$ analyzeHeadless /tmp/proj Test \
-import /path/to/binary \
-scriptPath ghidra_extension/src/script/ghidra_scripts \
-postScript QuokkaExportHeadless.java \
--out=/path/to/output.quokka --mode=LIGHT
Более подробную информацию см. в README расширения Ghidra.
Примечание: использование API Binary Ninja в headless-режиме требует коммерческой лицензии. При ее отсутствии используйте команду экспорта в интерфейсе Binary Ninja.
$ python binaryninja_extension/export_headless.py /path/to/binary \
-o /path/to/output.quokka --mode LIGHT
Более подробную информацию см. в README расширения BinaryNinja.
Quokka предоставляет утилиту командной строки для автоматического параллельного экспорта одного или нескольких файлов и/или каталогов (все исполняемые файлы в каждом каталоге). Поддерживаются бэкенды IDA Pro и Ghidra:
$ quokka-cli --backend ghidra -t 8 dir/
$ quokka-cli --backend ida --ida-path /opt/ida -t 8 dir/
$ quokka-cli -t 8 dir/ # auto-detect backend
$ quokka-cli -o "%p/exports/%f.quokka" binary # custom output directory
$ quokka-cli -b ida -o %F_ida.quokka -t 4 dir/ # Using relative path
$ quokka-cli -t 8 dir1/ dir2/ binary1 binary2 # multiple inputs
По умолчанию файл .quokka размещается рядом с исходным бинарным файлом (например, /usr/bin/ls создает /usr/bin/ls.quokka). Используйте -o, чтобы переопределить это значение с помощью прямого пути или шаблона, разворачиваемого для каждого файла (%f = имя без расширения, %F = имя файла, %p = родительский каталог, %P = полный путь, %e = расширение, %% = литеральный символ %).
Выполните quokka-cli --help, чтобы увидеть все параметры. Основные флаги:
-b, --backend — выбор бэкенда дизассемблера (ida, ghidra или auto);-i, --ida-path — путь к каталогу установки IDA (папка, содержащая idat);--ghidra-path — путь к каталогу установки Ghidra (переопределяет GHIDRA_INSTALL_DIR);-o, --output — путь вывода или шаблон (по умолчанию: %F.quokka);-m, --mode — выбор режима экспорта (light или full);--decompiled — включить экспорт декомпилированного кода (только IDA);-v, --verbose — включить подробное журналирование.import quokka
from quokka.types import Disassembler
# Directly from the binary (auto-detects available backend)
prog = quokka.Program.from_binary("/bin/ls")
# Explicitly choose a backend
prog = quokka.Program.from_binary("/bin/ls", disassembler=Disassembler.GHIDRA)
prog = quokka.Program.from_binary("/bin/ls", disassembler=Disassembler.IDA)
# From the exported file
prog = quokka.Program("ls.quokka", # the exported file
"/bin/ls") # the original binary
# Add new types from C declarations
prog.add_type("struct context { int id; char name[64]; };")
prog.add_type("enum status { OK=0, ERROR=1 };")
# Save the .quokka file
prog.write()
# Or apply changes (including new types) back to the IDA database
prog.commit(database_file="ls.i64", overwrite=True)
Полную документацию по редактированию см. в разделе о переименовании функций, задании прототипов и других возможностях.
Процесс сборки зависит от версии IDA SDK, которую вы используете. Эти два режима также называются новый режим и старый режим.
IDA SDK наконец-то стал открытым, поэтому больше нет необходимости загружать его отдельно.
Вы можете использовать параметр cmake -DIDA_VERSION=<major>.<minor>, чтобы автоматически синхронизировать его с GitHub.
user@host:~/quokka$ cmake -B build \ # Where to build
-S . \ # Where are the sources
-DIDA_VERSION=9.2 \ # IDA SDK version
-DCMAKE_BUILD_TYPE:STRING=Release \ # Build Type
user@host:~/quokka$ cmake --build build -- -j
Поскольку IDA SDK по-прежнему является проприетарным кодом, вам придется загрузить его самостоятельно и указать путь к нему в cmake через параметр -DIdaSdk_ROOT_DIR:STRING=path/to/sdk.
ПРИМЕЧАНИЕ: это также будет работать в новых версиях, но требует от пользователей дополнительных действий, поскольку им придется загружать SDK самостоятельно.
user@host:~/quokka$ cmake -B build \ # Where to build
-S . \ # Where are the sources
-DIdaSdk_ROOT_DIR:STRING=path/to/ida_sdk \ # Path to IDA SDK
-DCMAKE_BUILD_TYPE:STRING=Release \ # Build Type
user@host:~/quokka$ cmake --build build --target quokka_plugin -- -j
Чтобы установить плагин:
user@host:~/quokka$ cmake --install build
В любом случае плагин также будет находиться в build/quokka-install. Вы можете скопировать его в пользовательский каталог плагинов IDA.
user@host:~/quokka$ cp build/quokka-install/quokka_plugin.so $HOME/.idapro/plugins/
Более подробную информацию о сборке см. в разделе Сборка.
Документация доступна онлайн: документация.
Список вопросов можно посмотреть здесь: FAQ.
Примечание: В настоящее время реализован только режим LIGHT. Режим FULL (автономный) запланирован, но пока не работает.
Quokka предлагает два режима экспорта результатов дизассемблирования: облегченный режим и автономный режим.
Облегченный режим ориентирован на экспорт только самой необходимой информации, создавая быстрые и легкие файлы. В этом режиме не экспортируется информация на уровне инструкций и ниже, поэтому для получения дизассемблирования инструкций во время выполнения используется движок Capstone.
Автономный режим, напротив, экспортирует полное дизассемблирование в том виде, в котором его показывает бэкенд-дизассемблер. Это приводит к созданию более тяжелых файлов, но не требует зависимости от сторонних дизассемблеров во время выполнения.
Важно отметить, что оба режима предоставляют одинаковый API в привязках Python.
[!WARNING] В автономном режиме по-прежнему можно получить объект инструкции Capstone, но имейте в виду, что дизассемблирование Capstone может отличаться от того, что экспортирует quokka (инструкции могут быть разделены, объединены, не поддерживаться, иметь другие мнемоники и т.д.). В целом разные платформы анализа бинарных файлов дают разное дизассемблирование — учитывайте это при смешивании Capstone с автономным режимом.
Полный обзор различий между двумя режимами приведен в таблице ниже:
| Облегченный режим | Автономный режим | |
|---|---|---|
| Функции | ✅ | ✅ |
| Базовые блоки | ✅ | ✅ |
| Инструкции | ❌ | ✅ |
| Операнды | ❌ | ✅ |
| Ссылки на данные | ✅ | ✅ |
| Перекрестные ссылки | ✅ | ✅ |
| Секции/Компоновка | ✅ | ✅ |
| Декомпиляция | ✅¹ | ✅¹ |
| Координаты отрисовки CFG | ✅¹² | ✅¹² |
¹ Включается по желанию
² В настоящее время не поддерживается