Инструментарий для обратного проектирования: дизассемблер, SSA-декомпилятор, восстановление классов C++ и анализ живых процессов для PE и ELF. Скриптуемый CLI, каждый ответ в формате JSON. Исходный код доступен (PolyForm Noncommercial).
Инструментарий для обратной разработки: дизассемблер, SSA-декомпилятор, восстановление классов C++ и анализ живых процессов для PE и ELF. Статические файлы и запущенные процессы проходят через единый конвейер, и каждый ответ — это JSON, с которым может работать скрипт.
Три интерфейса используют это ядро: CLI, где команда отвечает одним JSON-объектом (сессия serve с готовым конвертом, затем по одному на запрос); настольный GUI в отдельном репозитории, n0xis-gui; и MCP-сервер, n0xis-mcp — 27 инструментов, возвращающих тот же конверт по JSON-RPC через stdio.

Реальный запуск examples/config-demo: программа хранит свои настройки в зашифрованном виде и расшифровывает их в память; найдите открытый текст, установите на него аппаратную точку останова и получите декомпилированный код, который его записал. Повторите запуск самостоятельно с помощью 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);"
]
В исходнике это config[i] = sealed[i] ^ key; key = key * 13 + 7;: два оператора
rcx.4 = v1 + v1 * 2 и v1 = v1 + rcx.4 * 4 + 7 вместе дают v1 * 13 + 7. Ответ даёт
адреса, а не имена config и decrypt_config: имена из символов бинарника пока
не переносятся в него. Эта сборка — gcc -O2, где function_va — начало функции; в сборках
clang -O2 и gcc -O1 того же исходника это заголовок цикла, ответ ok:true без примечания.
Этот запуск выполнен на Linux; последний запуск provenance trace на Windows — в журнале.
yes: все проверки совпали · partial: пригодно, с пробелами ниже · wrong: ok:true с неверными
результатами на измеренных входных данных · refused: типизированная ошибка · not yet: нет пути в коде. Измерено в октябре
2026 на программах, собранных из известного исходника, в сравнении с процессором и независимыми инструментами.
| Формат | Статический файл | Живой процесс |
|---|---|---|
| PE32+, PE32 (x86-64, x86, ARM64) | partial: пробелы и неверные ответы ниже | Windows: для этой таблицы не измерялось |
| ELF64, ELF32 (x86-64, x86, AArch64, ARMv7) | partial: пробелы и неверные ответы ниже; big-endian: декомпиляция и RTTI refused | Linux x86-64: partial: живые записи ниже; другие ISA не измерялись |
| Mach-O, thin и universal | refused (load-failed) | not yet |
| WebAssembly | partial: список функций, дизассемблирование, вызовы в функцию и из неё, импорты, экспорты, profile и strings (с местом каждой строки в линейной памяти) совпали с wasm-objdump на каждом измеренном модуле; декомпиляция, IR и остальные команды, которым нужен lift, refused (not-lifted: lift — это этап 3) | not yet |
Сырые байты (--bytes) | дизассемблирование, перекрёстные ссылки, строки с диапазоном; discover и декомпиляция partial; profile и rtti scan refused | — |
| ISA | Дизассемблирование | Обнаружение функций | Декомпиляция |
|---|---|---|---|
| x86-64 | yes | yes с таблицами раскрутки; partial без них | partial |
| x86 (i386) | yes | partial: даже с .eh_frame выравнивание GCC и .plt перечислены как функции, точки в именах переписаны, конец отсутствует | partial |
| AArch64, little- и big-endian | yes | little-endian yes с .eh_frame; big-endian partial: пропускает функции, объявленные в .eh_frame; partial без него; на PE --pdata неверен | partial; big-endian refused |
| ARMv7 A32 | partial: нет NEON, данные в коде декодируются как код | partial | wrong: таблицы переходов, хвостовые вызовы |
ARMv7 Thumb-2 (--arch thumb) | wrong: цели ветвлений, условия IT | partial: нет имён и концов | wrong: возврат под предикатом IT завершает функцию |
| WebAssembly | yes; цель ветвления — это глубина метки, не выдаётся до этапа 3 | yes: каждое тело, его протяжённость, индекс и имя | refused (этап 3) |
ok:true: RTTI Itanium в MinGW PE (сообщается как отсутствующий), --pdata на ARM64 PE, длинные
имена секций MinGW в profile (/4), список экспортов разделяемого объекта ELF и
имена .localalias, которые он даёт функциям этого объекта, выравнивание i386 от GCC и блок .plt, перечисленные как
функции, точки в именах символов, выводимые как подчёркивания (__x86_get_pc_thunk_bx для
__x86.get_pc_thunk.bx), и обнаружение big-endian AArch64, пропускающее функции, которые объявляет его .eh_frame.
Декомпилятор отбрасывает сквозные аргументы, выводит арифметические сдвиги как беззнаковые, а 64-битные умножения
как 32-битные, может выполнять switch по регистру или читать регистр, который он никогда не присваивает, на AArch64 может назвать не ту строку,
на A32 (и в той же форме на AArch64) выполняет цикл обратного отсчёта на одну итерацию меньше, а на 32-битном
x86 теряет аргументы стека и старшую половину 64-битных результатов. Его поле quality не является
оценкой корректности. Полный список с количествами — в ledger.ok с меньшим: без таблиц раскрутки, функции, достижимые только через vtables,
точка входа MSVC-ABI и большая часть разделяемого объекта ELF; ссылки, хранящиеся в абсолютных непосредственных значениях,
AArch64 adrp+add или adr, или GOT i386; вторичные vtables Itanium и каждый класс Itanium
в stripped-образе; имена, которые хранит только таблица символов COFF. PDB рядом с x64 PE дал каждый
старт, имя и конец на двух измеренных образах lld-link (35 из 35, 18 из 18).provenance trace выводит записанный адрес как строковый литерал, когда байты
там оказываются печатаемыми, а в некоторых сборках называет голову цикла функцией (см. выше);
сканирование по байтовому шаблону (scan aob) требует --start/--size, чтобы обойти нечитаемую область;
scan dissect угадывает типы полей; команды только для Windows отказывают в других местах.Готовые бинарники для Linux и Windows, сервер MCP и sha256sums.txt: последний релиз.
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
Или соберите его со стабильным Rust, на Linux или Windows: cargo build --workspace --release. rust-toolchain.toml
фиксирует только канал и описывает, как собирать на Windows без MSVC Build Tools.