Toolkit di reverse engineering: disassembler, decompilatore SSA, recupero delle classi C++ e analisi di processi live per PE ed ELF. CLI scriptabile, ogni risposta in JSON. Sorgente disponibile (PolyForm Noncommercial).
Un toolkit di reverse engineering: disassembler, decompilatore SSA, recupero delle classi C++ e analisi di processi live per PE ed ELF. I file statici e i processi in esecuzione passano attraverso un'unica pipeline, e ogni risposta è JSON su cui uno script può agire.
Tre front end condividono quel core: la CLI, dove un comando risponde con un singolo oggetto JSON (una sessione serve con un envelope di ready, poi uno per richiesta); una GUI desktop nel proprio repository, n0xis-gui; e un server MCP, n0xis-mcp — 27 strumenti che restituiscono lo stesso envelope via JSON-RPC su stdio.

Un'esecuzione reale di examples/config-demo: un programma mantiene le proprie impostazioni cifrate e le decifra in memoria; trova il plaintext, imposta un watchpoint hardware su di esso e ottieni il codice decompilato che lo ha scritto. Rieseguilo tu stesso con 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);"
]
Nel sorgente questo è config[i] = sealed[i] ^ key; key = key * 13 + 7;: le due istruzioni
rcx.4 = v1 + v1 * 2 e v1 = v1 + rcx.4 * 4 + 7 insieme sono v1 * 13 + 7. La risposta fornisce
indirizzi, non i nomi config e decrypt_config: i nomi provenienti dai simboli del binario non sono
ancora riportati in essa. Questa build è gcc -O2, dove function_va è l'inizio della funzione; sulle build
clang -O2 e gcc -O1 dello stesso sorgente è la testa del ciclo, a cui si risponde ok:true senza note.
Questa esecuzione è su Linux; l'ultima esecuzione Windows di provenance trace è nel registro.
yes: tutti i controlli concordano · partial: utilizzabile, con le lacune sotto indicate · wrong: ok:true con risultati
errati sugli input misurati · refused: un errore tipizzato · not yet: nessun percorso di codice. Misurato a ottobre
2026 su programmi compilati da sorgente nota, rispetto al processore e a strumenti indipendenti.
| Formato | File statico | Processo live |
|---|---|---|
| PE32+, PE32 (x86-64, x86, ARM64) | partial: le lacune e le risposte errate sotto indicate | Windows: non misurato per questa tabella |
| ELF64, ELF32 (x86-64, x86, AArch64, ARMv7) | partial: le lacune e le risposte errate sotto indicate; big-endian: decompile e RTTI refused | Linux x86-64: partial: le voci live sotto indicate; altre ISA non misurate |
| Mach-O, thin e universal | refused (load-failed) | not yet |
| WebAssembly | partial: l'elenco delle funzioni, il disassemblaggio, le chiamate da e verso una funzione, import, export, profile e strings (con la posizione di ogni stringa nella memoria lineare) concordano con wasm-objdump su ogni modulo misurato; decompile, IR e gli altri comandi che richiedono il lift refused (not-lifted: il lift è la fase 3) | not yet |
Byte grezzi (--bytes) | disassemble, cross-references, strings con un intervallo; discover e decompile partial; profile e rtti scan refused | — |
| ISA | Disassemble | Discover functions | Decompile |
|---|---|---|---|
| x86-64 | yes | yes con tabelle di unwind; partial senza | partial |
| x86 (i386) | yes | partial: anche con .eh_frame, il padding di GCC e .plt elencati come funzioni, i punti nei nomi riscritti, una fine mancante | partial |
| AArch64, little- e big-endian | yes | little-endian yes con .eh_frame; big-endian partial: manca funzioni che .eh_frame dichiara; partial senza; su PE --pdata è wrong | partial; big-endian refused |
| ARMv7 A32 | partial: nessun NEON, dati nel codice decodificati come codice | partial | wrong: tabelle di salto, tail call |
ARMv7 Thumb-2 (--arch thumb) | wrong: destinazioni dei branch, condizioni IT | partial: nessun nome o fine | wrong: un ritorno con predicato IT termina la funzione |
| WebAssembly | yes; la destinazione di un branch è una profondità di etichetta, non fornita fino alla fase 3 | yes: ogni corpo, la sua estensione, indice e nome | refused (fase 3) |
ok:true: RTTI Itanium in un PE MinGW (segnalato come assente), --pdata su ARM64 PE, nomi di sezione MinGW lunghi in profile (/4), l'elenco degli export di un oggetto condiviso ELF e i nomi .localalias che assegna alle funzioni di quell'oggetto, il padding i386 di GCC e il blocco .plt elencati come funzioni, i punti nei nomi dei simboli stampati come underscore (__x86_get_pc_thunk_bx per __x86.get_pc_thunk.bx), e il discovery big-endian AArch64 che omette funzioni dichiarate dal suo .eh_frame. Il decompilatore scarta gli argomenti pass-through, stampa gli shift aritmetici come unsigned e le moltiplicazioni a 64 bit come a 32 bit, può fare switch su o leggere un registro che non assegna mai, su AArch64 può nominare la stringa sbagliata, su A32 (e nella stessa forma su AArch64) esegue un ciclo countdown con un'iterazione in meno, e su x86 a 32 bit perde gli argomenti sullo stack e la metà alta dei risultati a 64 bit. Il suo campo quality non è un punteggio di correttezza. L'elenco completo, con i conteggi, è nel registro.ok con meno: senza tabelle di unwind, funzioni raggiunte solo tramite vtable, il punto di ingresso ABI MSVC e la maggior parte di un oggetto condiviso ELF; riferimenti contenuti in immediati assoluti, adrp+add o adr su AArch64, o la GOT i386; vtable secondarie Itanium, e ogni classe Itanium di un'immagine stripped; nomi che solo la tabella dei simboli COFF contiene. Un PDB accanto a un PE x64 ha fornito ogni inizio, nome e fine sulle due immagini lld-link misurate (35 su 35, 18 su 18).provenance trace stampa un indirizzo scritto come string literal quando i byte in quel punto sono per caso stampabili, e su alcune build nomina la testa del ciclo come funzione (sopra); la scansione per pattern di byte (scan aob) richiede --start/--size per superare una regione non leggibile; scan dissect indovina i tipi dei campi; i comandi solo per Windows rifiutano altrove.Binari precompilati per Linux e Windows, il server MCP e sha256sums.txt: ultima 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
Oppure compilalo con Rust stabile, su Linux o Windows: cargo build --workspace --release. rust-toolchain.toml
fissa solo il canale e indica come compilare su Windows senza gli MSVC Build Tools.