Boîte à outils de rétro-ingénierie : désassembleur, décompilateur SSA, récupération de classes C++ et analyse de processus en direct pour PE et ELF. CLI scriptable, chaque réponse en JSON. Code source disponible (PolyForm Noncommercial).
Une boîte à outils de rétro-ingénierie : désassembleur, décompilateur SSA, récupération de classes C++ et analyse de processus en cours d'exécution pour PE et ELF. Les fichiers statiques et les processus en cours passent par un seul pipeline, et chaque réponse est du JSON sur lequel un script peut agir.
Trois interfaces partagent ce cœur : la CLI, où une commande répond avec un seul objet JSON (une session serve avec une enveloppe prête, puis une par requête) ; une interface graphique de bureau dans son propre dépôt, n0xis-gui ; et un serveur MCP, n0xis-mcp — 27 outils renvoyant la même enveloppe via JSON-RPC sur stdio.

Une exécution réelle de examples/config-demo : un programme garde ses paramètres chiffrés et les déchiffre en mémoire ; trouvez le texte en clair, posez un point d'arrêt matériel dessus, et obtenez le code décompilé qui l'a écrit. Relancez-le vous-même avec 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);"
]
Dans la source, il s'agit de config[i] = sealed[i] ^ key; key = key * 13 + 7; : les deux instructions
rcx.4 = v1 + v1 * 2 et v1 = v1 + rcx.4 * 4 + 7 forment ensemble v1 * 13 + 7. La réponse donne
des adresses, et non les noms config et decrypt_config : les noms issus des symboles du binaire ne sont pas
encore reportés dans celle-ci. Cette compilation est en gcc -O2, où function_va est le début de la fonction ; sur les compilations clang
-O2 et gcc -O1 de la même source, c'est la tête de boucle, répondue ok:true sans note.
Cette exécution est sous Linux ; la dernière exécution Windows de provenance trace figure dans le registre.
oui : toutes les vérifications concordent · partiel : utilisable, avec les lacunes ci-dessous · faux : ok:true avec des résultats
erronés sur les entrées mesurées · refusé : une erreur typée · pas encore : aucun chemin de code. Mesuré en octobre
2026 sur des programmes compilés à partir de sources connues, comparés au processeur et à des outils indépendants.
| Format | Fichier statique | Processus en cours d'exécution |
|---|---|---|
| PE32+, PE32 (x86-64, x86, ARM64) | partiel : les lacunes et réponses erronées ci-dessous | Windows : non mesuré pour ce tableau |
| ELF64, ELF32 (x86-64, x86, AArch64, ARMv7) | partiel : les lacunes et réponses erronées ci-dessous ; big-endian : décompilation et RTTI refusées | Linux x86-64 : partiel : les entrées en cours d'exécution ci-dessous ; autres ISA non mesurés |
| Mach-O, thin et universal | refusé (load-failed) | pas encore |
| WebAssembly | partiel : la liste des fonctions, le désassemblage, les appels vers et depuis une fonction, les imports, les exports, profile et strings (avec l'emplacement de chaque chaîne dans la mémoire linéaire) concordent avec wasm-objdump sur chaque module mesuré ; décompilation, IR et les autres commandes nécessitant le lift refusées (not-lifted : le lift est l'étape 3) | pas encore |
Octets bruts (--bytes) | désassembler, références croisées, chaînes avec une plage ; discover et decompile partiels ; profile et rtti scan refusés | — |
| ISA | Désassembler | Découvrir les fonctions | Décompiler |
|---|---|---|---|
| x86-64 | oui | oui avec les tables de déroulement ; partiel sans | partiel |
| x86 (i386) | oui | partiel : même avec .eh_frame, le remplissage de GCC et .plt listés comme fonctions, les points dans les noms réécrits, une fin manquante | partiel |
| AArch64, little- et big-endian | oui | little-endian oui avec .eh_frame ; big-endian partiel : manque des fonctions déclarées par .eh_frame ; partiel sans ; sur PE --pdata est faux | partiel ; big-endian refusé |
| ARMv7 A32 | partiel : pas de NEON, données dans le code décodées comme du code | partiel | faux : tables de saut, appels de queue |
ARMv7 Thumb-2 (--arch thumb) | faux : cibles de branchement, conditions IT | partiel : pas de noms ni de fins | faux : un retour prédiqué par IT termine la fonction |
| WebAssembly | oui ; la cible d'un branchement est une profondeur d'étiquette, non fournie avant l'étape 3 | oui : chaque corps, son étendue, son index et son nom | refusé (étape 3) |
ok:true : RTTI Itanium dans un PE MinGW (signalé absent), --pdata sur ARM64 PE, noms de sections MinGW longs dans profile (/4), la liste d'exports d'un objet partagé ELF et les noms .localalias qu'il attribue aux fonctions de cet objet, le remplissage i386 de GCC et le bloc .plt listés comme fonctions, les points dans les noms de symboles imprimés comme des underscores (__x86_get_pc_thunk_bx pour __x86.get_pc_thunk.bx), et la découverte big-endian AArch64 manquant des fonctions que son .eh_frame déclare.
Le décompilateur supprime les arguments pass-through, imprime les décalages arithmétiques comme non signés et les multiplications 64 bits comme 32 bits, peut faire un switch sur ou lire un registre qu'il n'assigne jamais, sur AArch64 peut nommer la mauvaise chaîne, sur A32 (et de la même façon sur AArch64) exécute une boucle de compte à rebours une itération trop courte, et sur x86 32 bits perd les arguments de pile et la moitié haute des résultats 64 bits. Son champ quality n'est pas un score d'exactitude. La liste complète, avec les décomptes, se trouve dans le registre.ok avec moins : sans tables de déroulement, les fonctions atteintes uniquement via des vtables, le point d'entrée ABI MSVC et la majeure partie d'un objet partagé ELF ; les références contenues dans des immédiats absolus, adrp+add ou adr sur AArch64, ou la GOT i386 ; les vtables secondaires Itanium, et toutes les classes Itanium d'une image strippée ; les noms que seule la table de symboles COFF détient. Un PDB à côté d'un PE x64 a donné chaque début, nom et fin sur les deux images lld-link mesurées (35 sur 35, 18 sur 18).provenance trace imprime une adresse écrite comme un littéral de chaîne lorsque les octets à cet endroit se trouvent être imprimables, et sur certaines builds nomme la tête de boucle comme la fonction (ci-dessus) ; le scan de motifs d'octets (scan aob) nécessite --start/--size pour franchir une région illisible ; scan dissect devine les types de champs ; les commandes Windows-only refusent ailleurs.Binaires précompilés pour Linux et Windows, le serveur MCP et sha256sums.txt : dernière version.