AfterPack розподіляє свій захист за класами. Кожен клас підвищує ціну відновлення по-своєму. Знаючи, який клас покриває ділянку вашого коду, ви знаєте, що відновить зловмисник, якщо прочитає її. Protection Map розфарбовує кожен токен за його оцінкою складності й називає клас коду, який ви виділили.
Статичний зловмисник: визначення
Це класи для статичного зловмисника. Вони описують, з чим стикається той, хто читає байти: grep, інструменти для AST, прохід деобфускатора або LLM, яка пояснює код, не запускаючи його. Зловмисник, який запускає артефакт з інструментуванням, є окремим, сильнішим випадком; його розглянуто в моделі загроз.
Класи
| Клас | Що відновлює статичний зловмисник | Тариф |
|---|---|---|
| Перейменовано й закодовано (поліноміально-ін'єктивний) | Структуру, ціною зусиль. Імена, літерали, сплощений потік керування та злиті тотожності вимагають реальної роботи з розпізнавання шаблонів. Цю роботу доводиться повторювати на кожній збірці. | Free |
| Сплощено й злито (поліноміально-неін'єктивний) | Еквівалентну програму з тією самою поведінкою. Логіку переписано так, що кілька різних оригінальних обчислень зводяться до одного результату, і зв'язок із тим, яке саме з них написали ви, утрачено. Жодна трансформація, що постачається, сьогодні не досягає цього класу. | — |
Тариф Free створює клас «Перейменовано й закодовано» у всьому вашому бандлі (повна матриця на сторінці «Плани та тарифи»). Вищі пресети посилюють роботу в межах цього класу. Пресет за замовчуванням — light (цільова складність 5); сильніший пресет, наприклад --preset=hard, посилює роботу й у рази збільшує час запуску сторінки в усьому бандлі (ціна завантаження). Починаючи з medium, рушій рівномірно додає в усьому бандлі сплощення потоку керування, злиття тотожностей і знищення констант, усе в межах класу «Перейменовано й закодовано».
Жодна збірка їх не досягає, і жодну ділянку ніколи не віднесено до класу «Сплощено й злито» чи «Знищено й злито». /* @afterpack preset=extreme */ підвищує цільову складність ділянки до 25 з увімкненим мінімальним кодуванням рядків, і це реальний, вимірюваний захист у межах класу «Перейменовано й закодовано».
Що дає зловмиснику відновлення класу
Що клас дає зловмиснику, залежить від того, чого той прагнув.
- Секрет (API-ключ, поріг ліцензії, зашита в код таблиця): жоден клас сам по собі його не приховує. Секрет можна дістати з будь-якої програми, яка поводиться так само, як ваша, зокрема з тієї, що відновлена із захищеної ділянки. Захист секрету потребує іншого механізму. Див. Захист секрету.
- Розуміння та клонування вашого коду: статичний читач може відновити працездатний, читабельний еквівалент, але лише після реальної роботи з розпізнавання шаблонів, якої вимагає клас «Перейменовано й закодовано», і цю роботу доводиться повторювати для кожної збірки. Межі цієї властивості описано в розділі Чого AfterPack не замінює.
- Знайти й пропатчити одну перевірку (вимкнути paywall, перевернути один
return true): жоден клас сам по собі тут мало допомагає. Зловмиснику треба знайти лише цей один вузол. Знайти його знову щось коштує, і ця ціна скидається з кожним релізом. Самоперевірка цілісності (transforms.selfIntegrity.enabled) цього не виявляє: вона помічає зміни лише у власній таблиці перевірок. Про ротацію див. Найкращі практики.
Перевірте на власній збірці
Protection Map показує доказ для кожного токена: ваш оригінальний вихідний код, розфарбований за оцінкою складності кожного токена, із класом і стеком трансформацій за ним при наведенні. Відкрийте живу демонстрацію або згенеруйте власну за допомогою npx afterpack@latest.
Далі
- Модель загроз: драбина супротивників, щодо якої визначено ці класи.
- Protection Map: перегляд по токенах для вашої власної збірки.
- Найкращі практики: що позначати і чому.
- Директиви: маркери, що переміщують ділянку між класами.
- Пресети: драбина і цільова складність, яку задає кожен щабель.