某音短视频检测模拟器环境的代码还原

以下的只是分享检测的一部分实现,并且仅为技术研究。

1.检测模拟器的实现

1.检测模拟器的 imsi的 id是否是310260000000000
具体的实现:先判断是否有android.permission.READ_PHONE_STATE权限,在判断当前的运行环境的imsi id 是否是310260000000000这个值,以及判断VoiceMailNumbe是否等于15552175049和 GetDeviceId等于"000000000000000", "012345678912345"这两串值。

    private static boolean a(Context context, String str, String[] strArr, String str2) {
        boolean z;
        boolean z2;
        boolean z3;
        String[] strArr2;
        if (context.getPackageManager().checkPermission("android.permission.READ_PHONE_STATE", context.getPackageName()) == 0) {
            z = true;
        } else {
            z = false;
        }
        if (z) {
            z2 = false;
            for (String str3 : d) {
                if (z2 || StringUtils.equal(str3, str)) {
                    z2 = true;
                } else {
                    z2 = false;
                }
            }
        } else {
            z2 = false;
        }
        if (strArr != null) {
            for (String equal : strArr) {
                if (StringUtils.equal(equal, "310260000000000") || z2) {
                    z3 = true;
                } else {
                    z3 = false;
                }
            }
        }
        if (z2 || StringUtils.equal(str2, "15552175049")) {
            return true;
        }
        return false;
    }

2.检测模拟器的驱动文件内容
具体的检测步骤:判断/proc/tty/drivers 文件是否存在是否可读取。可读情况下读取出具体的内容数据进行比对是否包含goldfish字符串


   private static String[] b = {"goldfish"};
private static Boolean a() {
        String str;
        File file = new File("/proc/tty/drivers");
        if (!file.exists() || !file.canRead()) {
            String str2 = "EmulatorChecker";
            StringBuilder sb = new StringBuilder("can not read file /proc/tty/drivers ,because");
            if (file.exists()) {
                str = "not exist";
            } else {
                str = "not readable";
            }
            sb.append(str);
            Logger.e(str2, sb.toString());
        } else {
            byte[] bArr = new byte[1024];
            try {
                FileInputStream fileInputStream = new FileInputStream(file);
                fileInputStream.read(bArr);
                fileInputStream.close();
            } catch (Exception unused) {
            }
            String str3 = new String(bArr);
            for (String contains : b) {
                if (str3.contains(contains)) {
                    return Boolean.TRUE;
                }
            }
        }
        return Boolean.FALSE;
    }

3.检测模拟器的特定文件及文件属性
具体的步骤:判断读取指定的文件及文件属性,以及判断特有的Genymotion模拟器,采用的是ro.product.manufacturer 读取的手机厂商的方式


 private static int a(h hVar) {

        int i;
        int i2;
        String[] strArr = {"/system/bin/qemu_props", "/system/bin/androVM-prop", "/system/bin/microvirt-prop", "/system/lib/libdroid4x.so", "/system/bin/windroyed", "/system/bin/microvirtd", "/system/bin/nox-prop", "/system/bin/ttVM-prop", "/system/bin/droid4x-prop", "/data/.bluestacks.prop"};
        String[] strArr2 = {"init.svc.vbox86-setup", "init.svc.droid4x", "init.svc.qemud", "init.svc.su_kpbs_daemon", "init.svc.noxd", "init.svc.ttVM_x86-setup", "init.svc.xxkmsg", "init.svc.microvirtd", "ro.kernel.android.qemud", "androVM.vbox_dpi", "androVM.vbox_graph_mode"};
        int i3 = 0;
        for (int i4 = 0; i4 < 10; i4++) {
            if (a(strArr[i4])) {
                i2 = 1 << i4;
            } else {
                i2 = 0;
            }
            i3 |= i2;
            a(strArr[i4]);
        }
        int i5 = 10;
        for (int i6 = 0; i6 < 11; i6++) {
            String str = strArr2[i6];
            if (StringUtils.isEmpty(hVar.a(str))) {
                i = 0;
            } else {
                i = 1 << i5;
            }
            i3 |= i;
            StringUtils.isEmpty(hVar.a(str));
            i5++;
        }
        Pair pair = new Pair("ro.product.manufacturer", "Genymotion");
        String a2 = hVar.a((String) pair.first);
        if (StringUtils.isEmpty(a2) || !a2.contains((CharSequence) pair.second)) {
            return i3;
        }
        return i3 | (1 << i5);
    }


4.判断指定的设备文件是否存在
判断下面三个文件是否存在

private static String[] c = {"/dev/socket/qemud", "/dev/qemu_pipe", "/dev/qemu_trace"};

 private static boolean a(String str) {
        if (StringUtils.isEmpty(str)) {
            return false;
        }
        File file = new File(str);
        if (file.exists()) {
            return true;
        }
        try {
            new FileInputStream(file);
            return true;
        } catch (FileNotFoundException e) {
            if (!e.getMessage().contains("No such file or directory")) {
                return true;
            }
            return false;
        }
    }

更多安全技术文章,请关注“游戏安全攻防”公众号,一起学习,一起进步。


 

猜你喜欢

转载自blog.csdn.net/c_kongfei/article/details/112127797