You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android模拟器检测误报问题求助:如何降低真实设备被误判的概率?

Android模拟器检测误报问题求助:如何降低真实设备被误判的概率?

兄弟,你这个真实设备被误判成模拟器的问题太常见了,我之前做反Hook和模拟器检测的时候也踩过这个坑!咱们先从你现有的代码逻辑说起——你现在是通过对比内存里和磁盘上的库(比如libc.so、你的native库)的可执行段校验和来检测异常,但真实设备上完全可能有合法的内存修改场景,比如厂商的系统定制补丁、安全软件的内存防护、甚至系统的热修复机制,都会导致内存和磁盘的库校验和不匹配,被你的逻辑误判成异常。

给你几个实用的优化方向,都是我实际项目里验证过有效的:

  • 细化特征匹配,别单靠校验和一条路走到黑
    你现在的逻辑是只要校验和不匹配就判定异常,但真实设备的合法修改太多了。可以给校验和对比加更多前置条件:

    • 先检查/proc/self/maps里有没有Frida特有的模块,比如libfrida-agent.sofrida-agent-64.so,只有同时出现校验和不匹配+Frida模块存在,才判定被Hook/模拟器异常
    • 校验时只对比库的可执行文本段(text段),别碰数据段——数据段在运行时本来就会被修改(全局变量、动态链接重定位这些都是合法操作),对比数据段肯定会误判
  • 增加多维度检测,用组合特征替代单一特征
    模拟器检测绝对不能只靠内存校验这一个维度,要结合多个只有模拟器才有的特征,比如:

    • 硬件特征:真实设备的ro.product.boardro.hardware是具体的厂商型号(比如sm8350对应骁龙888),而模拟器大多是goldfishranchu这种通用值
    • 系统文件:模拟器会有/system/bin/qemu-props/system/etc/qemu.conf这类特有文件,真实设备基本不会有
    • CPU信息:/proc/cpuinfo里如果出现qemuvirtual这类关键字,大概率是模拟器,真实设备会明确显示骁龙、麒麟、天玑等具体型号
  • 优化库校验的适配逻辑
    不同厂商、不同Android版本的libc.so本身就有差异,你不能用固定的校验值去对比:

    • 动态读取当前设备磁盘上的libc.so的text段校验和,再和内存里的text段对比,而不是用预存的固定值
    • 针对国内厂商的定制libc.so,可以做一个白名单——比如某些厂商会给libc.so加固定的补丁段,你提前识别这些合法偏移,对比时跳过这些区域
  • 引入异常阈值机制,不要一有异常就判定
    单个特征不匹配可能是合法场景,只有多个异常特征同时出现才判定为模拟器:

    • 比如设置一个异常分数:校验和不匹配加1分,检测到goldfish硬件加2分,找到qemu-props文件加2分,只有总分超过3分才判定为模拟器
  • 针对你的现有代码做具体修改
    你的detect_frida_memdiskcompare函数可以这么优化:

    while ((read_one_line(fd, map, MAX_LINE)) > 0) {
        for (int i = 0; i < NUM_LIBS; i++) {
            // 先筛选:目标库 + 可执行段(r-xp)
            if (my_strstr(map, libstocheck[i]) != NULL && my_strstr(map, "r-xp") != NULL) {
                unsigned long mem_start, mem_end;
                sscanf(map, "%lx-%lx", &mem_start, &mem_end);
                // 先判断是否是厂商合法修改的区域
                if (is_vendor_legitimate_modification(mem_start, mem_end)) {
                    continue;
                }
                // 只对比text段的校验和
                if (checksum_mismatch(mem_start, mem_end, libstocheck[i])) {
                    // 不要直接判定,先累加异常分
                    add_abnormal_score(1);
                }
            }
        }
    }
    

    这里的is_vendor_legitimate_modification函数可以用来识别厂商合法的修改偏移,add_abnormal_score用来累计异常值,最后再根据总分判断是否是模拟器。

备注:内容来源于stack exchange,提问作者nima

火山引擎 最新活动