基于模拟器特征的反模拟器检测(二)

/ 2评 / 0

上一篇讲到了利用一些特有prop属性和特征文件去检测,这次利用一些设备关键信息去检测:

经过多次研究发现,当尝试去检测模拟器cpu温度时,返回的永远是0,百度检测Android如何获取cpu温度后,网上提供了个思路,利用:

/sys/class/thermal/

目录下的thermal_zoneX文件,然而在模拟器上打开该目录发现并不存在,只看到两个cooling_deviceX,推测模拟器不能真实检测设备温度,利用这一特征,通过下面的方法:

int checkTemp() {
    DIR *dirptr = NULL; //当前手机的温度检测,手机下均有thermal_zone文件
    int i = 0;
    struct dirent *entry;
    if ((dirptr = opendir("/sys/class/thermal/")) != NULL) {
        while (entry = readdir(dirptr)) {
            // LOGE("%s  \n", entry->d_name);
            if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) {
                continue;
            }
            char *tmp = entry->d_name;
            if (strstr(tmp, "thermal_zone") != NULL) {
                i++;
            }
        }
        closedir(dirptr);
    } else {
        LOGE("open thermal fail");
    }
    return i;
}

同时,由于模拟器运行在电脑上,那一般的电脑就是amd和intel处理器了,因为没有amd电脑,所以光测试了intel的处理,当尝试在模拟器上去获取cpu信息时,直接拿到了当前电脑的cpu型号,利用这一特性:

void getCpuInfo() { //获取cpu型号
    char *info = new char[128];
    char *split = ":";
    char *cmd = "/proc/cpuinfo";
    FILE *ptr;
    if ((ptr = fopen(cmd, "r")) != NULL) {
        while (fgets(info, 128, ptr)) {
            if (strstr(info,
                       "Hardware")) {  //真机一般会获取到hardware,示例:Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)
                strtok(info, split);
                char *s = strtok(NULL, split);
                LOGE("the cpu info is %s", s);
                break;
            } else if (strstr(info,
                              "model name")) { //测试了一个模拟器,取到的是model_name,示例:Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
                strtok(info, split);
                char *s = strtok(NULL, split);
                LOGE("the cpu info is %s", s);
                break;
            }
        }
    } else {
        LOGE("NULLLLLLLLL");
    }
}

在测试真机时发现没有model_name这一栏,通过分析知名检测工具cpu_Z也发现,这些参数都是通过if判断的,不代表格式固定,这里挑了两项,都可以拿到cpu信息,通过cpu信息也比较好判断是否是模拟器。

最后一个就是proc下的version文件了,通过cat这个文件就可以取到当前的内核版本号:

void getVersionInfo() {   //获取设备版本,真机示例:Linux version 3.4.0-cyanogenmod (ls@ywk) (gcc version 4.7 (GCC) ) #1 SMP PREEMPT Tue Apr 12 11:38:13 CST 2016
// 海马玩:   Linux version 3.4.0-qemu+ (droid4x@CA) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #25 SMP PREEMPT Tue Sep 22 15:50:48
    char *info = new char[128];
    char *split = ":";
    char *cmd = "/proc/version";
    FILE *ptr;
    if ((ptr = fopen(cmd, "r")) != NULL) {
        while (fgets(info, 128, ptr)) {
            LOGE("the version info is %s", info);
        }
    } else {
        LOGE("NULLLLLLLLL");
    }
}

2条回应:“基于模拟器特征的反模拟器检测(二)”

  1. Howsk说道:

    汤神好牛逼。

  2. jee说道:

    小米2S居然给我温度检测为0°……………醉了,我试试CPU检测…

发表评论

电子邮件地址不会被公开。 必填项已用*标注