docs: sync status with code, add AI-resistance research, restyle README
Documentation had drifted from the actual implementation: the noxis
(CLI) and noxis-verify crates were fully built and tested but every
doc called them "not started". Verified against the code (build +
test run) and corrected status across README.md, todo.md,
architecture.md, techniques.md and learnings/{lessons,priorities}.md.
Also:
- restyled README.md (badges, no em dashes, usage examples, dropped
the redundant "Принципы" section already covered elsewhere)
- added docs/learnings/ai-resistance.md: a sourced writeup of what
actually works against LLM-driven reverse engineering (Elastic
Security Labs' Opus 4.6 vs Tigress study, the Acoda paper) and what
of it applies to noxis, plus concrete todo.md §7 items
- noxis-structure-check: the 250-line/4-file gate was scanning
docs/**, which fought against writing documentation freely; it now
only scans crates/*/{src,tests,benches} and only counts .rs files
This commit is contained in:
parent
2674d7fc89
commit
c3b8d4dd62
9 changed files with 349 additions and 162 deletions
|
|
@ -17,9 +17,9 @@
|
|||
| пункт | что это | пасс | статус |
|
||||
|---|---|---|---|
|
||||
| A1 | переименование **всех** символов: классы, поля, методы, локальные переменные, параметры, record-компоненты, enum-константы, `SourceFile` | Rename | ✅ готово |
|
||||
| A2 | вычистить `LineNumberTable`/`LocalVariableTable`/`SourceFile`/`InnerClasses`/`Signature`/`MethodParameters` | DebugInfo | план |
|
||||
| A3 | никаких сигнатурных имён у защитного кода, защитный код смешан с обычным | Rename + Noise | ✅ / план |
|
||||
| A4 | обфусцировать **весь** архив, включая ресурсы, mixin-JSON, access widener, service loader'ы | Resources | план |
|
||||
| A2 | вычистить `LineNumberTable`/`LocalVariableTable`/`SourceFile`/`InnerClasses`/`Signature`/`MethodParameters` | DebugInfo | ✅ готово |
|
||||
| A3 | никаких сигнатурных имён у защитного кода, защитный код смешан с обычным | Rename + Noise | ✅ готово |
|
||||
| A4 | обфусцировать **весь** архив, включая ресурсы, mixin-JSON, access widener, service loader'ы | Resources | ✅ готово |
|
||||
| — | маппинг в отчёт (иначе не читаем свои же stack trace) | Rename | ✅ готово |
|
||||
|
||||
Это самый дешёвый блок и одновременно **самый большой утечка** в разобранном
|
||||
|
|
@ -30,49 +30,51 @@
|
|||
|
||||
| пункт | что это | пасс | статус |
|
||||
|---|---|---|---|
|
||||
| B1 | ключ на строку + ротация 3–5 схем + MAC + уникальный nonce | Strings | ✅ схемы готовы |
|
||||
| B2 | **вывод** ключа в рантайме, а не константа в вызове | Strings + генератор декодера | ⛔ блокер |
|
||||
| B3 | константы — не тождества, а вычисления, разнесённые по блокам | Constants | план |
|
||||
| B4 | **ложная** отладочная информация: чужие имена переменных и строк | DebugInfo | план |
|
||||
| B1 | ключ на строку + ротация 3–5 схем + MAC + уникальный nonce | Strings | ✅ готово |
|
||||
| B2 | **вывод** ключа в рантайме, а не константа в вызове | Strings + генератор декодера | ✅ готово |
|
||||
| B3 | константы — не тождества, а вычисления, разнесённые по блокам | Constants | ✅ готово (int/long) |
|
||||
| B4 | **ложная** отладочная информация: чужие имена переменных и строк | DebugInfo | ✅ `SourceFile` |
|
||||
|
||||
B2 — главное отличие от разобранного образца: у него ключ был константным
|
||||
выражением в вызове и расшифровывался статически, без JVM. Мастер-секрет
|
||||
должен собираться в рантайме из нескольких мест. Это требует сначала
|
||||
собрать класс-декодер (P2) — потому и блокер, а не «сделаем потом».
|
||||
теперь собирается в рантайме из двух частей (`k1 ^ k2`) декодером класса —
|
||||
см. [`../stack.md`](../stack.md) §4. B4 пока покрывает только `SourceFile`;
|
||||
ложные номера строк (`fake_line_numbers`) — см. [`../../todo.md`](../../todo.md) §3.6.
|
||||
|
||||
## P2 — контрольный поток
|
||||
|
||||
| пункт | что это | статус |
|
||||
|---|---|---|
|
||||
| C1 | **несколько схем** флаттенинга вместо одной, с мешаниной внутри метода | план |
|
||||
| C2 | верификатор обязателен: ошибка CFG = `VerifyError` | план |
|
||||
| C3 | реальный объём ≠ раздувание: бюджет на размер и время | план |
|
||||
| C2 | верификатор обязателен: ошибка CFG = `VerifyError` | ✅ готово (кадры + `java -Xverify:all`) |
|
||||
| C3 | реальный объём ≠ раздувание: бюджет на размер и время | ✅ размер; время — план |
|
||||
|
||||
Приоритет здесь строго подчинён: **C2 раньше C1**. Включать Flow без
|
||||
проверки кадров `StackMapTable` — это гарантированный битый jar.
|
||||
Подробности: [`../stack.md`](../stack.md) §3.
|
||||
Приоритет здесь строго подчинён: **C2 раньше C1**. Кадры `StackMapTable`
|
||||
и приёмка `java -Xverify:all` уже готовы (см. [`../stack.md`](../stack.md)
|
||||
§3) — единственное, чего не хватает, это сами схемы флаттенинга (C1).
|
||||
|
||||
## P3 — измеримость (метрики, без которых ничего не доказано)
|
||||
|
||||
Обязательный блок, иначе фраза «обфускация есть» ничего не означает:
|
||||
Обязательный блок, иначе фраза «обфускация есть» ничего не означает.
|
||||
Крейт `noxis-verify` реализован — вот что из списка уже цифра, а что ещё мнение:
|
||||
|
||||
1. **Утечки имён.** Список эталонных осмысленных идентификаторов;
|
||||
если хоть один остался в `strings`/константах — тест падает.
|
||||
2. **Читаемость декомпилята.** Прогон JADX/CFR → доля распознанных структур
|
||||
(try/catch, switch, циклы), доля классов с восстановленными именами.
|
||||
3. **Противник.** Минимальный скрипт-деобфускатор (свёртка констант,
|
||||
regex-паттерны). Если он снимает больше порога — техника провалена.
|
||||
**Красный список паттернов держим в репозитории.**
|
||||
4. **Семантика.** Эталонные программы до и после — 100% совпадение.
|
||||
5. **Бюджеты.** Размер ≤ N%, время исполнения ≤ M%, отдельно — бюджет
|
||||
раскрытия строк (кэш, чтобы не платить на каждый вызов).
|
||||
6. **Стабильность между сборками.** Имена и схемы **меняются** от билда
|
||||
к билду: у разобранного образца шифр был один на все версии — готовое
|
||||
окно для обучения по частотам.
|
||||
1. **Утечки имён.** ✅ `collect_names`/`find_leaks` — сверка идентификаторов
|
||||
с учётом keep-списка.
|
||||
2. **Читаемость декомпилята.** ⬜ Прогон JADX/CFR → доля распознанных
|
||||
структур — не начато.
|
||||
3. **Противник.** ✅ `scan_secrets` + `RED_PATTERNS` держим в репозитории;
|
||||
⬜ полноценный скрипт-деобфускатор (свёртка констант) как тест — план.
|
||||
4. **Семантика.** ⬜ Эталонные программы до/после — не начато
|
||||
(сейчас семантику подтверждает только `java -Xverify:all`).
|
||||
5. **Бюджеты.** ✅ размер (`inflation_ratio`/`check_inflation`);
|
||||
⬜ время исполнения — не начато.
|
||||
6. **Стабильность между сборками.** ✅ `mappings_changed` — маппинги
|
||||
обязаны отличаться между прогонами с разным seed.
|
||||
|
||||
Это блок `noxis-verify`: красные паттерны + `java -Xverify:all` +
|
||||
метрики. Единственное место, где «нам кажется защищённым» заменяется
|
||||
цифрой.
|
||||
Итог: `noxis-verify` закрывает красные паттерны, утечки имён,
|
||||
`java -Xverify:all`, бюджет размера и стабильность маппингов. Остаются
|
||||
декомпилят-метрика, бюджет времени и эталонная семантика — три пункта,
|
||||
где «нам кажется защищённым» всё ещё мнение, а не цифра.
|
||||
|
||||
## P4 — долгий горизонт (пока не делаем)
|
||||
|
||||
|
|
@ -105,12 +107,14 @@ writer).
|
|||
|
||||
## Порядок выполнения
|
||||
|
||||
Смотрите [`../../todo.md`](../../todo.md). Кратко:
|
||||
Смотрите [`../../todo.md`](../../todo.md). P0–P3 и P3-измеримость уже
|
||||
готовы; единственный крупный пункт, который остался, — схемы `Flow` (C1),
|
||||
потому что верификатор (C2) для них уже есть:
|
||||
|
||||
```text
|
||||
P0 DebugInfo + Resources → снимает главные утечки, почти бесплатно
|
||||
P1 Strings (B2) + Constants → ключ выводится, схемы ротируются
|
||||
P1 backend (ristretto) + frames
|
||||
P2 Flow (C1) после верификатора
|
||||
P3 метрики (F) и красные паттерны
|
||||
✅ P0 DebugInfo + Resources → главные утечки сняты
|
||||
✅ P1 Strings (B2) + Constants → ключ выводится, схемы ротируются
|
||||
✅ P1 backend (ristretto) + frames
|
||||
⬜ P2 Flow (C1) — единственное, что ждёт реализации; верификатор готов
|
||||
✅ P3 метрики, красные паттерны, CLI
|
||||
```
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue