아 에뮬 디텍터 우회 멘붕 오네요 진짜..

홈 > 커뮤니티 > 질문 게시판
질문 게시판

아 에뮬 디텍터 우회 멘붕 오네요 진짜..

2 쿠쿠닭스 2 4696
package lib.bluegames.com.clubaudition.devicechecker;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import androidx.core.content.ContextCompat;
import com.unity3d.player.UnityPlayer;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

@TargetApi(14)
public final class DeviceChecker {
    private static final String[] ANDY_FILES = {"fstab.andy", "ueventd.andy.rc"};
    private static final String[] DEVICE_IDS = {"000000000000000", "e21833235b6eef10", "012345678912345"};
    private static final String[] GENY_FILES = {"/dev/socket/genyd", "/dev/socket/baseband_genyd"};
    private static final String[] IMSI_IDS = {"310260000000000"};
    private static final String IP = "10.0.2.15";
    private static final String LOG_TAG = "BlueLIB";
    private static final int MIN_PROPERTIES_THRESHOLD = 5;
    private static final String[] NOX_FILES = {"fstab.nox", "init.nox.rc", "ueventd.nox.rc"};
    private static final String[] PHONE_NUMBERS = {"15555215554", "15555215556", "15555215558", "15555215560", "15555215562", "15555215564", "15555215566", "15555215568", "15555215570", "15555215572", "15555215574", "15555215576", "15555215578", "15555215580", "15555215582", "15555215584"};
    private static final String[] PIPES = {"/dev/socket/qemud", "/dev/qemu_pipe"};
    private static final Property[] PROPERTIES = {new Property("init.svc.qemud", null), new Property("init.svc.qemu-props", null), new Property("qemu.hw.mainkeys", null), new Property("qemu.sf.fake_camera", null), new Property("qemu.sf.lcd_density", null), new Property("ro.bootloader", "unknown"), new Property("ro.bootmode", "unknown"), new Property("ro.hardware", "goldfish"), new Property("ro.kernel.android.qemud", null), new Property("ro.kernel.qemu.gles", null), new Property("ro.kernel.qemu", "1"), new Property("ro.product.device", "generic"), new Property("ro.product.model", "sdk"), new Property("ro.product.name", "sdk"), new Property("ro.serialno", null)};
    private static final String[] QEMU_DRIVERS = {"goldfish"};
    private static final String[] X86_FILES = {"ueventd.android_x86.rc", "x86.prop", "ueventd.ttVM_x86.rc", "init.ttVM_x86.rc", "fstab.ttVM_x86", "fstab.vbox86", "init.vbox86.rc", "ueventd.vbox86.rc"};
    private static DeviceChecker instance;
    @SuppressLint({"StaticFieldLeak"})
    private static DeviceChecker mEmulatorDetector;
    private boolean isCheckPackage = true;
    private boolean isDebug = false;
    private boolean isTelephony = false;
    private final Context mContext = UnityPlayer.currentActivity.getApplicationContext();
    private List<String> mListPackageName = new ArrayList();
    private String mObjectName;

    private DeviceChecker() {
        this.mListPackageName.add("com.google.android.launcher.layouts.genymotion");
        this.mListPackageName.add("com.bluestacks");
        this.mListPackageName.add("com.bignox.app");
    }

    /* access modifiers changed from: private */
    public void OnCallBackForUnityMsg(String str, String str2) {
        UnityPlayer.UnitySendMessage(this.mObjectName, str, str2);
    }

    private boolean checkAdvanced() {
        return checkTelephony() || checkFiles(GENY_FILES, "Geny") || checkFiles(ANDY_FILES, "Andy") || checkFiles(NOX_FILES, "Nox") || checkQEmuDrivers() || checkFiles(PIPES, "Pipes") || checkIp() || (checkQEmuProps() && checkFiles(X86_FILES, "X86"));
    }

