DexGuard: 개념, 난독화 및 Android 애플리케이션 보호

저자: IT Sectr 게시일: 2026-04-03 읽는 시간: 8 분

DexGuard는 Guardsquare가 제공하는 Android 애플리케이션을 리버스 엔지니어링으로부터 보호하는 솔루션입니다. 이 도구는 빌드 단계에서 DEX 바이트코드의 난독화, 암호화 및 사전 모니터링을 수행합니다. Guardsquare, 2025에 따르면 이 제품은 은행 및 결제 시스템을 포함하여 10,000개 이상의 상용 프로젝트에서 사용됩니다. DexGuard는 애플리케이션의 소스 코드를 변경하지 않고 디컴파일 및 런타임 공격으로부터 보호를 추가하여 ProGuard의 기능을 확장합니다.

주요 포인트

  • DexGuard는 리버스 엔지니어링에 대한 향상된 보호를 갖춘 ProGuard의 후속 제품인 상용 Android 난독화 도구입니다
  • 문자열 및 클래스의 암호화는 빌드 단계에서 이루어지며, DEX 파일의 읽기 섹션을 정적 분석에 접근 불가능하게 만듭니다
  • 무결성 제어는 런타임에서 APK 서명을 확인하고 수정이 감지되면 실행을 중지합니다
  • 디버거, 에뮬레이터 및 Frida 감지는 런타임에서 동적 분석을 방지합니다
  • RASP 에이전트는 실행 중인 기기에서 메모리 조작 및 시스템 호출 가로채기를 감지합니다

DexGuard란 무엇인가?

DexGuard는 ProGuard(Eric Lafortune)를 만든 동일한 팀이 개발한 Android 애플리케이션을 난독화하고 보호하기 위한 상용 도구입니다. 이 제품은 표준 ProGuard 난독화가 불충분한 프로젝트를 위한 확장으로 2012년에 등장했습니다. DexGuard는 컴파일 후 단계에서 작동하여 APK 패키징 전에 DEX 바이트코드를 보호된 형태로 변환합니다.

DexGuard 아키텍처는 다계층 보호 모델을 기반으로 구축되었습니다. 첫 번째 계층은 overload induction을 사용한 클래스, 메서드 및 필드 이름의 난독화입니다. 두 번째는 문자열 상수의 암호화와 런타임에서 스텁 메서드를 통한 로드입니다. 세 번째는 서명의 체크섬 검증을 통한 APK 무결성 제어입니다. Guardsquare의 기술 보고서(2025)에 따르면 이러한 계층의 결합된 사용은 애플리케이션 분석 시간을 몇 분에서 몇 주로 증가시킵니다.

DexGuard는 애플리케이션, 라이브러리, SDK 및 Unity 게임 프로젝트를 포함한 모든 유형의 Android 프로젝트를 지원합니다. 이 도구는 com.guardsquare.dexguard 플러그인을 통해 표준 Gradle 파이프라인에 통합되며 설정 후 수동 개입이 필요하지 않습니다.

DexGuard와 오픈 소스 대안 간의 주요 차이점은 활성 런타임 보호입니다. 이 도구는 코드를 난독화할 뿐만 아니라 애플리케이션 실행 중에 검사를 수행하는 에이전트를 추가합니다. 이를 통해 Frida 주입, Xposed 또는 JDWP 디버깅과 같은 공격을 감지하고 충돌, 가짜 데이터 생성 또는 서버 알림으로 대응할 수 있습니다.

DexGuard에서 난독화 작동 방식

DexGuard의 난독화 프로세스는 각각 특정 공격 벡터를 대상으로 하는 순차적 바이트코드 변환 단계로 구성됩니다.

Overload induction을 사용한 이름 난독화

표준 난독화 도구는 이름을 단일 문자 a, b, c로 대체합니다. DexGuard는 overload induction을 사용합니다 — 다른 서명을 가진 다른 메서드에 동일한 짧은 이름을 할당합니다. 디컴파일러는 오버로드를 해결할 수 없으며 잘못된 코드를 생성합니다. Guardsquare 테스트에 따르면 이름 오버로딩은 디컴파일 오류를 78% 증가시킵니다.

상수 암호화

문자열 리터럴, URL, API 키 및 토큰은 빌드 단계에서 AES-256을 사용하여 암호화됩니다. 런타임에서 스텁 메서드는 사용 전에 문자열을 해독하고 사용 후 메모리 영역을 지웁니다. 이는 DEX 파일의 문자열 정적 보기로부터 보호합니다. 암호화가 없는 경우의 예: 공격자가 strings dexguard.apk를 실행하고 모든 API 엔드포인트를 일반 텍스트로 봅니다.

