
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)
Consulte a documentação de edição completa para detalhes sobre renomear funções, definir protótipos e muito mais.
O processo de compilação depende de qual versão do SDK do IDA você está usando. Esses dois modos também são chamados de novo modo e modo antigo.
O SDK do IDA foi finalmente disponibilizado como código aberto, portanto não há mais necessidade de baixá-lo separadamente.
Você pode usar a opção do cmake -DIDA_VERSION=<major>.<minor> para sincronizá-lo automaticamente do 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
Como o SDK do IDA ainda é um código proprietário, você precisa obtê-lo você mesmo e fornecer
seu caminho ao cmake por meio da opção -DIdaSdk_ROOT_DIR:STRING=path/to/sdk
NOTA: Isso também funcionará em versões mais recentes, mas requer mais etapas dos usuários, pois eles terão que baixar o SDK por conta própria.
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
Para instalar o plugin:
user@host:~/quokka$ cmake --install build
De qualquer forma, o plugin também estará em build/quokka-install. Você pode
copiá-lo para o diretório de plugins do usuário do IDA.
user@host:~/quokka$ cp build/quokka-install/quokka_plugin.so $HOME/.idapro/plugins/
Para informações mais detalhadas sobre compilação, consulte Compilação
A documentação está disponível online em documentação
Você pode ver uma lista de perguntas aqui FAQ
Nota: Apenas o modo LIGHT está implementado atualmente. O modo FULL (autocontido) está planejado, mas ainda não é funcional.
Quokka oferece dois modos para exportar a análise de desmontagem: o modo light e o modo autocontido.
O modo light foca em exportar apenas informações essenciais, produzindo arquivos rápidos e leves. Neste modo, nenhuma informação no nível de instrução ou abaixo é exportada, portanto o motor capstone será usado em tempo de execução para obter a desmontagem das instruções.
O modo autocontido, por outro lado, exporta a desmontagem completa, exatamente como o desmontador backend a mostra. Isso produz arquivos mais pesados, mas não requer dependência de desmontadores de terceiros em tempo de execução.
É importante notar que ambos os modos oferecem a mesma API nos bindings Python.
[!WARNING] A partir do modo autocontido ainda é possível obter o objeto de instrução do capstone, mas atenção: a desmontagem do capstone pode ser diferente da exportada pelo quokka (as instruções podem ser divididas, mescladas, não suportadas, ter mnemônicos diferentes, etc.). Em geral, diferentes plataformas de análise binária produzem desmontagens diferentes; tenha isso em mente ao misturar capstone com o modo autocontido.
Para uma visão geral completa da diferença entre os dois modos, veja a tabela abaixo:
| Modo Light | Modo autocontido | |
|---|---|---|
| Funções | ✅ | ✅ |
| Blocos Básicos | ✅ | ✅ |
| Instruções | ❌ | ✅ |
| Operandos | ❌ | ✅ |
| Referências de Dados | ✅ | ✅ |
| Referências Cruzadas | ✅ | ✅ |
| Seções/Layout | ✅ | ✅ |
| Descompilação | ✅¹ | ✅¹ |
| Coordenadas de desenho do CFG | ✅¹² | ✅¹² |
¹ Habilitado opcionalmente
² Atualmente não suportado