
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)