
Quokka: Um Exportador Binário Rápido e Preciso
imagem gerada por DALL-E
Quokka é um exportador de binários: a partir da desmontagem de um programa, ele gera um arquivo de exportação que pode ser usado sem o desmontador. Atualmente, ele suporta IDA Pro, Ghidra e Binary Ninja como backends de desmontagem.
O principal objetivo do Quokka é permitir manipular completamente o binário sem nunca abrir um desmontador após a exportação inicial. Além disso, ele abstrai a API do desmontador para expor uma interface limpa aos usuários.
Quokka é fortemente inspirado pelo BinExport, o exportador de binários usado pelo 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)
O plugin é construído no CI e está disponível no registro.
Deve ser possível instalar diretamente pelo PIP usando um comando deste tipo:
$ pip install quokka-project
Nota: O plugin do IDA não é necessário para ler um arquivo gerado por Quokka. Ele é
usado apenas para gerá-los.
Quokka é compatível com IDA 9.1+.
Quokka é publicado no repositório de plugins da Hex-Rays e pode ser instalado com
hcli:
user@host:~$ hcli plugin install quokka
O plugin também é construído no CI e está disponível na aba Releases.
Para baixar o plugin, obtenha o arquivo chamado quokka_plugin.so (ou o
arquivo quokka-ida<version>.zip para a sua versão do IDA) e copie-o para o
diretório plugins do seu IDA.
Quokka também suporta exportação a partir do Ghidra (>= 12.0.3) por meio de uma
extensão dedicada. Ela produz os mesmos arquivos protobuf .quokka que a biblioteca
Python pode carregar.
Para instruções de compilação, instalação e detalhes de uso, consulte o README da extensão Ghidra.
Quokka também suporta exportação a partir do Binary Ninja por meio de um plugin Python. Ele
produz os mesmos arquivos protobuf .quokka que a biblioteca Python pode carregar.
Para detalhes de instalação e uso, consulte o README da extensão BinaryNinja.
A primeira forma manual de exportar um binário é usar o plugin dentro do IDA Pro.
O atalho padrão no IDA é Alt+A. Ele abre o seguinte diálogo:

Os modos disponíveis são:
Nota: O modo FULL ainda não foi implementado. Apenas o modo LIGHT é funcional atualmente.
Nota: Isso requer uma instalação funcional do IDA.
$ idat -OQuokkaAuto:true -OQuokkaDecompiled:true -A /path/to/hello.i64
Todas as opções disponíveis estão descritas em Uso.
Nota: idat é usado em vez de ida para aumentar a velocidade de exportação, pois a interface gráfica
não é necessária.
$ 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
Consulte o README da extensão Ghidra para mais detalhes.
Nota: o uso headless da API do Binary Ninja requer uma licença comercial. Sem uma, use o comando de exportação dentro da interface do Binary Ninja.
$ python binaryninja_extension/export_headless.py /path/to/binary \
-o /path/to/output.quokka --mode LIGHT
Consulte o README da extensão BinaryNinja para mais detalhes.
Quokka fornece uma ferramenta utilitária de CLI para exportar automaticamente um ou mais arquivos e/ou diretórios (todos os arquivos executáveis em cada diretório) em paralelo. Ele suporta tanto os backends IDA Pro quanto 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
Por padrão, o arquivo .quokka é colocado ao lado do binário de entrada (por exemplo,
/usr/bin/ls produz /usr/bin/ls.quokka). Use -o para substituir isso por um
caminho literal ou um modelo expandido por arquivo (%f = stem, %F = nome do arquivo,
%p = diretório pai, %P = caminho completo, %e = extensão, %% = % literal).
Execute quokka-cli --help para ver todas as opções. Os principais flags incluem:
-b, --backend para escolher o backend do desmontador (ida, ghidra ou auto)-i, --ida-path para fornecer o caminho do diretório de instalação do IDA (a pasta que contém idat)--ghidra-path para fornecer o diretório de instalação do Ghidra (substitui GHIDRA_INSTALL_DIR)-o, --output para definir o caminho de saída ou modelo (padrão: %F.quokka)-m, --mode para escolher o modo de exportação (light ou full)--decompiled para habilitar a exportação de código decompilado (apenas IDA)-v, --verbose para habilitar o log detalhadoimport 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)