Kit de herramientas de ingeniería inversa centrado en IA: análisis estático, descompilador SSA, memoria en vivo, procedencia. Código disponible (PolyForm Noncommercial).
Desde un watchpoint de hardware en un proceso en vivo hasta la sentencia descompilada exacta que cambió el valor.
Los escáneres de memoria encuentran la dirección. Los descompiladores explican el código. N0xis los conecta.
$ 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
]
Eso es el hp -= 1; del código fuente, recuperado de un proceso en ejecución — la dirección vigilada
aparece en la sentencia. Verificado en Windows y Linux.
Un escaneo de "encontrar qué accede a esto" normalmente se detiene en una línea de desensamblado en bruto, y un descompilador normalmente no tiene ninguna entrada de watchpoint en vivo. Esto es las dos mitades unidas: el impacto del watchpoint se resuelve a través del mismo pipeline SSA que descompila el archivo.
Binarios precompilados para Linux y Windows — última versión.
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
O compílalo: cargo build --workspace --release (Windows y Linux; no se necesitan MSVC Build Tools
— rust-toolchain.toml fija el host gnu).
Cada comando imprime un objeto JSON — incluidos los errores de argumentos: {"ok":true,"data":…,"meta":…} o
{"ok":false,"error":…}. Añade --pretty para leerlo; el código de salida es distinto de cero en caso de fallo.
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
Los mismos comandos se ejecutan sobre un --pid en vivo, un --file estático, un --snapshot capturado, o un
proceso remoto por SSH. Es fontanería Unix ordinaria —
n0x function discover --file game.exe --pdata | jq -r '.data.functions[].va' alimenta el siguiente
comando. n0x guide lista los 113 comandos, generados desde el binario para que nunca se desvíen — y una prueba
falla la compilación si este número lo hace.
Desde un agente: apunta cualquier cliente MCP a n0xis-mcp — 25 herramientas que devuelven el idéntico
sobre {ok,data,meta}, JSON-RPC sobre stdio.
{ "mcpServers": { "n0xis": { "command": "/path/to/n0xis-mcp" } } }
--explain: qué sub-paso cambió qué, en qué dirección), no una respuesta de caja negra..rdata de MSVC y símbolos
_ZTV de Itanium), .NET NativeAOT RVA ↔ Namespace.Type.Method, LuaJIT, Bitsquid, IL2CPP —
para que una imagen sin símbolos se lea como código fuente, no como sub_XXXX..n0xt, anotaciones versionadas, caché direccionada por contenido,
comparación de funciones/versiones.Windows y Linux, PE y ELF, un solo pipeline — archivos estáticos, procesos en vivo, snapshots y objetivos remotos fluyen todos a través de los mismos pasos y el mismo JSON versionado.
No hay no determinismo de ML en el núcleo, nunca. Una GUI de escritorio vive en un repositorio separado: n0xis-gui.
Alpha. Cada afirmación a continuación es una medición contra una fuente externa a la herramienta — el kernel, las propias tablas de la imagen, o el propio proceso objetivo. Donde no existe tal fuente, lo dice, porque implementado y verificado no son la misma afirmación.
Memoria en vivo, contra un objetivo desechable que planta valores conocidos:
/proc/<pid>/mem, uno incorrecto y corregido. Los
otros dos son solo para Windows y lo rechazan diciéndolo. El incorrecto era scan dissect, que
eligió el ancho de un campo antes que su alineación y por eso leyó una estructura cuatro bytes fuera de fase desde
su primer error en adelante: un campo de seis correcto contra un diseño conocido desde su propio código fuente, cinco
de seis después.ui focus correctamente no encuentra ninguna ventana en un objetivo de consola; stack backtrace es
solo para Linux — el único lugar donde el adaptador de Linux va por delante.El decodificador, contra un desensamblador independiente — el suelo sobre el que se sostiene todo lo demás, y hasta ahora comprobado solo por los pasos construidos sobre él, que todos leen el mismo flujo:
objdump. Tres formas construidas a propósito exactas,
20 000 instrucciones de una biblioteca compartida y 20 000 de una DLL de sistema de 32 bits, cero
discrepancias y cero límites que cualquiera de los dos tuviera por separado. Ampliado a 60 000 instrucciones
de un binario de navegador despojado de 334 MB: 2 discrepancias, ambas dentro de una cadena ASCII incrustada
en .text donde la propia referencia decodifica (bad) — no es código, y ninguna de las dos lecturas es
la correcta.llvm-objdump (las codificaciones de ancho fijo hacen que los límites
sean vacíos). Véase la línea de ARM64 más abajo.llvm-mc --mattr=+all y por n0xis. 241 ambos las llaman instrucción, 304 ambos las rechazan —
y 48 (8.0%) son codificaciones reservadas que n0xis lee como instrucciones, con 7 (1.2%) instrucciones
reales que rechaza (principalmente atómicas LSE). Tres de las 48 fueron decodificadas a mano y son
genuinamente UNALLOCATED. Esa brecha está retenida por un límite que falla si crece, y se declara
aquí en lugar de omitirse: una palabra reservada leída como instrucción convierte datos en un
programa plausible.Extensiones de funciones, contra la propia tabla de desenrollado de la imagen y la lista de exportaciones del enlazador:
start..end de cada FDE de objdump --dwarf=frames igual a la extensión recuperada —
3 787 comparadas en esta máquina (10 + las 3 777 de libc), inicio y fin, exactos; medidas por separado
en 15 467 y 14 355 en dos bibliotecas grandes.