DexGuard: co to jest, obfuskacja i ochrona aplikacji Android

Autor: IT Sectr Opublikowano: 2026-04-03 Czas czytania: 8 min

DexGuard — rozwiązanie do ochrony aplikacji Android przed inżynierią odwrotną, dostarczane przez Guardsquare. Narzędzie wykonuje obfuskację, szyfrowanie i proaktywny monitoring DEX-bajtkodu na etapie kompilacji. Według danych Guardsquare, 2025, produkt jest używany w ponad 10 000 komercyjnych projektów, w tym w systemach bankowych i płatniczych. DexGuard rozszerza możliwości ProGuard, dodając ochronę przed dekompilacją i atakami runtime bez zmiany kodu źródłowego aplikacji.

Najważniejsze

  • DexGuard — komercyjny obfusktor Android, następca ProGuard z rozszerzoną ochroną przed reverse engineering
  • Szyfrowanie stringów i klas odbywa się na etapie kompilacji, czyniąc sekcje read pliku DEX niedostępnymi dla analizy statycznej
  • Kontrola integralności sprawdza sygnaturę APK w runtime i zatrzymuje wykonanie po wykryciu modyfikacji
  • Wykrywanie debuggera, emulatora i Frida zapobiega analizie dynamicznej w runtime
  • Agent RASP wykrywa manipulacje pamięcią i przechwytywanie wywołań systemowych na działającym urządzeniu

Co to jest DexGuard?

DexGuard — to komercyjne narzędzie do obfuskacji i ochrony aplikacji Android, opracowane przez ten sam zespół, który stworzył ProGuard (Eric Lafortune). Produkt pojawił się w 2012 roku jako rozszerzenie dla projektów, w których standardowa obfuskacja ProGuard jest niewystarczająca. DexGuard działa na etapie post-kompilacji, przekształcając DEX-bajtkod w zabezpieczoną formę przed pakowaniem APK.

Architektura DexGuard opiera się na wielopoziomowym modelu ochrony. Pierwszy poziom — obfuskacja nazw klas, metod i pól z wykorzystaniem przeciążania nazw (overload induction). Drugi — szyfrowanie stałych stringowych i ładowanie ich przez metody stub w runtime. Trzeci — kontrola integralności APK poprzez sprawdzanie sumy kontrolnej sygnatur. Według danych raportu technicznego Guardsquare (2025), połączone zastosowanie tych poziomów zwiększa czas analizy aplikacji z kilku minut do kilku tygodni.

DexGuard obsługuje wszystkie typy projektów Android: aplikacje, biblioteki, SDK i projekty gier na Unity. Narzędzie integruje się ze standardowym pipelinem Gradle przez plugin com.guardsquare.dexguard i nie wymaga ręcznej interwencji po konfiguracji.

Kluczowa różnica między DexGuard a open-source'owymi odpowiednikami — aktywna ochrona w runtime. Narzędzie nie tylko zaciemnia kod, ale dodaje agenta, który wykonuje sprawdzenia podczas działania aplikacji. Pozwala to wykrywać takie ataki jak wstrzyknięcie Frida, Xposed lub debugowanie przez JDWP i reagować na nie: awaryjne zakończenie, generowanie fałszywych danych lub powiadomienie serwera.

Jak działa obfuskacja w DexGuard

Proces obfuskacji w DexGuard składa się z kolejnych etapów transformacji bajtkodu, z których każdy jest ukierunkowany na konkretny wektor ataku.

Obfuskacja nazw z przeciążaniem

Standardowy obfusktor zastępuje nazwy jednoznakowymi a, b, c. DexGuard używa overload induction — przypisuje tę samą krótką nazwę różnym metodom z różnymi sygnaturami. Dekompilator nie może rozwiązać przeciążenia i generuje nieprawidłowy kod. Według testów Guardsquare, przeciążanie nazw zwiększa liczbę błędów dekompilacji o 78%.

Szyfrowanie stałych

Literały stringowe, URL-e, klucze API i tokeny są szyfrowane algorytmem AES-256 na etapie kompilacji. W runtime metoda stub odszyfrowuje string przed użyciem i zeruje obszar pamięci po. Chroni to przed statycznym przeglądaniem stringów w pliku DEX. Przykład skutku bez szyfrowania: atakujący uruchamia strings dexguard.apk i widzi wszystkie endpointy API w otwartej postaci.

Kontrola integralności kodu

DexGuard oblicza hash SHA-256 dla każdego pliku DEX i zapisuje wartość w warstwie natywnej. Przy uruchomieniu aplikacji agent porównuje bieżący hash z wzorcowym. W przypadku rozbieżności (zmodyfikowany APK) aplikacja jest zamykana. Dodatkowo można skonfigurować sprawdzanie integralności zasobów i manifestu.

groovy
// build.gradle (poziom aplikacji)
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"
            }
        }
    }
}

DexGuard vs ProGuard: kluczowe różnice