    private boolean checkBasic() {
        boolean z = false;
        boolean z2 = Build.FINGERPRINT.startsWith("generic") || Build.MODEL.contains("google_sdk") || Build.MODEL.toLowerCase().contains("droid4x") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion") || Build.HARDWARE.equals("goldfish") || Build.HARDWARE.equals("vbox86") || Build.PRODUCT.equals("sdk") || Build.PRODUCT.equals("google_sdk") || Build.PRODUCT.equals("sdk_x86") || Build.PRODUCT.equals("vbox86p") || Build.BOARD.toLowerCase().contains("nox") || Build.BOOTLOADER.toLowerCase().contains("nox") || Build.HARDWARE.toLowerCase().contains("nox") || Build.PRODUCT.toLowerCase().contains("nox") || Build.SERIAL.toLowerCase().contains("nox");
        if (z2) {
            return true;
        }
        if (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) {
            z = true;
        }
        boolean z3 = z | z2;
        if (z3) {
            return true;
        }
        boolean equals = z3 | "google_sdk".equals(Build.PRODUCT);
        if (equals) {
            return true;
        }
        Vibrator vibrator = (Vibrator) this.mContext.getSystemService("vibrator");
        boolean hasVibrator = vibrator.hasVibrator();
        StringBuilder sb = new StringBuilder();
        sb.append("Support Vibrator : ");
        sb.append(vibrator.hasVibrator());
        log(sb.toString());
        return (!hasVibrator) | equals;
    }