코드 무결성 제어

DexGuard는 각 DEX 파일에 대한 SHA-256 해시를 계산하고 네이티브 계층에 값을 저장합니다. 애플리케이션이 시작되면 에이전트는 현재 해시를 참조 값과 비교합니다. 불일치(수정된 APK)가 있는 경우 애플리케이션이 종료됩니다. 추가적으로 리소스 및 매니페스트에 대한 무결성 검사를 구성할 수 있습니다.

groovy
// build.gradle (앱 레벨)
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: 주요 차이점

두 도구 모두 동일한 회사에서 개발했지만 다른 시나리오를 대상으로 합니다. ProGuard는 Android SDK에 기본적으로 포함된 오픈 소스 최적화 도구이자 최소 난독화 도구입니다. DexGuard는 무료 버전에서는 사용할 수 없는 보호 수준을 추가하는 상용 제품입니다.

특징ProGuardDexGuard
라이선스오픈 소스 (GPL)상용
이름 난독화단순 대체Overload induction
문자열 암호화아니요AES-256
RASP 보호아니요
Frida 감지아니요
디버그 보호아니요
무결성 제어아니요SHA-256 해싱
Unity 지원아니요

도구 간의 선택은 보호되는 정보의 클래스에 따라 결정됩니다. 일반 모바일 애플리케이션의 경우 ProGuard로 충분합니다. 코드 공개가 재정적 또는 규제적 위험을 초래하는 은행, 결제 및 의료 애플리케이션의 경우 DexGuard가 권장 솔루션입니다. OWASP Mobile Top 10(2024)에 따르면 민감한 데이터가 있는 애플리케이션에서 난독화 부재는 중요한 위험으로 간주됩니다.

Gradle 프로젝트에서 DexGuard 구성

DexGuard 통합은 루트 build.gradle에 Guardsquare 저장소를 추가하는 것으로 시작됩니다. 버전 9.x 플러그인은 AGP 7.4–8.5 및 Gradle 7.6–8.7과 호환됩니다. 보호 구성은 별도의 dexguard-project.txt 파일에 정의되며, 여기서 특정 기술이 활성화됩니다.

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

// dexguard-project.txt — 최소 구성
# 문자열 암호화
@stringEncryption

# Overload induction을 통한 난독화
@overloadInduction

# APK 무결성 제어
@integrityCheck

# 디버거 및 에뮬레이터 보호
@antiDebug
@antiEmulator

@stringEncryption@overloadInduction 지시문은 상용 코드 보호의 핵심입니다. 모든 어노테이션이 활성화되면 빌드 시간이 30~60초 증가하지만 보호 수준으로 정당화됩니다. 구성은 VCS에 저장되며 릴리스 빌드에만 적용됩니다.

리플렉션을 사용하는 클래스에 대한 예외를 구성하는 것이 중요합니다. DexGuard는 ProGuard와 마찬가지로 리플렉션을 자동으로 분석하지 않습니다. dexguard-project.txt에서 Class.forName 또는 @JavascriptInterface를 통해 로드되는 라이브러리 클래스에 대한 -keep 규칙을 추가해야 합니다.

groovy
// dexguard-project.txt — keep 규칙
# Gson 모델 클래스 유지
-keep class com.example.model.** { *; }

# WebView 인터페이스 유지
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

# Firebase 충돌 보고서 제외
-keep class com.google.firebase.** { *; }

DexGuard 보호 기술

DexGuard는 정적(빌드 단계) 및 동적(런타임)으로 구분된 20개 이상의 보호 기술을 포함합니다. 특정 기술의 선택은 애플리케이션의 위협 모델에 따라 달라집니다.

정적 보호

리소스 암호화 — 이미지, 에셋 및 구성 파일은 첫 번째 액세스 시 암호화 및 해독됩니다. 제어 흐름 난독화는 데드 코드를 삽입하고 명령 시퀀스를 변경하여 jadx와 같은 디컴파일러가 바이트코드를 읽을 수 없게 만듭니다. 상수 숨기기는 숫자 리터럴을 런타임에서 계산되는 산술 표현식으로 대체합니다.

동적 보호 (RASP)

Runtime Application Self-Protection — 애플리케이션 내부에서 런타임 환경 동작을 모니터링하는 에이전트입니다. DexGuard RASP는 /proc/self/maps를 통한 Frida 연결, Xposed Framework 존재, 디버거(JDWP) 하에서 실행, Android 에뮬레이터(QEMU)를 감지합니다. 위협이 감지되면 충돌 또는 잘못된 데이터 생성 정책이 트리거됩니다. OWASP Mobile Security(2025) 연구에 따르면 RASP 보호는 일반적인 자동화 공격의 94%를 차단했습니다.