Oba narzędzia są opracowane przez tę samą firmę, ale przeznaczone do różnych scenariuszy. ProGuard — to open-source'owy optymalizator i minimalny obfusktor, który jest domyślnie dołączony do Android SDK. DexGuard — produkt komercyjny, dodający poziomy ochrony niedostępne w darmowej wersji.

CechaProGuardDexGuard
LicencjaOpen-source (GPL)Komercyjna
Obfuskacja nazwProsta zamianaOverload induction
Szyfrowanie stringówNieAES-256
Ochrona RASPNieTak
Wykrywanie FridaNieTak
Ochrona przed debugowaniemNieTak
Kontrola integralnościNieHashowanie SHA-256
Wsparcie UnityNieTak

Wybór między narzędziami zależy od klasy chronionych informacji. Dla zwykłej aplikacji mobilnej ProGuard jest wystarczający. Dla aplikacji bankowych, płatniczych i medycznych, gdzie ujawnienie kodu pociąga za sobą ryzyka finansowe lub regulacyjne, DexGuard jest zalecanym rozwiązaniem. Według OWASP Mobile Top 10 (2024), brak obfuskacji w aplikacjach z danymi poufnymi jest uznawany za krytyczne ryzyko.

Konfiguracja DexGuard w projekcie Gradle

Integracja DexGuard rozpoczyna się od podłączenia repozytorium Guardsquare w głównym build.gradle. Plugin w wersji 9.x jest kompatybilny z AGP 7.4–8.5 i Gradle 7.6–8.7. Konfiguracja ochrony jest określana w osobnym pliku dexguard-project.txt, gdzie włącza się konkretne techniki.

groovy
// root build.gradle
buildscript {
    repositories {
        maven { url "https://maven.guardsquare.com/dexguard" }
    }
}

// dexguard-project.txt — minimalna konfiguracja
# Szyfrowanie stringów
@stringEncryption

# Obfuskacja z przeciążaniem nazw
@overloadInduction

# Kontrola integralności APK
@integrityCheck

# Ochrona przed debugowaniem i emulatorem
@antiDebug
@antiEmulator

Dyrektywy @stringEncryption i @overloadInduction — kluczowe dla ochrony kodu komercyjnego. Przy aktywacji wszystkich adnotacji czas kompilacji zwiększa się o 30–60 sekund, co jest uzasadnione poziomem ochrony. Konfiguracja jest przechowywana w VCS i stosowana tylko dla wydania produkcyjnego.

Ważne jest skonfigurowanie wyjątków dla klas używanych przez refleksję. DexGuard, podobnie jak ProGuard, nie analizuje refleksji automatycznie. W dexguard-project.txt należy dodać reguły -keep dla klas bibliotek ładowanych przez Class.forName lub @JavascriptInterface.

groovy
// dexguard-project.txt — reguły keep
# Zachowaj klasy modelu Gson
-keep class com.example.model.** { *; }

# Zachowaj interfejsy WebView
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

# Wyklucz raporty awarii Firebase
-keep class com.google.firebase.** { *; }

Techniki ochrony DexGuard

DexGuard zawiera ponad 20 technik ochrony, podzielonych na statyczne (na etapie kompilacji) i dynamiczne (w runtime). Wybór konkretnych technik zależy od modelu zagrożeń aplikacji.

Ochrona statyczna

Szyfrowanie zasobów — obrazy, assety i pliki konfiguracyjne są szyfrowane i odszyfrowywane przy pierwszym dostępie. Zaciemnianie przepływu sterowania (control flow obfuscation) wstawia martwy kod i zmienia kolejność instrukcji, czyniąc bajtkod nieczytelnym dla dekompilatorów takich jak jadx. Ukrywanie stałych (constant hiding) zastępuje literały liczbowe wyrażeniami arytmetycznymi obliczanymi w runtime.

Ochrona dynamiczna (RASP)

Runtime Application Self-Protection — agent wewnątrz aplikacji monitorujący zachowanie środowiska wykonawczego. DexGuard RASP wykrywa: podłączenie Frida przez /proc/self/maps, obecność Xposed Framework, uruchomienie pod debuggerem (JDWP), emulator Android (QEMU). Po wykryciu zagrożenia uruchamiana jest polityka — crash lub generowanie nieprawidłowych danych. Według badania OWASP Mobile Security (2025), ochrona RASP zatrzymała 94% typowych zautomatyzowanych ataków.

Ochrona przed atakami czasowymi

DexGuard dodaje losowe opóźnienia w krytycznych fragmentach kodu, zwiększając czas prób przy analizie dynamicznej. Parametr jest określany w milisekundach i randomizowany przy każdej kompilacji. Utrudnia to korzystanie z narzędzi fuzzingowych i automatycznych skanerów.

Zasady integracji i kompatybilność

