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


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>

            if (a(strArr[i4])) {

                i2 = 1 << i4>

            } else {

                i2 = 0;

            }

            i3 |= i2;

            a(strArr[i4]);

        }

        int i5 = 10;

        for (int i6 = 0; i6 < 11>

            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;

        }

    }


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


 


温馨提示! 你需要支付 ¥0.00 元后才能查看付费内容 微信支付 支付宝支付 余额支付
点赞(0) 打赏

Comment list 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部