某APP中模拟器检测

简介: 模拟器检查

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

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;
    }
}
相关文章
|
5月前
|
安全 测试技术 网络安全
APP攻防-资产收集篇&反证书检验&XP框架&反代理VPN&数据转发&反模拟器
APP攻防-资产收集篇&反证书检验&XP框架&反代理VPN&数据转发&反模拟器
|
6月前
|
安全 定位技术 网络安全
禁止应用在模拟器上运行的方案及app安全问题
禁止应用在模拟器上运行的方案及app安全问题
711 1
|
安全 Shell 网络安全
Charles - 夜神模拟器证书安装App抓包
Charles - 夜神模拟器证书安装App抓包 前言 一、软件安装 1.Openssl安装 1.1下载安装 1.2配置环境变量 1.3查看openssl版本,输入命令:openssl version 2.夜神模拟器安装 1.1 下载安装 1.2工具准备,MT管理器 3.Charles安装 二、Charles 安装证书,抓包 1.Charles破解 2.安装证书并导出 3.开启代理模式 4.证书格式化 5.通过MT管理器将证书配置到模拟器中 6.模拟器WiFi填入Charles代理的IP和端口 7.抓包示例
1293 0
Charles - 夜神模拟器证书安装App抓包
|
6月前
|
XML 监控 Java
Android App开发之事件交互Event中检测软键盘和物理按键讲解及实战(附源码 演示简单易懂)
Android App开发之事件交互Event中检测软键盘和物理按键讲解及实战(附源码 演示简单易懂)
723 0
|
iOS开发
scenePhase 的作用 -- 检测 APP 是否在后台
SwiftUI 提供了一个名为 `scenePhase` 的 环境变量,它在应用程序在前台、后台和非活动状态之间切换时会自动更新。你可以在 App 结构体本身或任何 SwiftUI 视图中观察这些状态的变化。
scenePhase 的作用 -- 检测 APP 是否在后台
|
机器学习/深度学习 人工智能 分布式计算
基于YOLOv5算法的APP弹窗检测方案
基于YOLOv5算法的APP弹窗检测方案
|
安全 Shell 网络安全
Fiddler - 夜神模拟器证书安装App抓包
文章目录 Fiddler- 夜神模拟器证书安装App抓包 前言 一、软件安装 1.Openssl安装 1.1下载安装 1.2配置环境变量 1.3查看openssl版本,输入命令:openssl version 2.夜神模拟器安装 1.1 下载安装 1.2工具准备,MT管理器 3.Fiddler安装 1.1下载安装 二、Fiddler 安装证书 1.安装证书并导出 2.格式化证书 3.通过MT管理器将证书配置到模拟器中 4.模拟器WiFi填入Fiddler代理的IP和端口 5.抓包示例
1013 0
Fiddler - 夜神模拟器证书安装App抓包
|
存储 编解码 Android开发
|
存储 数据采集 人工智能
App隐私合规“免费”自动化检测
App隐私合规检测提供了全面的隐私合规检测报告和专家建议,从确保形式合规(隐私政策文本合规性)及实质合规(代码层合规性)的一致性,从个人信息收集、权限使用场景、超范围采集、隐私政策、三方SDK等多个维度帮助企业和开发者提前识别App隐私合规相关风险,规避监管通报、应用下架等重大风险。
4470 1
App隐私合规“免费”自动化检测