
Quokka: un esportatore binario veloce e accurato
immagine generata da DALL-E
Quokka è un esportatore di binari: dal disassembly di un programma genera un file di export che può essere utilizzato senza il disassembler. Attualmente supporta IDA Pro, Ghidra e Binary Ninja come backend di disassembly.
L'obiettivo principale di Quokka è consentire di manipolare completamente il binario senza mai aprire un disassembler dopo l'esportazione iniziale. Inoltre, astrae l'API del disassembler per esporre un'interfaccia pulita agli utenti.
Quokka è fortemente ispirato da BinExport, l'esportatore di binari usato da 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)
Il plugin viene compilato nella CI ed è disponibile nel registry.
Dovrebbe essere possibile installarlo direttamente tramite PIP usando un comando di questo tipo:
$ pip install quokka-project
Nota: il plugin IDA non è necessario per leggere un file generato da Quokka. Viene
utilizzato solo per generarli.
Quokka è compatibile con IDA 9.1+.
Quokka è pubblicato nel repository dei plugin Hex-Rays e può essere installato con
hcli:
user@host:~$ hcli plugin install quokka
Il plugin viene anche compilato nella CI ed è disponibile nella scheda Releases.
Per scaricare il plugin, prendi il file chiamato quokka_plugin.so (o l'archivio
quokka-ida<version>.zip per la tua versione di IDA) e copialo nella tua
directory plugins di IDA.
Quokka supporta anche l'esportazione da Ghidra (>= 12.0.3) tramite
un'estensione dedicata. Produce gli stessi file protobuf .quokka che la
libreria Python può caricare.
Per istruzioni di build, installazione e dettagli d'uso vedi il README dell'estensione Ghidra.
Quokka supporta anche l'esportazione da Binary Ninja tramite un plugin Python.
Produce gli stessi file protobuf .quokka che la libreria Python può caricare.
Per istruzioni di installazione e dettagli d'uso vedi il README dell'estensione BinaryNinja.
Il primo metodo manuale per esportare un binario è usare il plugin all'interno di IDA Pro.
La scorciatoia predefinita in IDA è Alt+A. Apre la seguente finestra di dialogo:

Le modalità disponibili sono:
Nota: la modalità FULL non è ancora implementata. Solo la modalità LIGHT è attualmente funzionante.
Nota: questo richiede un'installazione IDA funzionante.
$ idat -OQuokkaAuto:true -OQuokkaDecompiled:true -A /path/to/hello.i64
Tutte le opzioni disponibili sono descritte nella pagina Usage.
Nota: idat viene usato al posto di ida per aumentare la velocità di esportazione, poiché
l'interfaccia grafica non è necessaria.
$ 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
Vedi il README dell'estensione Ghidra per maggiori dettagli.
Nota: l'uso headless dell'API Binary Ninja richiede una licenza commerciale. In assenza di una, usa invece il comando di esportazione all'interno dell'interfaccia di Binary Ninja.
$ python binaryninja_extension/export_headless.py /path/to/binary \
-o /path/to/output.quokka --mode LIGHT
Vedi il README dell'estensione BinaryNinja per maggiori dettagli.
Quokka fornisce uno strumento CLI per esportare automaticamente uno o più file e/o directory (tutti i file eseguibili in ciascuna directory) in parallelo. Supporta sia i backend IDA Pro che 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
Per impostazione predefinita, il file .quokka viene posizionato accanto al binario di input
(ad es. /usr/bin/ls produce /usr/bin/ls.quokka). Usa -o per sovrascrivere questo
comportamento con un percorso letterale o un template espanso per ogni file
(%f = stem, %F = nome file, %p = directory padre, %P = percorso completo,
%e = estensione, %% = % letterale).
Esegui quokka-cli --help per tutte le opzioni. I flag principali includono:
-b, --backend per scegliere il backend del disassembler (ida, ghidra o auto)-i, --ida-path per fornire il percorso della directory di installazione di IDA (la cartella che contiene idat)--ghidra-path per fornire la directory di installazione di Ghidra (sovrascrive GHIDRA_INSTALL_DIR)-o, --output per impostare il percorso di output o il template (predefinito: %F.quokka)-m, --mode per scegliere la modalità di esportazione (light o full)--decompiled per abilitare l'esportazione del codice decompilato (solo IDA)-v, --verbose per abilitare il logging verboseimport 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 };")