noxis: JVM/Java bytecode obfuscator written in Rust
Find a file
loki5512344 139aea9a8f
frames,jar,passes: verifier-driven hardening from real jars
Proven by paranoid runs over lorep (17 classes, fully green),
LoVisual (4081 classes) and oc2r (1278 classes) with per-class
java -Xverify:all, each fix first reproduced as a red test:

- merge: Top absorbs instead of Top-wins (javac declares Top for
  slots unwritten on some inflow; precise types reject those edges).
  Regression: loop_head_keeps_top_for_loop_local.
- emit: collapse [Long|Double, Top] pairs on operand stacks
  (javac writes one entry; the pair is rejected). Regression:
  wide_stack_join_emits_single_entries.
- xfer ArrayLoad: push the wide pair, fixing lcmp underflow.
  Regression: array_load_wide_pushes_pair.
- xfer <init>: convert only the receiver's own allocation site
  instead of every Uninitialized (nested construction clobbered
  the outer object). Regression: nested_construction_keeps_outer.
- xfer ANewArray: array operands gain one dimension ([B] -> [[B)
  instead of an illegal L-wrap ([L[B;). Covered by the same test.
- jar load: duplicate class names (multi-release module-info
  twins) keep the first occurrence instead of crashing save.
  Test: duplicate_class_names_keep_first.
- strings/constants: skip methods past MAX_METHOD_INSNS (8000)
  so giants cannot overflow the 64KB writer ceiling. Tests:
  oversized_methods_are_skipped in both passes.
- merge errors now name both types being merged.

Also: em-dash removed repo-wide (724 spots, rule added to
todo.md), allow-lints only in tests (scratch example deleted),
code comments migrated to English in every file this change
touches.
2026-10-09 13:47:27 +02:00
crates frames,jar,passes: verifier-driven hardening from real jars 2026-10-09 13:47:27 +02:00
docs frames,jar,passes: verifier-driven hardening from real jars 2026-10-09 13:47:27 +02:00
info frames,jar,passes: verifier-driven hardening from real jars 2026-10-09 13:47:27 +02:00
scripts Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00
.gitignore gitignore: stop tracking todo.md, keep it local-only 2026-10-08 23:12:37 +02:00
Cargo.lock Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00
Cargo.toml Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00
LICENSE Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00
NOTICE.md frames,jar,passes: verifier-driven hardening from real jars 2026-10-09 13:47:27 +02:00
README.md passes: implement control-flow pass (4 schemes + rotation) 2026-10-09 11:11:55 +02:00

noxis

Обфускатор JVM/Java-байткода на Rust.

Rust MSRV License Status


Читает 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 в репозитории.