시간 기반 공격 보호

DexGuard는 중요한 코드 섹션에 무작위 지연을 추가하여 동적 분석 중 무차별 대입 시간을 증가시킵니다. 매개변수는 밀리초 단위로 설정되며 빌드마다 무작위화됩니다. 이는 퍼징 도구 및 자동 스캐너의 사용을 어렵게 만듭니다.

통합 지침 및 호환성

기존 프로젝트에 DexGuard를 통합할 때는 라이브러리 및 인기 SDK와의 역호환성을 고려해야 합니다. 일부 라이브러리는 리플렉션 호출로 인해 극단적인 난독화와 호환되지 않습니다.

인기 SDK와의 호환성

DexGuard는 올바른 keep 규칙을 사용하여 Firebase Crashlytics, Google Analytics, Google Play Services, Retrofit, OkHttp, Glide 및 Gson과 호환됩니다. 어노테이션 및 코드 생성(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 규칙 디버깅을 단순화합니다.

자주 묻는 질문

DexGuard는 ProGuard와 어떻게 다른가요?

ProGuard는 기본적인 이름 대체 및 바이트코드 최적화 기능을 갖춘 무료 난독화 도구입니다. DexGuard는 AES-256 문자열 암호화, 이름에 대한 overload induction, 런타임 RASP 에이전트, APK 무결성 제어 및 Frida, Xposed, 에뮬레이터, 디버거 감지를 추가합니다. ProGuard는 일반 애플리케이션에 충분하며 DexGuard는 은행 및 엔터프라이즈 애플리케이션용입니다.

DexGuard 라이선스 비용은 얼마인가요?

DexGuard는 연간 지불이 있는 상용 라이선스로 배포됩니다. 비용은 프로젝트 수와 구독 유형에 따라 다릅니다. 2025년 기준, 한 프로젝트에 대한 기본 라이선스는 연간 5,000 USD부터 시작합니다. 스타트업을 위해 최대 40% 할인된 파트너십 프로그램이 제공됩니다.

DexGuard를 Kotlin 및 Jetpack Compose와 함께 사용할 수 있나요?

예, DexGuard는 Kotlin 및 Jetpack Compose와 완전히 호환되며 코루틴 및 Compose 컴파일러를 포함합니다. Kotlin 컴파일러에 의해 생성된 클래스에는 추가 keep 규칙이 필요합니다. Guardsquare는 공식 문서의 kotlin-project.txt 구성 템플릿 사용을 권장합니다.

DexGuard가 APK 크기를 증가시키나요?

문자열 암호화 및 RASP 에이전트 추가는 보호되는 코드의 양에 따라 APK 크기를 5~15% 증가시킵니다. 이름 난독화 및 제어 흐름 난독화는 크기를 증가시키지 않습니다 — 기존 이름을 대체합니다. 평균적으로 완전한 DexGuard 보호가 적용된 APK는 원본보다 8~12% 더 커집니다.

디버깅을 위해 DexGuard를 비활성화할 수 있나요?

예, 보호 구성은 릴리스 빌드 유형에만 적용됩니다. 디버그 빌드의 경우 DexGuard는 자동으로 암호화 및 RASP 검사를 비활성화합니다. 개발자는 gradle.properties에서 guard.force.enable=true 매개변수를 통해 디버그 모드에서 DexGuard를 강제로 활성화하여 보호된 빌드를 테스트할 수 있습니다.

요약

  • DexGuard는 Android용 상용 보호 도구로, 전체 안티 리버싱 기술 세트로 ProGuard의 기능을 확장합니다
  • Overload induction을 통한 난독화는 해결 불가능한 메서드 오버로드를 생성하여 디컴파일된 코드를 작동 불가능하게 만듭니다
  • AES-256을 사용한 문자열 상수 및 리소스 암호화는 jadx 및 strings를 통한 DEX 파일의 정적 분석을 차단합니다
  • RASP 에이전트는 런타임에서 Frida, Xposed, JDWP 디버거 및 에뮬레이터를 감지하고 위협 감지 시 충돌을 실행합니다
  • 네이티브 계층의 SHA-256 해시를 통한 APK 무결성 제어는 수정된 버전의 애플리케이션 실행을 방지합니다
  • @stringEncryption, @overloadInduction 및 @antiDebug 어노테이션을 사용한 Gradle 프로젝트 통합은 10~15분의 설정이 필요합니다
  • DexGuard는 코드 손상이 재정적 위험을 초래하는 은행, 결제 및 의료 Android 애플리케이션에 권장되는 도구입니다

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기