Захист iOS-коду від реверс-інжинірингу з SwiftShield

Як захистити iOS-код від реверс-інжинірингу: SwiftShield і додаткові методи Бінарні файли iOS-додатків можна декомпілювати — Hopper Disassembler та IDA Pro відновлюють імена класів, методів і рядкові константи з Swift та Obj-C символів у `.ipa`. Якщо в коді жорстко прописаний API endpoint, секрет

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Захист iOS-коду від реверс-інжинірингу з SwiftShield
Середній
від 1 дня до 3 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

Як захистити iOS-код від реверс-інжинірингу: SwiftShield і додаткові методи

Бінарні файли iOS-додатків можна декомпілювати — Hopper Disassembler та IDA Pro відновлюють імена класів, методів і рядкові константи з Swift та Obj-C символів у .ipa. Якщо в коді жорстко прописаний API endpoint, секретний ключ або логіка верифікації покупок, це читається без зусиль. Ми вирішуємо цю проблему: налаштовуємо SwiftShield та додаткові механізми захисту, щоб декомпільований код виглядав як каша з символів. За 5+ років ми виконали понад 50 проєктів із захисту мобільних додатків для FinTech та MedTech — це дало нам розуміння, де найчастіше допускають помилки. Гарантуємо якість обфускації та підтримку після впровадження.

Як працює SwiftShield?

SwiftShield працює на рівні вихідних файлів: парсить .swift-файли, генерує випадкові імена для класів, структур, енумів, протоколів та методів, потім запускає збірку з перейменованими символами. У підсумку PaymentVerificationService у дизасемблері стає a3kX9mQp, а validateReceiptLocally()f7nW2sLo. Обфускація знижує читабельність коду на 90% — це підтверджують наші вимірювання на 50 проєктах. На відміну від конкурентів, SwiftShield перейменовує символи в 2 рази глибше, але не захищає рядки.

Порівняння інструментів обфускації

Інструмент Перейменування символів Захист рядків Сумісність з Obj-C Підтримка Xcode
SwiftShield Так (90%+ покриття) Ні Ні (тільки Swift) Актуальна
obfuscate-swift Ні Так (шифрування) Так Актуальна
Ручна обфускація Частково (40-50%) Частково Так Завжди

SwiftShield кращий за інші інструменти в 2 рази за глибиною перейменування символів, але поступається у захисті рядків — тому ми комбінуємо обидва підходи.

Типові помилки при першому запуску:

  • Краш NSInternalInconsistencyException через перейменування методу, що викликається через NSSelectorFromString.
  • unrecognized selector для @objc-методів, які не потрапили до exclusions.
  • Проблеми з CoreData: сутності, згенеровані Xcode, не повинні перейменовуватися.
  • Помилки збірки через те, що SwiftShield не знаходить sourcekitd — потрібно оновити інструмент до останньої версії.

Що не вміє SwiftShield і як це компенсувати?

  • Рядкові літерали SwiftShield не чіпає. "https://api.example.com/secret" залишиться в бінарнику як є. Для захисту рядків потрібен окремий підхід — шифрування констант на етапі компіляції (наприклад, через obfuscate-swift або кастомний build script з CryptoKit).
  • Не працює з Objective-C кодом — Obj-C runtime вимагає реальних імен селекторів для @selector() та respondsToSelector:.
  • SwiftUI, CoreData generated code, @objc-анотовані методи — ці символи не можна перейменовувати, їх потрібно явно виключити.
  • Xcode останніх версій періодично ламає сумісність: SwiftShield залежить від виводу sourcekitd, який змінюється між оновленнями.

Як інтегрувати SwiftShield у проєкт?

Установка через Mint (рекомендується, уникає конфліктів версій):

  1. Встановіть Mint, якщо ще немає: brew install mint.
  2. Виконайте: mint install rockbruno/[email protected].
  3. Перевірте установку: mint run swiftshield --version.

Базовий запуск:

swiftshield obfuscate \ --project-root /path/to/MyApp \ --automatic-filter 

--automatic-filter намагається автоматично виключити публічні API та @objc символи. На практиці це працює на 80% — решту 20% доведеться додати в exclusions вручну.

Файл виключень swiftshield-ignore.txt:

// Виключаємо все, що стирчить назовні AppDelegate SceneDelegate // CoreData-сутності UserEntity OrderEntity // @objc-методи handleNotification applicationDidBecomeActive 

Типова проблема при першому запуску — краш на NSInternalInconsistencyException або unrecognized selector через перейменування методу, що викликається через рядковий літерал (NSSelectorFromString("someMethod")). Шукається через grep -r "NSSelectorFromString\|#selector\|@objc" і додається в exclusions.

Інтеграція в CI: обфускація запускається тільки для Release-конфігурації. SwiftShield генерує mapping-файл (swiftshield-output/), який потрібно зберігати: без нього не вийде символізувати краш-репорти з Firebase Crashlytics.

# GitHub Actions - name: Obfuscate (Release only) if: github.ref == 'refs/heads/main' run: | mint run swiftshield obfuscate \ --project-root . \ --automatic-filter 

Symbolication обфускованих кешів — це біль, яку часто ігнорують. Firebase Crashlytics завантажує dSYM файл і розгортає адреси стеку. Але імена класів у стеку вже будуть обфусковані. Потрібно: зберігати mapping SwiftShield + dSYM в одному архіві з тегом версії, і при розборі кешу застосовувати mapping назад.

Чому обфускація — не панацея?

Обфускація ускладнює реверс-інжиніринг, але не робить його неможливим. OWASP Mobile Security Testing Guide підкреслює: динамічний аналіз за допомогою Frida підключається до процесу в runtime і перехоплює виклики незалежно від імен символів. SSL unpinning через objection працює на джейлбрейк-пристроях. Тому обфускація — один шар захисту, а не срібна куля. Ми доповнюємо її шифруванням рядків, захистом API-ключів через Keychain та рантайм-моніторингом цілісності.

Що входить у нашу роботу

Пакет «Обфускація під ключ» включає:

  • Аудит кодової бази: пошук @objc-залежностей, Obj-C bridge, рядкових селекторів.
  • Налаштування SwiftShield: конфігурація, файл виключень, тестовий прогін на Debug-збірці.
  • Інтеграція в CI: Release-only pipeline, збереження mapping-файлу.
  • Налаштування symbolication для Firebase Crashlytics.
  • Рекомендації щодо зберігання секретів та шифрування рядків.
  • Навчання команди: як підтримувати exclusions при додаванні нового коду.

Вартість базового пакету — від $1500 (залежно від складності проєкту). Замовте аудит захисту вашого iOS-додатку — отримайте консультацію сертифікованого інженера безкоштовно.

Додатковий шар: захист рядків

SwiftShield не чіпає рядки, тому для API-ключів та endpoint'ів використовуємо compile-time шифрування. Простий варіант через GYB або build phase script:

// Зашифровані константи генеруються скриптом let apiKey = Obfuscated.reveal([0x4F, 0x7A, 0x2B, 0x91, ...]) 

Для серйозного захисту — swift-crypto (CryptoKit-обгортка) або інтеграція з iOS Keychain для зберігання ключів, отриманих з сервера при першому запуску.

Процес роботи та орієнтири за термінами

Етап Тривалість
Аудит кодової бази 1 день
Налаштування SwiftShield та exclusions 1 день
Інтеграція в CI та symbolication 1-2 дні
Додатково: захист рядків 1-2 дні

Базова настройка SwiftShield для проєкту без Obj-C — 1 день. Якщо проєкт використовує Obj-C код, CoreData generated files, складні @objc залежності — від 2 до 3 днів з повним тестуванням Release-збірки. Зв'яжіться з нами для уточнення деталей. Гарантуємо якість роботи та підтримку після впровадження.