본문 바로가기
App/AndroGoat

AndroGoat.apk | 에뮬레이터 탐지 (smali)

by 09337 2021. 9. 20.

0. 기본 세팅

AndroGoat.apk 파일을 다운받은 후, 에뮬레이터(Nox)로 옮겨준다.

 

1. 에뮬레이터 탐지

나는 녹스를 사용 중이기 때문에 원래는 "This is Emulator" 라고 떠야하지만, (아마도..) 해당 APK가 외국 앱이기 때문에 녹스를 탐지하지 않아서 "This is not Emulator"라는 문장이 나타난다.

 

어차피 목적은 탐지를 우회하는 것이기 때문에, is not Emulator → in Emulator 가 되도록 해본다.

 

2. apk 디컴파일

apk easy tool을 사용해서 해당 apk 파일을 디컴파일 해준다.

 

2.1. package명 및 Emulator Detection 탐지 영역 체크

디컴파일 후 나온 AndroidManifest.xml 파일을 통해 package명과 Emulator Detection을 탐지하는 영역을 확인한다.

 

jadx로 위에서 확인한 영역을 보면 아래와 같은 코드가 있다.

//owastp.sat.agoat.EmulatorDetectionActivity

public final boolean isEmulator() {
    String str = Build.FINGERPRINT + Build.DEVICE + Build.MODEL + Build.BRAND + Build.PRODUCT + Build.MANUFACTURER + Build.HARDWARE;
    if (str != null) {
        String builddtls = str.toLowerCase();
        Intrinsics.checkExpressionValueIsNotNull(builddtls, "(this as java.lang.String).toLowerCase()");
        if (StringsKt.contains$default((CharSequence) builddtls, (CharSequence) "generic", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) builddtls, (CharSequence) EnvironmentCompat.MEDIA_UNKNOWN, false, 2, (Object) null) || StringsKt.contains$default((CharSequence) builddtls, (CharSequence) "emulator", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) builddtls, (CharSequence) "sdk", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) builddtls, (CharSequence) "vbox", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) builddtls, (CharSequence) "genymotion", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) builddtls, (CharSequence) "x86", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) builddtls, (CharSequence) "goldfish", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) builddtls, (CharSequence) "test-keys", false, 2, (Object) null)) {
            return true;
        }
        return false;
    }
    throw new TypeCastException("null cannot be cast to non-null type java.lang.String");
}

8번 라인에 해당되는 에뮬레이터가 탐지된다면 true, 그렇지 않다면 false를 반환한다.

 

3. EmulatorDetectionActivity.smali 변조

331라인을 통해 에물레이터라면 cond_0, 아니라면 cond_1로 이동한다.

나는 에뮬레이터가 아니라고 나타났기 때문에 cond_1로 이동해서 에뮬레이터라고 탐지할 수 있게 다음과 같이 코드를 추가해줬다.

추가한 코드는 0x1, 즉 True를 반환하여 에뮬레이터라고 탐지되게끔 하는 코드다.

 

4. 컴파일 후 에뮬레이터 탐지

apk easy tool로 Sign APK → Compile을 진행하고, 새로 컴파일한 apk 재설치 후 에뮬레이터 탐지를 해보면 다음과 같이 "This is Emulator" 라고 나타난다.

 

 

댓글