noxis: JVM/Java bytecode obfuscator written in Rust
Find a file
loki5512344 2674d7fc89 classfile,passes: model Nest attributes as IR (fix ClassFormatError)
NestHost/NestMembers were carried as Attribute::Raw with constant-pool
indices baked in. During writing the pool is rebuilt in a different order,
so those indices pointed at the wrong entries and the JVM rejected the
class: ClassFormatError: Nest member/host class_info_index N has bad
constant type.

Model them explicitly in the IR, convert on parse and write (resolving
class names through the new pool), and remap their class names during
rename. Add a NestMembers round-trip regression test. Verified on a real
jar: all Nest ClassFormatErrors gone.
2026-10-08 22:26:58 +02:00
crates classfile,passes: model Nest attributes as IR (fix ClassFormatError) 2026-10-08 22:26:58 +02:00
docs Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00
info Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00
scripts Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00
.gitignore Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +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 Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00
README.md Initial commit: noxis JVM bytecode obfuscator 2026-10-08 22:01:03 +02:00

noxis

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

Читает JAR, переписывает классовые файлы и ресурсы, собирает обратно — детерминированно, с маппингами для stack trace и с проверкой, что выход действительно загружается настоящей JVM.

Статус

В работе. Ядро построено, часть техник реализована, часть — по плану.

блок состояние
IR классовых файлов, метки вместо смещений ✅
конфиг, детерминированный PRNG, маппинги, отчёт ✅
анализ: иерархия, entrypoint'ы, keep-правила ✅
переименование всех символов ✅
схемы шифрования строк (salt, nonce, MAC) ✅
JAR: чтение/запись, ресурсы, срез подписей ✅
гейт структурных правил при компиляции ✅
пассы: rename, resources, debug ✅
spike backend'а ristretto_classfile ✅
format::parse/write + кадры StackMapTable ✅
пассы: strings, constants, noise (+ декодер v49) ✅
пасс flow 🚧
верификация и метрики 🚧
CLI 🚧

Подробности — docs/architecture.md, план — todo.md.

Структура

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                             (план)
    └── noxis-structure-check/  автогейт структуры

Быстрый старт

./scripts/check.sh     # fmt + clippy -D warnings + тесты

Одно cargo build уже гоняет проверку структуры проекта: если файл длиннее 250 строк или в директории больше 4 файлов, сборка падает. Правила — в docs/README.md.

Документация

документ что внутри
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 что улучшаем и в каком порядке

Исходный материал разбора — info/README.md.

Принципы

  • KISS / DRY / SOLID. Файл — одна ответственность. Не больше 250 строк, не больше 4 файлов в директории.
  • Детерминированность. Один seed → байт-в-байт одинаковый артефакт.
  • Ничего не ломаем. Техника, которая может дать VerifyError, включается только после верификатора.
  • Измеримо. Защита без метрик — это мнение, а не свойство.

Лицензия

AGPL-3.0-only — см. LICENSE.

Проект остаётся полностью открытым: его можно изучать, использовать (в том числе коммерчески) и изменять. Условие AGPL — любые производные работы, которые распространяются или доступны пользователям по сети, обязаны публиковаться под той же лицензией. Это защищает noxis от закрытых форков, которые перепродают его как готовый продукт.

Сторонние зависимости и их лицензии — в NOTICE.md.

Ответственное использование

noxis — инструмент двойного назначения. Он одинаково полезен для защиты собственного байткода и способен усложнять анализ вредоносного ПО. Лицензия это не регламентирует, но это норма сообщества проекта:

  • используйте обфускацию, чтобы защищать свой код и код тех, кто вас об этом попросил;
  • не применяйте инструмент для упаковки вредоносов, обхода средств защиты и антивирусов или иной деятельности, запрещённой законом.

Нарушение этих норм не влечёт юридических последствий по лицензии, но приведёт к отказу в поддержке и закрытию issue/PR в репозитории.