    private boolean checkDeviceId() {
        if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
            String deviceId = ((TelephonyManager) this.mContext.getSystemService("phone")).getDeviceId();
            for (String equalsIgnoreCase : DEVICE_IDS) {
                if (equalsIgnoreCase.equalsIgnoreCase(deviceId)) {
                    log("Check device id is detected");
                    return true;
                }
            }
        }
        return false;
    }

    private boolean checkFiles(String[] strArr, String str) {
        for (String file : strArr) {
            if (new File(file).exists()) {
                StringBuilder sb = new StringBuilder();
                sb.append("Check ");
                sb.append(str);
                sb.append(" is detected");
                log(sb.toString());
                return true;
            }
        }
        return false;
    }

    private boolean checkImsi() {
        if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
            String subscriberId = ((TelephonyManager) this.mContext.getSystemService("phone")).getSubscriberId();
            for (String equalsIgnoreCase : IMSI_IDS) {
                if (equalsIgnoreCase.equalsIgnoreCase(subscriberId)) {
                    log("Check imsi is detected");
                    return true;
                }
            }
        }
        return false;
    }

    private boolean checkIp() {
        if (ContextCompat.checkSelfPermission(this.mContext, "android.permission.INTERNET") == 0) {
            StringBuilder sb = new StringBuilder();
            try {
                ProcessBuilder processBuilder = new ProcessBuilder(new String[]{"/system/bin/netcfg"});
                processBuilder.directory(new File("/system/bin/"));
                processBuilder.redirectErrorStream(true);
                InputStream inputStream = processBuilder.start().getInputStream();
                byte[] bArr = new byte[1024];
                while (inputStream.read(bArr) != -1) {
                    sb.append(new String(bArr));
                }
                inputStream.close();
            } catch (Exception e) {
            }
            String sb2 = sb.toString();
            StringBuilder sb3 = new StringBuilder();
            sb3.append("netcfg data -> ");
            sb3.append(sb2);
            log(sb3.toString());
            if (!TextUtils.isEmpty(sb2)) {
                String[] split = sb2.split("\n");
                int length = split.length;
                for (int i = 0; i < length; i++) {
                    String str = split[i];
                    if ((str.contains("wlan0") || str.contains("tunl0") || str.contains("eth0")) && str.contains(IP)) {
                        log("Check IP is detected");
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private boolean checkOperatorNameAndroid() {
        if (!((TelephonyManager) this.mContext.getSystemService("phone")).getNetworkOperatorName().equalsIgnoreCase("android")) {
            return false;
        }
        log("Check operator name android is detected");
        return true;
    }

    private boolean checkPackageName() {
        if (this.isCheckPackage && !this.mListPackageName.isEmpty()) {
            PackageManager packageManager = this.mContext.getPackageManager();
            for (String launchIntentForPackage : this.mListPackageName) {
                Intent launchIntentForPackage2 = packageManager.getLaunchIntentForPackage(launchIntentForPackage);
                if (launchIntentForPackage2 != null && !packageManager.queryIntentActivities(launchIntentForPackage2, 65536).isEmpty()) {
                    return true;
                }
            }
            Intent intent = new Intent("android.intent.action.MAIN", null);
            intent.addCategory("android.intent.category.LAUNCHER");
            for (ResolveInfo resolveInfo : packageManager.queryIntentActivities(intent, 0)) {
                String str = resolveInfo.activityInfo.packageName;
                if (str.startsWith("com.bluestacks.")) {
                    return true;
                }
                if (str.startsWith("com.vphone.")) {
                    return true;
                }
                if (str.startsWith("com.bignox.")) {
                    return true;
                }
                if (str.equals("com.google.android.launcher.layouts.genymotion")) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean checkPhoneNumber() {
        if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
            String line1Number = ((TelephonyManager) this.mContext.getSystemService("phone")).getLine1Number();
            for (String equalsIgnoreCase : PHONE_NUMBERS) {
                if (equalsIgnoreCase.equalsIgnoreCase(line1Number)) {
                    log(" check phone number is detected");
                    return true;
                }
            }
        }
        return false;
    }

    private boolean checkQEmuDrivers() {
        File[] fileArr = {new File("/proc/tty/drivers"), new File("/proc/cpuinfo")};
        int length = fileArr.length;
        for (int i = 0; i < length; i++) {
            File file = fileArr[i];
            if (file.exists() && file.canRead()) {
                byte[] bArr = new byte[1024];
                try {
                    FileInputStream fileInputStream = new FileInputStream(file);
                    fileInputStream.read(bArr);
                    fileInputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                String str = new String(bArr);
                for (String contains : QEMU_DRIVERS) {
                    if (str.contains(contains)) {
                        log("Check QEmuDrivers is detected");
                        return true;
                    }
                }
                continue;
            }
        }
        return false;
    }

    private boolean checkQEmuProps() {
        Property[] propertyArr = PROPERTIES;
        int length = propertyArr.length;
        int i = 0;
        for (int i2 = 0; i2 < length; i2++) {
            Property property = propertyArr[i2];
            String prop = getProp(this.mContext, property.name);
            if (property.seek_value == null && prop != null) {
                i++;
            }
            if (property.seek_value != null && prop.contains(property.seek_value)) {
                i++;
            }
        }
        if (i < MIN_PROPERTIES_THRESHOLD) {
            return false;
        }
        log("Check QEmuProps is detected");
        return true;
    }

    /* access modifiers changed from: private */
    public boolean checkRoot() {
        try {
            Runtime.getRuntime().exec("su");
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    private boolean checkTelephony() {
        if (ContextCompat.checkSelfPermission(this.mContext, "android.permission.READ_PHONE_STATE") != 0 || !this.isTelephony || !isSupportTelePhony()) {
            return false;
        }
        return checkPhoneNumber() || checkDeviceId() || checkImsi() || checkOperatorNameAndroid();
    }

    /* access modifiers changed from: private */
    public boolean detect() {
        log(getDeviceInfo());
        boolean checkBasic = checkBasic();
        StringBuilder sb = new StringBuilder();
        sb.append("Check basic ");
        sb.append(checkBasic);
        log(sb.toString());
        if (!checkBasic) {
            checkBasic = checkAdvanced();
            StringBuilder sb2 = new StringBuilder();
            sb2.append("Check Advanced ");
            sb2.append(checkBasic);
            log(sb2.toString());
        }
        if (checkBasic) {
            return checkBasic;
        }
        boolean checkPackageName = checkPackageName();
        StringBuilder sb3 = new StringBuilder();
        sb3.append("Check Package Name ");
        sb3.append(checkPackageName);
        log(sb3.toString());
        return checkPackageName;
    }

    public static String getDeviceInfo() {
        StringBuilder sb = new StringBuilder();
        sb.append("Build.PRODUCT: ");
        sb.append(Build.PRODUCT);
        sb.append("\nBuild.MANUFACTURER: ");
        sb.append(Build.MANUFACTURER);
        sb.append("\nBuild.BRAND: ");
        sb.append(Build.BRAND);
        sb.append("\nBuild.DEVICE: ");
        sb.append(Build.DEVICE);
        sb.append("\nBuild.MODEL: ");
        sb.append(Build.MODEL);
        sb.append("\nBuild.HARDWARE: ");
        sb.append(Build.HARDWARE);
        sb.append("\nBuild.FINGERPRINT: ");
        sb.append(Build.FINGERPRINT);
        return sb.toString();
    }

    public static DeviceChecker getInstance() {
        DeviceChecker deviceChecker = instance;
        return deviceChecker == null ? new DeviceChecker() : deviceChecker;
    }

    private String getProp(Context context, String str) {
        try {
            Class loadClass = context.getClassLoader().loadClass("android.os.SystemProperties");
            return (String) loadClass.getMethod("get", new Class[]{String.class}).invoke(loadClass, new Object[]{str});
        } catch (Exception e) {
            return null;
        }
    }

    private boolean isSupportTelePhony() {
        boolean hasSystemFeature = this.mContext.getPackageManager().hasSystemFeature("android.hardware.telephony");
        StringBuilder sb = new StringBuilder();
        sb.append("Supported TelePhony: ");
        sb.append(hasSystemFeature);
        log(sb.toString());
        return hasSystemFeature;
    }

    /* access modifiers changed from: private */
    public void log(String str) {
        if (this.isDebug) {
            Log.d(LOG_TAG, str);
        }
    }

    public void CheckRooting(String str) {
        UnityPlayer.currentActivity.runOnUiThread(new 2(this, str));
    }

    public void CheckRunningApp(String str) {
        UnityPlayer.currentActivity.runOnUiThread(new 3(this, str));
    }

    public void DetectDevice(String str) {
        UnityPlayer.currentActivity.runOnUiThread(new 1(this, str));
    }

    public String GetRunningApp() {
        StringBuilder sb = new StringBuilder("");
        try {
            RunningAppProcessInfo.class.getDeclaredField("processState");
        } catch (Exception e) {
        }
        for (RunningAppProcessInfo runningAppProcessInfo : ((ActivityManager) this.mContext.getSystemService("activity")).getRunningAppProcesses()) {
            StringBuilder sb2 = new StringBuilder();
            sb2.append(runningAppProcessInfo.processName);
            sb2.append("|");
            sb.append(new String(sb2.toString()));
        }
        return sb.toString();
    }

    public void Init(String str, String str2, String str3, String str4) {
        this.mObjectName = str4;
        this.isDebug = str.equals("y");
        this.isTelephony = str2.equals("y");
        this.isCheckPackage = str3.equals("y");
    }

    public List<String> getPackageNameList() {
        return this.mListPackageName;
    }
}


처음엔 해당 정보에 나오는 값만 build.prop에서 바꾸면 될 줄 알았는데 안되네요.
반대로 true만 찾아도 다 변경해도 안되네요.
메모리 변조나 그런게 아니라 단지 디텍터 우회만 연구 중인데
제가 생각 했던 방법은 검색 해보니 대부분 이미 누군가 썻다가 막혔거나 불가능한 방식이네요

제발 도움 좀 부탁 드립니다 ㅠㅠ
3일째 죽을 거 같네요
2 Comments
8 리피트싯 2020.03.27 17:42  
? 디텍을 true가아니라 false로해야하는거아닌가?
2 쿠쿠닭스 2020.03.28 06:05  
둘 다 해봤는데 결국 게임 실행 되고 화면에서 멈추네요....
어우 힘빠져....
리피트싯님 답변 너무 감사합니다.