Kit de ferramentas de engenharia reversa: desassemblador, descompilador SSA, recuperação de classes C++ e análise de processos em execução para PE e ELF. CLI programável, cada resposta em JSON. Código-fonte disponível (PolyForm Noncommercial).
Um toolkit de engenharia reversa: disassembler, decompilador SSA, recuperação de classes C++ e análise de processos em execução para PE e ELF. Arquivos estáticos e processos em execução passam por um único pipeline, e toda resposta é JSON sobre o qual um script pode agir.
Três front ends compartilham esse núcleo: a CLI, onde um comando responde com um único objeto JSON (uma sessão serve com um envelope de prontidão, depois um por requisição); uma GUI desktop em seu próprio repositório, n0xis-gui; e um servidor MCP, n0xis-mcp — 27 ferramentas retornando o mesmo envelope via JSON-RPC sobre stdio.

Uma execução real de examples/config-demo: um programa mantém suas configurações criptografadas e as descriptografa na memória; encontre o texto simples, arme um watchpoint de hardware sobre ele e obtenha o código decompilado que o escreveu. Execute novamente você mesmo com demo.sh.
$ n0xis provenance trace --pid 181529 --addr 0x564e32cb7060 --kind write
"instruction_va": "0x564e32cb4266", // the byte store that wrote the watched address
"function_va": "0x564e32cb4230", // the function it sits in, on this build (see below)
"decompiled_context": [
"rcx.3 = (uint32_t)((uint32_t)(uint32_t)*(uint8_t*)((rsi.1 + v2)) ^ (uint32_t)v1);",
"*(uint8_t*)((rdi.1 + v2)) = (uint8_t)rcx.3;", // ← the write
"rcx.4 = (uint32_t)(v1 + (v1 * 0x2));",
"v2 = (v2 + 0x1);",
"v1 = (uint32_t)((v1 + (rcx.4 * 0x4)) + 0x7);"
]
No código-fonte isso é config[i] = sealed[i] ^ key; key = key * 13 + 7;: as duas instruções
rcx.4 = v1 + v1 * 2 e v1 = v1 + rcx.4 * 4 + 7 juntas equivalem a v1 * 13 + 7. A resposta fornece
endereços, não os nomes config e decrypt_config: nomes provenientes dos símbolos do binário ainda não são
transportados para ela. Esta compilação é gcc -O2, onde function_va é o início da função; em compilações
clang -O2 e gcc -O1 do mesmo código-fonte, é o cabeçalho do loop, respondido com ok:true sem nota.
Esta execução é no Linux; a última execução no Windows de provenance trace está no ledger.
yes: todas as verificações concordaram · partial: utilizável, com as lacunas abaixo · wrong: ok:true com resultados
incorretos em entradas medidas · refused: um erro tipado · not yet: nenhum caminho de código. Medido em outubro
de 2026 em programas compilados a partir de código-fonte conhecido, em comparação com o processador e ferramentas independentes.
| Formato | Arquivo estático | Processo em execução |
|---|---|---|
| PE32+, PE32 (x86-64, x86, ARM64) | partial: as lacunas e respostas incorretas abaixo | Windows: não medido para esta tabela |
| ELF64, ELF32 (x86-64, x86, AArch64, ARMv7) | partial: as lacunas e respostas incorretas abaixo; big-endian: decompile e RTTI refused | Linux x86-64: partial: as entradas ao vivo abaixo; outras ISAs não medidas |
| Mach-O, thin e universal | refused (load-failed) | not yet |
| WebAssembly | partial: a lista de funções, a desmontagem, chamadas de e para uma função, imports, exports, profile e strings (com o lugar de cada string na memória linear) concordaram com wasm-objdump em todos os módulos medidos; decompile, IR e os demais comandos que precisam do lift refused (not-lifted: o lift é o estágio 3) | not yet |
Bytes brutos (--bytes) | disassemble, referências cruzadas, strings com um intervalo; discover e decompile partial; profile e rtti scan refused | — |
| ISA | Disassemble | Discover functions | Decompile |
|---|---|---|---|
| x86-64 | yes | yes com tabelas de unwind; partial sem elas | partial |
| x86 (i386) | yes | partial: mesmo com .eh_frame, o padding do GCC e .plt listados como funções, pontos em nomes reescritos, um fim ausente | partial |
| AArch64, little- e big-endian | yes | little-endian yes com .eh_frame; big-endian partial: perde funções que .eh_frame declara; partial sem ele; em PE --pdata está wrong | partial; big-endian refused |
| ARMv7 A32 | partial: sem NEON, dados no código decodificados como código | partial | wrong: tabelas de salto, tail calls |
ARMv7 Thumb-2 (--arch thumb) | wrong: alvos de desvio, condições IT | partial: sem nomes ou fins | wrong: um retorno predicado por IT encerra a função |
| WebAssembly | yes; o alvo de um desvio é uma profundidade de rótulo, não fornecida até o estágio 3 | yes: cada corpo, sua extensão, índice e nome | refused (estágio 3) |
ok:true: RTTI do Itanium num PE MinGW (reportado como ausente), --pdata em ARM64 PE, nomes longos de seção MinGW em profile (/4), a lista de exportação de um objeto compartilhado ELF e os nomes .localalias que ele atribui às funções desse objeto, o preenchimento i386 do GCC e o bloco .plt listados como funções, pontos em nomes de símbolos impressos como sublinhados (__x86_get_pc_thunk_bx para __x86.get_pc_thunk.bx), e a descoberta em AArch64 big-endian perdendo funções que seu .eh_frame declara.
O descompilador descarta argumentos repassados, imprime deslocamentos aritméticos como não assinados e multiplicações de 64 bits como de 32 bits, pode fazer switch sobre ou ler um registrador que nunca atribui, em AArch64 pode nomear a string errada, em A32 (e na mesma forma em AArch64) executa um laço de contagem regressiva uma iteração a menos, e em x86 de 32 bits perde argumentos de pilha e a metade alta de resultados de 64 bits. Seu campo quality não é uma pontuação de correção. A lista completa, com contagens, está no ledger.ok com menos: sem tabelas de unwind, funções alcançadas apenas por vtables, o ponto de entrada da ABI MSVC e a maior parte de um objeto compartilhado ELF; referências mantidas em imediatos absolutos, adrp+add ou adr em AArch64, ou a GOT do i386; vtables secundárias do Itanium, e toda classe Itanium de uma imagem stripped; nomes que apenas a tabela de símbolos COFF contém. Um PDB ao lado de um PE x64 forneceu cada início, nome e fim nas duas imagens lld-link medidas (35 de 35, 18 de 18).provenance trace imprime um endereço escrito como literal de string quando os bytes ali por acaso são imprimíveis, e em algumas builds nomeia o início do laço como a função (acima); a varredura por padrão de bytes (scan aob) precisa de --start/--size para passar por uma região ilegível; scan dissect adivinha tipos de campo; comandos exclusivos do Windows recusam em outros lugares.Binários pré-compilados para Linux e Windows, o servidor MCP e sha256sums.txt: última release.
curl -LO https://github.com/Structio-labs/N0xis/releases/latest/download/n0xis-linux-x86_64
curl -LO https://github.com/Structio-labs/N0xis/releases/latest/download/sha256sums.txt
sha256sum -c --ignore-missing sha256sums.txt
chmod +x n0xis-linux-x86_64 && mv n0xis-linux-x86_64 n0xis && ./n0xis --version
Ou compile-o com Rust estável, no Linux ou Windows: cargo build --workspace --release. O rust-toolchain.toml
fixa apenas o canal e indica como compilar no Windows sem as MSVC Build Tools.