# Що може відновити зловмисник (класи відновлення)

Класи для статичного зловмисника, до яких належать трансформації AfterPack, і що зловмисник отримує, відновивши кожен із них.

Source: https://www.afterpack.dev/uk/docs/reversal-classes

AfterPack розподіляє свій захист за класами. Кожен клас підвищує ціну відновлення по-своєму. Знаючи, який клас покриває [ділянку](https://www.afterpack.dev/uk/docs/directives#what-you-can-set) вашого коду, ви знаєте, що відновить зловмисник, якщо прочитає її. [Protection Map](https://www.afterpack.dev/uk/docs/protection-map) розфарбовує кожен токен за його оцінкою складності й називає клас коду, який ви виділили.

## Статичний зловмисник: визначення

Це класи для **статичного зловмисника**. Вони описують, з чим стикається той, хто читає байти: grep, інструменти для AST, прохід деобфускатора або LLM, яка пояснює код, не запускаючи його. Зловмисник, який запускає артефакт з інструментуванням, є окремим, сильнішим випадком; його розглянуто в [моделі загроз](https://www.afterpack.dev/uk/docs/threat-model).

*(interactive reversal-classes diagram — see the web page)*

## Класи

| Клас | Що відновлює статичний зловмисник | Тариф |
|---|---|---|
| **Перейменовано й закодовано** (поліноміально-ін'єктивний) | Структуру, ціною зусиль. Імена, літерали, сплощений потік керування та злиті тотожності вимагають реальної роботи з розпізнавання шаблонів. Цю роботу доводиться повторювати на [кожній збірці](https://www.afterpack.dev/uk/docs/config#seed). | Free |
| **Сплощено й злито** (поліноміально-неін'єктивний) | Еквівалентну програму з [тією самою поведінкою](https://www.afterpack.dev/uk/docs/semantic-contract). Логіку переписано так, що кілька різних оригінальних обчислень зводяться до одного результату, і зв'язок із тим, яке саме з них написали ви, утрачено. Жодна трансформація, що постачається, сьогодні не досягає цього класу. | — |

Тариф Free створює клас «Перейменовано й закодовано» у всьому вашому бандлі ([повна матриця на сторінці «Плани та тарифи»](https://www.afterpack.dev/uk/docs/tiers)). Вищі [пресети](https://www.afterpack.dev/uk/docs/presets) посилюють роботу в межах цього класу. Пресет за замовчуванням — `light` ([цільова складність](https://www.afterpack.dev/uk/docs/config#complexity) `5`); сильніший пресет, наприклад [`--preset=hard`](https://www.afterpack.dev/uk/docs/config#preset), посилює роботу й у рази збільшує час запуску сторінки в усьому бандлі ([ціна завантаження](https://www.afterpack.dev/uk/docs/presets#load-cost)). Починаючи з `medium`, рушій рівномірно додає в усьому бандлі сплощення потоку керування, злиття тотожностей і [знищення констант](https://www.afterpack.dev/uk/docs/config#strings-encode), усе в межах класу «Перейменовано й закодовано».

> **«Сплощено й злито» та «Знищено й злито» сьогодні не створюються**
>
> Жодна збірка їх не досягає, і жодну ділянку ніколи не віднесено до класу «Сплощено й злито» чи «Знищено й злито». [`/* @afterpack preset=extreme */`](https://www.afterpack.dev/uk/docs/config#preset) підвищує [цільову складність](https://www.afterpack.dev/uk/docs/config#complexity) ділянки до `25` з увімкненим [мінімальним кодуванням рядків](https://www.afterpack.dev/uk/docs/config#strings-encode), і це реальний, вимірюваний захист у межах класу «Перейменовано й закодовано».

## Що дає зловмиснику відновлення класу

Що клас дає зловмиснику, залежить від того, чого той прагнув.

- **Секрет** (API-ключ, поріг ліцензії, зашита в код таблиця): жоден клас сам по собі його не приховує. Секрет можна дістати з будь-якої програми, яка поводиться так само, як ваша, зокрема з тієї, що відновлена із захищеної ділянки. Захист секрету потребує іншого механізму. Див. [Захист секрету](https://www.afterpack.dev/uk/docs/threat-model#protecting-a-secret).
- **Розуміння та клонування вашого коду**: статичний читач може відновити працездатний, читабельний еквівалент, але лише після реальної роботи з розпізнавання шаблонів, якої вимагає клас «Перейменовано й закодовано», і цю роботу доводиться повторювати для кожної збірки. Межі цієї властивості описано в розділі [Чого AfterPack не замінює](https://www.afterpack.dev/uk/docs/threat-model#what-afterpack-does-not-replace).
- **Знайти й пропатчити одну перевірку** (вимкнути paywall, перевернути один `return true`): жоден клас сам по собі тут мало допомагає. Зловмиснику треба знайти лише цей один вузол. Знайти його знову щось коштує, і ця ціна [скидається з кожним релізом](https://www.afterpack.dev/uk/docs/config#seed). Самоперевірка цілісності ([`transforms.selfIntegrity.enabled`](https://www.afterpack.dev/uk/docs/config#transforms-kind-enabled)) цього не виявляє: вона помічає зміни лише у власній таблиці перевірок. Про ротацію див. [Найкращі практики](https://www.afterpack.dev/uk/docs/best-practices).

## Перевірте на власній збірці

[Protection Map](https://www.afterpack.dev/uk/docs/protection-map) показує доказ для кожного токена: ваш оригінальний вихідний код, розфарбований за оцінкою складності кожного токена, із класом і стеком трансформацій за ним при наведенні. [Відкрийте живу демонстрацію](https://www.afterpack.dev/protection-map-demo) або згенеруйте власну за допомогою [`npx afterpack@latest`](https://www.afterpack.dev/uk/docs/cli#usage).

## Далі

- [Модель загроз](https://www.afterpack.dev/uk/docs/threat-model): драбина супротивників, щодо якої визначено ці класи.
- [Protection Map](https://www.afterpack.dev/uk/docs/protection-map): перегляд по токенах для вашої власної збірки.
- [Найкращі практики](https://www.afterpack.dev/uk/docs/best-practices): що позначати і чому.
- [Директиви](https://www.afterpack.dev/uk/docs/directives): маркери, що переміщують ділянку між класами.
- [Пресети](https://www.afterpack.dev/uk/docs/presets): драбина і цільова складність, яку задає кожен щабель.
