androidmenifest.xml 파일을 살펴보다 해당 문제에 맞는 Activity를 발견하여 들어갔다.
<activity
android:label="@string/emulator"
android:name="owasp.sat.agoat.EmulatorDetectionActivity"/>
가장 메인이 되는 isEmulator 메서드를 boolean 으로 검증하고 있어 살펴보니
# owasp.sat.agoat.EmulatorDetectionActivity
private final boolean isEmulator() {
String buildDetails = (Build.FINGERPRINT + Build.DEVICE + Build.MODEL + Build.BRAND + Build.PRODUCT + Build.MANUFACTURER + Build.HARDWARE).toLowerCase();
Intrinsics.checkNotNullExpressionValue(buildDetails, "this as java.lang.String).toLowerCase()");
return StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) "generic", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) EnvironmentCompat.MEDIA_UNKNOWN, false, 2, (Object) null) || StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) "emulator", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) "sdk", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) "vbox", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) "genymotion", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) "x86", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) "goldfish", false, 2, (Object) null) || StringsKt.contains$default((CharSequence) buildDetails, (CharSequence) "test-keys", false, 2, (Object) null);
}
build 문자열을 합쳐 그 문자열에 generic, emulator, sdk, x86, goldfish, test-keys 이 키워드가 하나라도 들어간다면(||) True를 반환한다.
해당 메서드를 호출해서 return 값이 false가 되게 끔 익스 코드를 짜준다.
console.log("start");
Java.perform(function () {
const EmulatorDetectionActivity = Java.use(
"owasp.sat.agoat.EmulatorDetectionActivity"
);
EmulatorDetectionActivity.isEmulator.implementation = function(){
return false;
};
});
console.log("fin");
결과 확인
