Initial commit: noxis JVM bytecode obfuscator
Workspace of 9 crates (noxis, noxis-core, noxis-classfile, noxis-analysis, noxis-passes, noxis-runtime, noxis-jar, noxis-verify, noxis-structure-check). AGPL-3.0-only license, Rust 2024 edition, unsafe_code denied.
This commit is contained in:
commit
a641e69455
140 changed files with 17197 additions and 0 deletions
68
docs/README.md
Normal file
68
docs/README.md
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
# Документация noxis
|
||||
|
||||
Обфускатор JVM/Java-байткода на Rust. Этот файл — индекс.
|
||||
|
||||
## Что где
|
||||
|
||||
| файл | что внутри |
|
||||
|---|---|
|
||||
| [`architecture.md`](architecture.md) | слои, крейты, собственный IR, конвейер пассов, структурные правила |
|
||||
| [`techniques.md`](techniques.md) | как работает каждая техника + плюсы/минусы/цена |
|
||||
| [`stack.md`](stack.md) | почему свой IR, какой backend, `StackMapTable`, PRNG, генерация рантайма |
|
||||
| [`learnings/lessons.md`](learnings/lessons.md) | уроки из разбора EvoVis: что защита сделала плохо и чего мы не делаем |
|
||||
| [`learnings/reference.md`](learnings/reference.md) | разбор референсного обфускатора (Java/ASM) — что берём, что нет |
|
||||
| [`learnings/priorities.md`](learnings/priorities.md) | что улучшим: стратегия и приоритеты |
|
||||
|
||||
План выполнения — [`../todo.md`](../todo.md). Исходный материал разбора —
|
||||
[`../info/`](../info/README.md).
|
||||
|
||||
## Структурные правила проекта
|
||||
|
||||
Правила действуют на **весь наш код и документацию**: `crates/**` и `docs/**`.
|
||||
Не учитываются: `Cargo.lock`, `.gitignore`, `info/`, корень крейта
|
||||
(в нём всегда лежат `Cargo.toml` + `build.rs`).
|
||||
|
||||
1. **Не больше 250 строк** в одном `.rs` или `.md` файле.
|
||||
2. **Не больше 4 файлов** в одной директории. Подпапки не ограничены:
|
||||
`src/` может содержать `lib.rs` и три модуля-директории, каждая из которых
|
||||
в свою очередь содержит не больше четырёх файлов.
|
||||
|
||||
Проверяются: `crates/*/src`, `crates/*/tests`, `crates/*/benches` и `docs/`.
|
||||
`tests/` и `benches/` не исключены намеренно — иначе правило
|
||||
«250 строк» обходится выносом кода в тесты.
|
||||
|
||||
Правило 2 — это не косметика: файл из тысячи строк означает, что в нём
|
||||
смешаны разные причины к изменению (нарушение KISS/DRY/SOLID), а команда из
|
||||
восьми файлов в одной папке — что модуль перестал быть модулем.
|
||||
|
||||
### Как проверяется
|
||||
|
||||
Правила гоняются **при компиляции**. Каждый крейт имеет `build.rs`:
|
||||
|
||||
```rust
|
||||
fn main() {
|
||||
noxis_structure_check::check();
|
||||
}
|
||||
```
|
||||
|
||||
`noxis-structure-check` находит корень воркспейста, обходит деревья `src/`,
|
||||
`tests/` и `benches/` всех крейтов плюс `docs/`, и **падает со стопкой ошибок**,
|
||||
если лимит нарушен. Поэтому `cargo build` не соберёт нарушение — специально
|
||||
запускать проверку не нужно. Деревья регистрируются через
|
||||
`cargo:rerun-if-changed`, так что правка `docs/` тоже перезапускает гейт.
|
||||
|
||||
Остальное, что не привязано к компиляции, собирается одним скриптом:
|
||||
|
||||
```sh
|
||||
./scripts/check.sh # structure → fmt → clippy -D warnings → test
|
||||
```
|
||||
|
||||
### Что делать при нарушении
|
||||
|
||||
- файл разрослся → разрезать по одной ответственности на файл:
|
||||
`mod.rs` = публичный контракт модуля, соседние файлы — внутренности;
|
||||
- папка переполнилась → завести подпапку и вынести подфункцию целиком,
|
||||
а не «чтобы влезло».
|
||||
|
||||
Каждый модуль получает `mod.rs` с `//!`-документацией — это точка входа,
|
||||
читающаяся вместо пяти файлов.
|
||||
Loading…
Add table
Add a link
Reference in a new issue