JPMS descriptors are never loaded by a class loader; parsing one and rebuilding its pool left the unmodeled Module attribute with stale indices, and ASM died in readModule on the rewritten jar (caught by the ASM probe on Loreport, which ships META-INF/versions module-infos). Byte-for-byte resource passthrough keeps the descriptor valid. |
||
|---|---|---|
| crates | ||
| docs | ||
| info | ||
| scripts | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| NOTICE.md | ||
| README.md | ||
Читает JAR, переписывает классовые файлы и ресурсы, собирает обратно: детерминированно, с маппингами для stack trace и с проверкой, что выход действительно загружается настоящей JVM.
Статус
Ядро построено, большая часть техник реализована.
| блок | состояние |
|---|---|
| IR классовых файлов, метки вместо смещений | ✅ |
| конфиг, детерминированный PRNG, маппинги, отчёт | ✅ |
| анализ: иерархия, entrypoint'ы, keep-правила | ✅ |
format::parse/write + кадры StackMapTable (backend ristretto_classfile) |
✅ |
| пассы: rename, resources, strings, constants, noise, debug | ✅ |
верификация: red-паттерны, java -Xverify:all, метрики |
✅ |
CLI (obfuscate / analyze / patterns) |
✅ |
| пасс flow (кадры готовы, 4 схемы: state-spread, computed-switch, butterfly, exception-goto) | ✅ |
Подробности в docs/architecture.md, план в todo.md.
Быстрый старт
./scripts/check.sh # fmt + clippy -D warnings + тесты
# обфускация jar: конвейер, маппинги, JSON-отчёт
cargo run -p noxis -- obfuscate input.jar -o output.jar --seed 42
# что внутри jar: классы, entrypoint'ы, keep-правила (без изменений)
cargo run -p noxis -- analyze input.jar
# красный список паттернов: показать или прогнать по jar'у
cargo run -p noxis -- patterns --list
cargo run -p noxis -- patterns --input output.jar
obfuscate по умолчанию включает все готовые пассы. Флаги --no-rename,
--no-strings, --no-constants, --no-noise, --no-resources, --no-debug-info,
--no-flow выключают их по отдельности.
Структура
noxis/
├── Cargo.toml workspace, lints, release-профиль
├── scripts/check.sh structure → fmt → clippy → test
├── docs/ архитектура, техники, стек, уроки
├── info/ исходный материал разбора (вне правил)
└── crates/
├── noxis-classfile/ IR + парсер/запись + StackMapTable
├── noxis-core/ конфиг, seed, маппинги, контракт Pass
├── noxis-analysis/ иерархия, entrypoint'ы, keep
├── noxis-passes/ сами трансформации + конвейер
├── noxis-runtime/ схемы шифрования, ABI декодера
├── noxis-jar/ ZIP, ресурсы, срез подписей
├── noxis-verify/ red-паттерны, java -Xverify, метрики
├── noxis/ CLI: obfuscate, analyze, patterns
└── noxis-structure-check/ автогейт структуры
Документация
| документ | что внутри |
|---|---|
docs/README.md |
индекс и структурные правила проекта |
docs/architecture.md |
слои, крейты, IR, конвейер |
docs/techniques.md |
как работает каждая техника, плюсы и минусы |
docs/stack.md |
почему свой IR, backend, StackMapTable, PRNG |
docs/learnings/lessons.md |
уроки разбора: чего делать нельзя |
docs/learnings/reference.md |
разбор референсного обфускатора |
docs/learnings/priorities.md |
что улучшаем и в каком порядке |
docs/learnings/ai-resistance.md |
новые техники (MBA, виртуализация) и устойчивость к LLM-анализу |
Исходный материал разбора в info/README.md.
Лицензия
AGPL-3.0-only, см. LICENSE.
Проект остаётся полностью открытым: его можно изучать, использовать (в том числе
коммерчески) и изменять. Условие AGPL: любые производные работы, которые
распространяются или доступны пользователям по сети, обязаны публиковаться под
той же лицензией. Это защищает noxis от закрытых форков, которые перепродают
его как готовый продукт.
Сторонние зависимости и их лицензии в NOTICE.md.
Ответственное использование
noxis это инструмент двойного назначения, одинаково полезный для защиты
собственного байткода и способен усложнять анализ вредоносного ПО. Лицензия
это не регламентирует, но это норма сообщества проекта:
- используйте обфускацию, чтобы защищать свой код и код тех, кто вас об этом попросил;
- не применяйте инструмент для упаковки вредоносов, обхода средств защиты и антивирусов или иной деятельности, запрещённой законом.
Нарушение этих норм не влечёт юридических последствий по лицензии, но приведёт к отказу в поддержке и закрытию issue/PR в репозитории.