Инструментарий для реверс-инжиниринга с приоритетом ИИ: статический анализ, SSA-декомпилятор, работа с живой памятью, отслеживание происхождения. Доступен исходный код (PolyForm Noncommercial).
От аппаратной точки наблюдения в живом процессе до точной декомпилированной инструкции, изменившей значение.
Сканеры памяти находят адрес. Декомпиляторы объясняют код. N0xis связывает их.
$ 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
]
Это исходное hp -= 1;, восстановленное из работающего процесса — наблюдаемый адрес
присутствует в инструкции. Проверено на Windows и Linux.
Сканирование «найти, что обращается к этому» обычно останавливается на строке сырого дизассемблирования, а декомпилятор обычно вообще не имеет входных данных от живой точки наблюдения. Здесь две половины соединены: срабатывание точки наблюдения проходит через тот же SSA-конвейер, который декомпилирует файл.
Готовые бинарники для Linux и Windows — последний релиз.
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
Или соберите сами: cargo build --workspace --release (Windows и Linux; MSVC Build Tools
не нужны — rust-toolchain.toml фиксирует gnu-хост).
Каждая команда выводит один JSON-объект — включая ошибки аргументов: {"ok":true,"data":…,"meta":…} или
{"ok":false,"error":…}. Добавьте --pretty для чтения; код возврата ненулевой при ошибке.
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
Те же команды работают с живым --pid, статическим --file, захваченным --snapshot или
удалённым процессом по SSH. Это обычная Unix-инфраструктура —
n0x function discover --file game.exe --pdata | jq -r '.data.functions[].va' передаёт результат следующей
команде. n0x guide перечисляет все 113 команд, генерируемых из бинарника, поэтому список никогда не устаревает — и тест
проваливает сборку, если это число не совпадает.
Из агента: направьте любой MCP-клиент на n0xis-mcp — 25 инструментов, возвращающих идентичный
конверт {ok,data,meta}, JSON-RPC через stdio.
{ "mcpServers": { "n0xis": { "command": "/path/to/n0xis-mcp" } } }
--explain: какой подпроход что изменил, по какому адресу), а не даёт ответ из чёрного ящика..rdata и символы Itanium
_ZTV), .NET NativeAOT RVA ↔ Namespace.Type.Method, LuaJIT, Bitsquid, IL2CPP —
так что очищенный образ читается как исходник, а не sub_XXXX..n0xt, версионированные аннотации, контентно-адресуемое кэширование,
сравнение функций/версий.Windows и Linux, PE и ELF, один конвейер — статические файлы, живые процессы, снимки и удалённые цели проходят через одни и те же проходы и один и тот же версионированный JSON.
В ядре никогда нет ML-недетерминизма. Настольный GUI живёт в отдельном репозитории: n0xis-gui.
Альфа. Каждое утверждение ниже — это измерение относительно источника вне инструмента — ядра, собственных таблиц образа или самого целевого процесса. Там, где такого источника нет, это указано, потому что реализовано и проверено — не одно и то же утверждение.
Живая память, против одноразовой цели, которая размещает известные значения:
/proc/<pid>/mem, одна неверна и исправлена. Две
остальные только для Windows и отказываются, сообщая об этом. Неверной была scan dissect, которая
выбрала ширину поля до его выравнивания и потому читала структуру со сдвигом на четыре байта с
самой первой ошибки: одно поле из шести верно относительно раскладки, известной из её собственного исходника, пять
из шести после.ui focus корректно не находит окно у консольной цели; stack backtrace —
только для Linux — единственное место, где Linux-адаптер впереди.Декодер, против независимого дизассемблера — фундамент, на котором стоит всё остальное, и до сих пор проверявшийся только проходами, построенными поверх него, которые все читают один и тот же поток:
objdump. Три специально построенные формы точны,
20 000 инструкций разделяемой библиотеки и 20 000 инструкций 32-битной системной DLL, ноль
расхождений и ноль границ, которые нашла бы только одна из сторон. Расширено до 60 000 инструкций
из 334 МБ очищенного бинарника браузера: 2 расхождения, оба внутри ASCII-строки, встроенной
в .text, где сам эталон декодирует (bad) — это не код, и ни одно из чтений не
является правильным.llvm-objdump (кодировки фиксированной ширины делают границы
бессмысленными). См. строку ARM64 ниже.llvm-mc --mattr=+all и n0xis. 241 оба называют инструкцией, 304 оба отвергают —
и 48 (8.0%) — это зарезервированные кодировки, которые n0xis читает как инструкции, при 7 (1.2%) реальных
инструкциях, которые он отвергает (в основном LSE-атомики). Три из 48 были декодированы вручную и являются
действительно UNALLOCATED. Этот разрыв удерживается границей, которая проваливается, если он растёт, и указан
здесь, а не опущен: зарезервированное слово, прочитанное как инструкция, превращает данные в
правдоподобную программу.Границы функций, против собственной таблицы размотки образа и списка экспортов линкера:
start..end каждого FDE из objdump --dwarf=frames равны восстановленной границе —
3 787 сравнено на этой машине (10 + 3 777 из libc), начало и конец, точно; отдельно
измерено 15 467 и 14 355 на двух больших библиотеках.