Przy wdrażaniu DexGuard w istniejącym projekcie należy uwzględnić wsteczną kompatybilność z bibliotekami i popularnymi SDK. Niektóre biblioteki są niekompatybilne z ekstremalną obfuskacją ze względu na wywołania refleksyjne.

Kompatybilność z popularnymi SDK

DexGuard jest kompatybilny z Firebase Crashlytics, Google Analytics, Google Play Services, Retrofit, OkHttp, Glide i Gson przy odpowiednich regułach keep. Biblioteki używające adnotacji i code generation (Dagger, Hilt, Room, DataBinding) wymagają jawnego zachowania wygenerowanych klas. Zespół Guardsquare publikuje oficjalne przykłady konfiguracji dla popularnych SDK.

Wymagania środowiskowe

Minimalne wymagania: Android Gradle Plugin 7.4, Gradle 7.6, JDK 11. DexGuard 9.1 obsługuje targetSdk 34 i compileSdk 34. Dla Java 17 i AGP 8.2+ wymagana jest wersja DexGuard 9.2 i wyższa. Narzędzie jest niekompatybilne z R8 w trybie pełnej optymalizacji — przy użyciu DexGuard R8 jest wyłączany automatycznie.

Testowanie po obfuskacji

Po konfiguracji DexGuard należy przeprowadzić testy regresyjne wszystkich ścieżek objętych refleksją i dynamicznym ładowaniem klas. Zaleca się uruchamianie testów automatycznych UI na buildzie z włączoną ochroną przed wydaniem. Firma Guardsquare udostępnia narzędzie DexGuard Tracer, które loguje błędy ClassNotFoundException w runtime bez crashowania aplikacji, ułatwiając debugowanie reguł keep.

Często zadawane pytania

Czym DexGuard różni się od ProGuard?

ProGuard — darmowy obfusktor z podstawową zamianą nazw i optymalizacją bajtkodu. DexGuard dodaje szyfrowanie stringów AES-256, overload induction dla nazw, agent RASP w runtime, kontrolę integralności APK oraz wykrywanie Frida, Xposed, emulatora i debuggera. ProGuard jest wystarczający dla zwykłych aplikacji, DexGuard — dla bankowych i korporacyjnych.

Ile kosztuje licencja DexGuard?

DexGuard jest dystrybuowany na licencji komercyjnej z roczną opłatą. Koszt zależy od liczby projektów i typu subskrypcji. Na 2025 rok podstawowa licencja na jeden projekt zaczyna się od 5 000 USD rocznie. Dla startupów dostępny jest program partnerski ze zniżką do 40%.

Czy można używać DexGuard z Kotlin i Jetpack Compose?

Tak, DexGuard jest w pełni kompatybilny z Kotlin i Jetpack Compose, w tym z korutynami i kompilatorem Compose. Wymagane są dodatkowe reguły keep dla klas wygenerowanych przez kompilator Kotlin. Guardsquare zaleca użycie szablonu konfiguracji kotlin-project.txt z oficjalnej dokumentacji.

Czy DexGuard zwiększa rozmiar APK?

Szyfrowanie stringów i dodanie agenta RASP zwiększa APK o 5–15% w zależności od objętości chronionego kodu. Obfuskacja nazw i zaciemnianie przepływu sterowania nie zwiększają rozmiaru — zastępują one istniejące nazwy. Średnio APK z pełną ochroną DexGuard staje się o 8–12% większy od oryginalnego.

Czy można wyłączyć DexGuard do debugowania?

Tak, konfiguracja ochrony jest stosowana tylko dla wydania produkcyjnego (release build type). Dla debug-build DexGuard automatycznie wyłącza szyfrowanie i sprawdzenia RASP. Deweloper może wymusić włączenie DexGuard w trybie debug przez parametr guard.force.enable=true w gradle.properties do testowania zabezpieczonego builda.

Podsumowanie

  • DexGuard — komercyjne narzędzie ochrony dla Android, rozszerzające możliwości ProGuard pełnym zestawem technik anti-reversing
  • Obfuskacja nazw z overload induction czyni zdekompilowany kod niedziałającym poprzez generowanie nierozwiązywalnych przeciążeń metod
  • Szyfrowanie stałych stringowych i zasobów algorytmem AES-256 zamyka analizę statyczną pliku DEX przed jadx i strings
  • Agent RASP wykrywa Frida, Xposed, debugger JDWP i emulator w runtime, wykonując awaryjne zakończenie po wykryciu zagrożenia
  • Kontrola integralności APK przez hash SHA-256 w warstwie natywnej zapobiega uruchomieniu zmodyfikowanej wersji aplikacji
  • Integracja w projekcie Gradle z adnotacjami @stringEncryption, @overloadInduction i @antiDebug wymaga 10–15 minut konfiguracji
  • DexGuard — zalecane narzędzie dla bankowych, płatniczych i medycznych aplikacji Android, gdzie kompromitacja kodu niesie ryzyka finansowe

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również