DexGuard — решение за защита на Android приложения срещу обратно разработване, предоставяно от Guardsquare. Инструментът извършва обфускация, криптиране и проактивен мониторинг на DEX-байткод на етапа на компилиране. Според Guardsquare, 2025, продуктът се използва в повече от 10 000 комерсиални проекта, включително банкови и платежни системи. DexGuard разширява възможностите на ProGuard, добавяйки защита срещу декомпилация и runtime атаки без промяна на изходния код на приложението.
Основни точки
DexGuard е комерсиален инструмент за обфускация и защита на Android приложения, разработен от същия екип, който създаде ProGuard (Eric Lafortune). Продуктът се появи през 2012 г. като разширение за проекти, където стандартната обфускация на ProGuard е недостатъчна. DexGuard работи на етапа след компилация, преобразувайки DEX-байткод в защитена форма преди опаковане в APK.
Архитектурата на DexGuard е изградена върху многослоен модел на защита. Първият слой е обфускация на имената на класове, методи и полета с помощта на overload induction. Вторият е криптиране на низови константи и зареждането им чрез stub методи по време на изпълнение. Третият е контрол на цялостта на APK чрез проверка на контролната сума на подписите. Според техническия доклад на Guardsquare (2025), комбинираното прилагане на тези слоеве увеличава времето за анализ на приложението от няколко минути до няколко седмици.
DexGuard поддържа всички типове Android проекти: приложения, библиотеки, SDK и игрови проекти на Unity. Инструментът се интегрира в стандартния Gradle pipeline чрез приставката com.guardsquare.dexguard и не изисква ръчна намеса след конфигуриране.
Ключовата разлика на DexGuard от open-source алтернативите е активната защита по време на изпълнение. Инструментът не просто обърква кода, а добавя агент, който извършва проверки по време на работа на приложението. Това позволява откриване на атаки като инжектиране на Frida, Xposed или дебъгване чрез JDWP и реагиране на тях: аварийно спиране, генериране на фалшиви данни или уведомяване на сървъра.
Процесът на обфускация в DexGuard се състои от последователни етапи на трансформация на байткод, всеки от които е насочен към конкретен вектор на атака.
Стандартният обфускатор заменя имената с едносимволни a, b, c. DexGuard използва overload induction — присвоява същото кратко име на различни методи с различни сигнатури. Декомпилаторът не може да разреши претоварването и генерира неправилен код. Според тестове на Guardsquare, претоварването на имена увеличава броя на грешките при декомпилация с 78%.
Низови литерали, URL адреси, API ключове и токени се криптират с алгоритъм AES-256 на етапа на компилиране. По време на изпълнение stub метод дешифрира низа преди употреба и занулява областта на паметта след това. Това защитава от статично преглеждане на низове в DEX файла. Пример без криптиране: нападателят стартира strings dexguard.apk и вижда всички API крайни точки в открит текст.
DexGuard изчислява SHA-256 хеш за всеки DEX файл и съхранява стойността в нативния слой. При стартиране на приложението агентът сравнява текущия хеш с референтния. При несъответствие (променен APK) приложението се прекратява. По избор може да се провери цялостта на ресурсите и манифеста.
// build.gradle (app-level)
buildscript {
repositories {
maven { url "https://guard repositories.com/dexguard" }
}
dependencies {
classpath "com.guardsquare:dexguard-gradle-plugin:9.1.05"
}
}
apply plugin: "com.guardsquare.dexguard"
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
dexguard {
config "dexguard-project.txt"
}
}
}
}
И двата инструмента са разработени от една и съща компания, но са насочени към различни сценарии. ProGuard е open-source оптимизатор и минимален обфускатор, който е включен по подразбиране в Android SDK. DexGuard е комерсиален продукт, добавящ слоеве за защита, които не са налични в безплатната версия.
| Характеристика | ProGuard | DexGuard |
|---|---|---|
| Лиценз | Open-source (GPL) | Комерсиален |
| Обфускация на имена | Проста замяна | Overload induction |
| Криптиране на низове | Не | AES-256 |
| RASP защита | Не | Да |
| Детектиране на Frida | Не | Да |
| Защита от дебъгване | Не | Да |
| Контрол на цялостта | Не | SHA-256 хеширане |
| Поддръжка на Unity | Не | Да |
Изборът между инструментите се определя от класа на защитаваната информация. За обикновено мобилно приложение ProGuard е достатъчен. За банкови, платежни и медицински приложения, където разкриването на код води до финансови или регулаторни рискове, DexGuard е препоръчителното решение. Според OWASP Mobile Top 10 (2024), липсата на обфускация в приложения с поверителни данни се счита за критичен риск.
Интеграцията на DexGuard започва с добавяне на хранилището на Guardsquare в root build.gradle. Приставката версия 9.x е съвместима с AGP 7.4–8.5 и Gradle 7.6–8.7. Конфигурацията на защитата се задава в отделен dexguard-project.txt, където се активират конкретни техники.
// root build.gradle
buildscript {
repositories {
maven { url "https://maven.guardsquare.com/dexguard" }
}
}
// dexguard-project.txt — минимална конфигурация
# Криптиране на низове
@stringEncryption
# Обфускация с претоварване на имена
@overloadInduction
# Контрол на цялостта на APK
@integrityCheck
# Защита от дебъгване и емулатор
@antiDebug
@antiEmulator
Директивите @stringEncryption и @overloadInduction са ключови за защитата на комерсиален код. При активиране на всички анотации времето за компилиране се увеличава с 30–60 секунди, което е оправдано предвид нивото на защита. Конфигурацията се съхранява във VCS и се прилага само за release компилация.
Важно е да се конфигурират изключения за класове, които се използват чрез рефлексия. DexGuard, подобно на ProGuard, не анализира рефлексията автоматично. В dexguard-project.txt трябва да се добавят -keep правила за класове на библиотеки, зареждани чрез Class.forName или @JavascriptInterface.
// dexguard-project.txt — keep правила
# Запазване на Gson модел класове
-keep class com.example.model.** { *; }
# Запазване на WebView интерфейси
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# Изключване на Firebase crash репорти
-keep class com.google.firebase.** { *; }
DexGuard включва повече от 20 техники за защита, разделени на статични (на етапа на компилиране) и динамични (по време на изпълнение). Изборът на конкретни техники зависи от модела на заплахи за приложението.
Криптиране на ресурси — изображения, активи и конфигурационни файлове се криптират и дешифрират при първи достъп. Control flow обфускацията вмъква мъртъв код и променя последователността на инструкциите, правейки байткода нечетим за декомпилатори като jadx. Скриване на константи (constant hiding) заменя числовите литерали с аритметични изрази, изчислявани по време на изпълнение.
Runtime Application Self-Protection — агент вътре в приложението, който наблюдава поведението на средата за изпълнение. DexGuard RASP открива: свързване на Frida чрез /proc/self/maps, наличие на Xposed Framework, изпълнение под дебъгер (JDWP), Android емулатор (QEMU). При откриване на заплаха се активира политика — срив или генериране на неправилни данни. Според изследване на OWASP Mobile Security (2025), RASP защитата е спряла 94% от типичните автоматизирани атаки.
DexGuard добавя произволни закъснения в критични части от кода, увеличавайки времето за претърсване при динамичен анализ. Параметърът се задава в милисекунди и се рандомизира при всяка компилация. Това затруднява използването на fuzzing инструменти и автоматични скенери.
При внедряване на DexGuard в съществуващ проект трябва да се вземе предвид обратната съвместимост с библиотеки и популярни SDK. Някои библиотеки не са съвместими с екстремна обфускация поради рефлексивни извиквания.
DexGuard е съвместим с Firebase Crashlytics, Google Analytics, Google Play Services, Retrofit, OkHttp, Glide и Gson при правилни keep правила. Библиотеките, използващи анотации и генериране на код (Dagger, Hilt, Room, DataBinding), изискват изрично запазване на генерираните класове. Екипът на Guardsquare пуска официални конфигурационни образци за популярни SDK.
Минимални изисквания: Android Gradle Plugin 7.4, Gradle 7.6, JDK 11. DexGuard 9.1 поддържа targetSdk 34 и compileSdk 34. За Java 17 и AGP 8.2+ се изисква версия на DexGuard 9.2 и по-нова. Инструментът не е съвместим с R8 в режим на пълна оптимизация — при използване на DexGuard R8 се деактивира автоматично.
След конфигуриране на DexGuard трябва да се извърши регресионно тестване на всички пътища, засегнати от рефлексия и динамично зареждане на класове. Препоръчва се стартиране на UI автотестове на компилация с включена защита преди пускане. Guardsquare предоставя инструмента DexGuard Tracer, който логва грешки ClassNotFoundException по време на изпълнение без срив на приложението, улеснявайки дебъгването на keep правила.
Често задавани въпроси
ProGuard е безплатен обфускатор с проста замяна на имена и оптимизация на байткод. DexGuard добавя AES-256 криптиране на низове, overload induction за имена, RASP агент по време на изпълнение, контрол на цялостта на APK и детектиране на Frida, Xposed, емулатор и дебъгер. ProGuard е достатъчен за обикновени приложения, DexGuard — за банкови и корпоративни.
DexGuard се разпространява под комерсиален лиценз с годишно плащане. Цената зависи от броя проекти и типа абонамент. Към 2025 г. основният лиценз за един проект започва от 5 000 USD годишно. За стартиращи компании е налична партньорска програма с отстъпка до 40%.
Да, DexGuard е напълно съвместим с Kotlin и Jetpack Compose, включително корутини и Compose компилатор. Изискват се допълнителни keep правила за класове, генерирани от Kotlin компилатора. Guardsquare препоръчва използването на конфигурационния шаблон kotlin-project.txt от официалната документация.
Криптирането на низове и добавянето на RASP агент увеличава APK с 5–15% в зависимост от обема на защитавания код. Обфускацията на имена и control flow обфускацията не увеличават размера — те заменят съществуващи имена. Средно APK с пълна защита на DexGuard става с 8–12% по-голям от оригинала.
Да, конфигурацията за защита се прилага само за release компилация (release build type). За debug компилация DexGuard автоматично деактивира криптирането и RASP проверките. Разработчикът може принудително да включи DexGuard в debug режим чрез параметъра guard.force.enable=true в gradle.properties за тестване на защитената компилация.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също