KI-first Reverse-Engineering-Toolkit: statische Analyse, SSA-Decompiler, Live-Speicher, Provenienz. Quelloffen verfügbar (PolyForm Noncommercial).
Von einem Hardware-Watchpoint in einem laufenden Prozess bis zur exakten dekompilierten Anweisung, die den Wert geändert hat.
Memory-Scanner finden die Adresse. Decompiler erklären den Code. N0xis verbindet beides.
$ n0x provenance trace --pid 9348 --addr 0x7ff68bef3010 --kind write
"function_va": "0x7ff68bef1580", // containing function, auto-resolved
"decompiled_context": [
"rax.2 = (*(uint32_t*)(0x7ff68bef3010) - 0x1);",
"*(uint32_t*)(0x7ff68bef3010) = rax.2;" // ← the statement that moved your value
]
Das ist das hp -= 1; des Quellcodes, wiederhergestellt aus einem laufenden Prozess — die überwachte Adresse
erscheint in der Anweisung. Verifiziert unter Windows und Linux.
Ein „finde, was darauf zugreift"-Scan endet normalerweise bei einer rohen Disassembler-Zeile, und ein Decompiler hat normalerweise überhaupt keinen Live-Watchpoint-Input. Dies sind die beiden Hälften, zusammengefügt: Der Watchpoint-Treffer wird durch dieselbe SSA-Pipeline aufgelöst, die die Datei dekompiliert.
Vorgefertigte Binärdateien für Linux und Windows — neueste Version.
curl -LO https://github.com/Structio-labs/N0xis/releases/latest/download/n0xis-linux-x86_64
chmod +x n0xis-linux-x86_64 && ./n0xis-linux-x86_64 --version
Oder selbst bauen: cargo build --workspace --release (Windows und Linux; keine MSVC Build Tools
nötig — rust-toolchain.toml pinnt den gnu-Host).
Jeder Befehl gibt ein JSON-Objekt aus — Argumentfehler eingeschlossen: {"ok":true,"data":…,"meta":…} oder
{"ok":false,"error":…}. Füge --pretty hinzu, um es zu lesen; der Exit-Code ist bei Fehlschlag ungleich null.
n0x doctor # environment check
n0x profile --file game.exe # triage: sections, exports, engine hints
n0x function discover --file game.exe --pdata # exact .pdata discovery
n0x decomp pseudo --file game.exe --addr 0x140012a00 --style ssa --pretty
n0x provenance trace --pid 4821 --addr 0x1a2b3c40 --kind write --pretty
Dieselben Befehle laufen auf einem Live---pid, einer statischen --file, einem erfassten --snapshot oder einem
entfernten Prozess über SSH. Es ist gewöhnliche Unix-Plumbing —
n0x function discover --file game.exe --pdata | jq -r '.data.functions[].va' speist den nächsten
Befehl. n0x guide listet alle 113 Befehle auf, generiert aus der Binärdatei, sodass sie nie driftet — und ein Test
lässt den Build fehlschlagen, wenn diese Zahl es tut.
Aus einem Agenten: Richte jeden MCP-Client auf n0xis-mcp — 25 Tools, die identische
{ok,data,meta}-Hülle zurückgeben, JSON-RPC über stdio.
{ "mcpServers": { "n0xis": { "command": "/path/to/n0xis-mcp" } } }
--explain: welcher Sub-Pass was geändert hat, an welcher Adresse), keine Blackbox-Antwort..rdata-Ketten und Itanium
_ZTV-Symbole), .NET NativeAOT RVA ↔ Namespace.Type.Method, LuaJIT, Bitsquid, IL2CPP —
sodass ein gestripptes Image wie Quellcode liest, nicht wie sub_XXXX..n0xt-Tabellen, versionierte Annotationen, content-addressed Caching,
Funktions-/Versions-Diffing.Windows und Linux, PE und ELF, eine Pipeline — statische Dateien, Live-Prozesse, Snapshots und entfernte Ziele fließen alle durch dieselben Pässe und dasselbe versionierte JSON.
Es gibt niemals ML-Nichtdeterminismus im Kern. Eine Desktop-GUI lebt in einem separaten Repo: n0xis-gui.
Alpha. Jede Aussage unten ist eine Messung gegen eine Quelle außerhalb des Tools — den Kernel, die eigenen Tabellen des Images oder den Zielprozess selbst. Wo es keine solche Quelle gibt, wird das gesagt, denn implementiert und verifiziert sind nicht dieselbe Aussage.
Live-Speicher, gegen ein Wegwerf-Ziel, das bekannte Werte platziert:
/proc/<pid>/mem gemessen, einer falsch und behoben. Die
anderen zwei sind Windows-only und verweigern dies mit entsprechender Angabe. Der eine falsche war scan dissect, der
die Breite eines Feldes vor seiner Ausrichtung wählte und so eine Struktur vier Bytes phasenverschoben ab seinem
ersten Fehler an las: eines von sechs Feldern richtig gegen ein Layout, das aus seiner eigenen Quelle bekannt ist, fünf
von sechs danach.ui focus findet korrekt kein Fenster auf einem Konsolen-Ziel; stack backtrace ist
Linux-only — die eine Stelle, an der der Linux-Adapter voraus ist.Der Decoder, gegen einen unabhängigen Disassembler — das Fundament, auf dem alles andere steht, und bis jetzt nur durch die darauf aufbauenden Pässe geprüft, die alle denselben Stream lesen:
objdump. Drei zweckgebaute Formen exakt,
20 000 Instruktionen einer Shared Library und 20 000 einer 32-Bit-System-DLL, null
Unstimmigkeiten und null Grenzen, die eine Seite allein hatte. Erweitert auf 60 000 Instruktionen
einer 334 MB großen gestrippten Browser-Binärdatei: 2 Unstimmigkeiten, beide innerhalb eines ASCII-Strings, der in .text eingebettet ist,
wo die Referenz selbst (bad) dekodiert — kein Code, und keine der beiden Lesarten ist
die richtige.llvm-objdump (festbreite Kodierungen machen Grenzen
bedeutungslos). Siehe die ARM64-Zeile unten.llvm-mc --mattr=+all und von n0xis. 241 bezeichnen beide als Instruktion, 304 lehnen beide ab —
und 48 (8,0 %) sind reservierte Kodierungen, die n0xis als Instruktionen liest, mit 7 (1,2 %) echten
Instruktionen, die es ablehnt (meist LSE-Atomics). Drei der 48 wurden von Hand dekodiert und sind
tatsächlich UNALLOCATED. Diese Lücke wird durch eine Schranke gehalten, die fehlschlägt, wenn sie wächst, und hier genannt
statt ausgelassen: ein reserviertes Wort, das als Instruktion gelesen wird, verwandelt Daten in ein
plausibles Programm.Funktionsausdehnungen, gegen die eigene Unwind-Tabelle des Images und die Exportliste des Linkers:
start..end aus objdump --dwarf=frames gleich der wiederhergestellten Ausdehnung —
3 787 auf dieser Maschine verglichen (10 + libc's 3 777), Start und Ende, exakt; separat
gemessen bei 15 467 und 14 355 auf zwei großen Bibliotheken.