DexGuard — o soluție pentru protejarea aplicațiilor Android împotriva ingineriei inverse, furnizată de Guardsquare. Instrumentul efectuează ofuscare, criptare și monitorizare proactivă a DEX-bytecodului în faza de compilare. Conform datelor Guardsquare, 2025, produsul este utilizat în peste 10 000 de proiecte comerciale, inclusiv sisteme bancare și de plată. DexGuard extinde capacitățile ProGuard, adăugând protecție împotriva decompilării și atacurilor runtime fără a modifica codul sursă al aplicației.
Principalele aspecte
DexGuard este un instrument comercial pentru ofuscarea și protejarea aplicațiilor Android, dezvoltat de aceeași echipă care a creat ProGuard (Eric Lafortune). Produsul a apărut în 2012 ca o extensie pentru proiecte unde ofuscarea standard ProGuard este insuficientă. DexGuard funcționează în faza post-compilare, transformând DEX-bytecodul într-o formă protejată înainte de ambalarea APK.
Arhitectura DexGuard este construită pe un model de protecție pe mai multe niveluri. Primul nivel — ofuscarea numelor claselor, metodelor și câmpurilor utilizând supraîncărcarea numelor (overload induction). Al doilea — criptarea constantelor șirurilor și încărcarea lor prin metode stub în runtime. Al treilea — controlul integrității APK prin verificarea sumei de control a semnăturilor. Conform raportului tehnic Guardsquare (2025), aplicarea combinată a acestor niveluri crește timpul de analiză a aplicației de la câteva minute la câteva săptămâni.
DexGuard suportă toate tipurile de proiecte Android: aplicații, biblioteci, SDK și proiecte de jocuri Unity. Instrumentul se integrează în pipeline-ul standard Gradle prin pluginul com.guardsquare.dexguard și nu necesită intervenție manuală după configurare.
Diferența cheie dintre DexGuard și analogii open-source — protecția activă în runtime. Instrumentul nu doar ascunde codul, ci adaugă un agent care efectuează verificări în timpul funcționării aplicației. Acest lucru permite detectarea atacurilor precum injectarea Frida, Xposed sau debugging prin JDWP și reacția la ele: terminare de urgență, generarea de date false sau notificarea serverului.
Procesul de ofuscare în DexGuard constă în etape succesive de transformare a bytecodului, fiecare vizând un vector specific de atac.
Ofusctorul standard înlocuiește numele cu a, b, c de un singur caracter. DexGuard utilizează overload induction — atribuie același nume scurt unor metode diferite cu semnături diferite. Decompilatorul nu poate rezolva supraîncărcarea și generează cod incorect. Conform testelor Guardsquare, supraîncărcarea numelor crește numărul de erori de decompilare cu 78%.
Literalii de șir, URL-urile, cheile API și tokenurile sunt criptate cu algoritmul AES-256 în faza de compilare. În runtime, metoda stub decriptează șirul înainte de utilizare și șterge zona de memorie după. Aceasta protejează împotriva vizualizării statice a șirurilor în fișierul DEX. Exemplu de rezultat fără criptare: atacatorul rulează strings dexguard.apk și vede toate endpointurile API în formă deschisă.
DexGuard calculează hash SHA-256 pentru fiecare fișier DEX și salvează valoarea în stratul nativ. La pornirea aplicației, agentul compară hashul curent cu cel de referință. În caz de discrepanță (APK modificat), aplicația se încheie. Suplimentar, se poate configura verificarea integrității resurselor și manifestului.
// build.gradle (nivelul aplicației)
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"
}
}
}
}
Ambele instrumente sunt dezvoltate de aceeași companie, dar au scopuri diferite. ProGuard — optimizator open-source și ofusctor minimal care este inclus implicit în Android SDK. DexGuard — produs comercial care adaugă niveluri de protecție indisponibile în versiunea gratuită.
| Caracteristică | ProGuard | DexGuard |
|---|---|---|
| Licență | Open-source (GPL) | Comercială |
| Ofuscarea numelor | Înlocuire simplă | Overload induction |
| Criptarea șirurilor | Nu | AES-256 |
| Protecția RASP | Nu | Da |
| Detectarea Frida | Nu | Da |
| Protecția la debugging | Nu | Da |
| Controlul integrității | Nu | Hash SHA-256 |
| Suport Unity | Nu | Da |
Alegerea între instrumente este determinată de clasa informațiilor protejate. Pentru o aplicație mobilă obișnuită, ProGuard este suficient. Pentru aplicații bancare, de plată și medicale, unde dezvăluirea codului implică riscuri financiare sau de reglementare, DexGuard este soluția recomandată. Conform OWASP Mobile Top 10 (2024), lipsa ofuscării în aplicațiile cu date confidențiale este considerată un risc critic.
Integrarea DexGuard începe cu conectarea depozitului Guardsquare în build.gradle rădăcină. Pluginul versiunii 9.x este compatibil cu AGP 7.4–8.5 și Gradle 7.6–8.7. Configurația protecției se stabilește în fișierul separat dexguard-project.txt, unde se activează tehnici specifice.
// build.gradle rădăcină
buildscript {
repositories {
maven { url "https://maven.guardsquare.com/dexguard" }
}
}
// dexguard-project.txt — configurație minimă
# Criptarea șirurilor
@stringEncryption
# Ofuscarea cu supraîncărcarea numelor
@overloadInduction
# Controlul integrității APK
@integrityCheck
# Protecția împotriva debuggerului și emulatorului
@antiDebug
@antiEmulator
Directivele @stringEncryption și @overloadInduction sunt cheie pentru protejarea codului comercial. La activarea tuturor adnotărilor, timpul de compilare crește cu 30–60 de secunde, ceea ce este justificat de nivelul de protecție. Configurația este stocată în VCS și se aplică doar pentru buildul de release.
Este important să configurați excepții pentru clasele utilizate prin reflecție. DexGuard, la fel ca ProGuard, nu analizează reflecția automat. În dexguard-project.txt trebuie adăugate reguli -keep pentru clasele bibliotecilor încărcate prin Class.forName sau @JavascriptInterface.
// dexguard-project.txt — reguli keep
# Păstrează clasele model Gson
-keep class com.example.model.** { *; }
# Păstrează interfețele WebView
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# Exclude rapoartele de crash Firebase
-keep class com.google.firebase.** { *; }
DexGuard include peste 20 de tehnici de protecție, împărțite în statice (în faza de compilare) și dinamice (în runtime). Alegerea tehnicilor specifice depinde de modelul de amenințări al aplicației.
Criptarea resurselor — imaginile, activele și fișierele de configurare sunt criptate și decriptate la prima accesare. Ascunderea fluxului de control (control flow obfuscation) inserează cod mort și modifică ordinea instrucțiunilor, făcând bytecodul ilizibil pentru decompilatoare precum jadx. Ascunderea constantelor (constant hiding) înlocuiește literalii numerici cu expresii aritmetice calculate în runtime.
Runtime Application Self-Protection — un agent în interiorul aplicației care monitorizează comportamentul mediului de execuție. DexGuard RASP detectează: conectarea Frida prin /proc/self/maps, prezența Xposed Framework, rularea sub debugger (JDWP), emulatorul Android (QEMU). La detectarea amenințării, se activează politica — crash sau generarea de date incorecte. Conform cercetării OWASP Mobile Security (2025), protecția RASP a oprit 94% din atacurile automate tipice.
DexGuard adaugă întârzieri aleatoare în secțiunile critice ale codului, mărind timpul de încercare în analiza dinamică. Parametrul se setează în milisecunde și este randomizat la fiecare compilare. Aceasta complică utilizarea instrumentelor de fuzzing și a scanerelor automate.
La implementarea DexGuard într-un proiect existent, trebuie luată în considerare compatibilitatea inversă cu bibliotecile și SDK-urile populare. Unele biblioteci sunt incompatibile cu ofuscarea extremă din cauza apelurilor de reflecție.
DexGuard este compatibil cu Firebase Crashlytics, Google Analytics, Google Play Services, Retrofit, OkHttp, Glide și Gson cu reguli keep corecte. Bibliotecile care utilizează adnotări și generare de cod (Dagger, Hilt, Room, DataBinding) necesită păstrarea explicită a claselor generate. Echipa Guardsquare publică mostre oficiale de configurare pentru SDK-uri populare.
Cerințe minime: Android Gradle Plugin 7.4, Gradle 7.6, JDK 11. DexGuard 9.1 suportă targetSdk 34 și compileSdk 34. Pentru Java 17 și AGP 8.2+ este necesară versiunea DexGuard 9.2 și superioară. Instrumentul este incompatibil cu R8 în modul de optimizare completă — la utilizarea DexGuard, R8 este dezactivat automat.
După configurarea DexGuard, trebuie efectuată testarea de regresie a tuturor căilor afectate de reflecție și încărcarea dinamică a claselor. Se recomandă rularea testelor automate UI pe buildul cu protecția activată înainte de lansare. Guardsquare oferă instrumentul DexGuard Tracer, care înregistrează erorile ClassNotFoundException în runtime fără a bloca aplicația, simplificâd depanarea regulilor keep.
Întrebări frecvente
ProGuard — ofusctor gratuit cu înlocuirea de bază a numelor și optimizarea bytecodului. DexGuard adaugă criptarea șirurilor AES-256, overload induction pentru nume, agent RASP în runtime, controlul integrității APK și detectarea Frida, Xposed, emulatorului și debuggerului. ProGuard este suficient pentru aplicații obișnuite, DexGuard — pentru cele bancare și corporative.
DexGuard este distribuit sub licență comercială cu plată anuală. Costul depinde de numărul de proiecte și tipul abonamentului. Pentru 2025, licența de bază pentru un proiect începe de la 5 000 USD pe an. Pentru startup-uri este disponibil un program de parteneriat cu o reducere de până la 40%.
Da, DexGuard este pe deplin compatibil cu Kotlin și Jetpack Compose, inclusiv cu corutinele și compilatorul Compose. Sunt necesare reguli keep suplimentare pentru clasele generate de compilatorul Kotlin. Guardsquare recomandă utilizarea șablonului de configurare kotlin-project.txt din documentația oficială.
Criptarea șirurilor și adăugarea agentului RASP mărește APK cu 5–15% în funcție de volumul codului protejat. Ofuscarea numelor și ascunderea fluxului de control nu măresc dimensiunea — ele înlocuiesc numele existente. În medie, APK cu protecție completă DexGuard devine cu 8–12% mai mare decât originalul.
Da, configurația de protecție se aplică doar pentru buildul de release (release build type). Pentru buildul de debug, DexGuard dezactivează automat criptarea și verificările RASP. Dezvoltatorul poate forța activarea DexGuard în modul debug prin parametrul guard.force.enable=true în gradle.properties pentru testarea buildului protejat.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și