lamster2018 / EasyProtector

一行代码检测XP/调试/多开/模拟器/root
Apache License 2.0
2.19k stars 437 forks source link

多次调用checkIsRunningInVirtualApk结果会不同 #79

Closed dakun666 closed 3 years ago

dakun666 commented 3 years ago

我在Application的onCreate和LauncherActivity的onCreate及MainActivity的onCreate调用了3次EasyProtectorLib.checkIsRunningInVirtualApk()方法,第1、3次为false,第2次为true,请问为何会出现这种情况?

lamster2018 commented 3 years ago

把每次调用的log发一下

dakun666 commented 3 years ago

这三次取的值会上报服务器,此结果是后续分析得出的,暂未由测试复现。 从服务器的结果看也暂未发现与机型系统存在什么关联性,即大部分机型和系统都有可能会出现这种情况。 后续测试日志出来后会传上来

dakun666 commented 3 years ago

解决了。分两步说明。 1.我在调用checkIsRunningInVirtualApk时并没有传packagename而是一个固定的值,因为存在多个马甲包装入手机的现象导致会命中。改为传入packagename即解决。 2.上文所说同个app多次调用结果不同的问题是因为使用了多进程调用,主进程调用不会命中而子进程再次调用则会命中。此时传入currentProcessName即解决。currentProcessName获取方法如下

public static String getCurrentProcessName() {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream("/proc/self/cmdline");
        byte[] buffer = new byte[256];// 修改长度为256,在做中大精简版时发现包名长度大于32读取到的包名会少字符,导致常驻进程下的初始化操作有问题
        int len = 0;
        int b;
        while ((b = fis.read()) > 0 && len < buffer.length) {
            buffer[len++] = (byte) b;
        }
        if (len > 0) {
            String s = new String(buffer, 0, len, "UTF-8");
            return s;
        }
    } catch (Exception e) {
        Timber.e(e);
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (Exception e) {                                                            

            }
        }
    }
    return null;
}
lamster2018 commented 3 years ago

解决了。分两步说明。 1.我在调用checkIsRunningInVirtualApk时并没有传packagename而是一个固定的值,因为存在多个马甲包装入手机的现象导致会命中。改为传入packagename即解决。 2.上文所说同个app多次调用结果不同的问题是因为使用了多进程调用,主进程调用不会命中而子进程再次调用则会命中。此时传入currentProcessName即解决。currentProcessName获取方法如下

public static String getCurrentProcessName() {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream("/proc/self/cmdline");
        byte[] buffer = new byte[256];// 修改长度为256,在做中大精简版时发现包名长度大于32读取到的包名会少字符,导致常驻进程下的初始化操作有问题
        int len = 0;
        int b;
        while ((b = fis.read()) > 0 && len < buffer.length) {
            buffer[len++] = (byte) b;
        }
        if (len > 0) {
            String s = new String(buffer, 0, len, "UTF-8");
            return s;
        }
    } catch (Exception e) {
        Timber.e(e);
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (Exception e) {                                                            

            }
        }
    }
    return null;
}

你要不要提个 pull request进来

dakun666 commented 3 years ago

解决了。分两步说明。 1.我在调用checkIsRunningInVirtualApk时并没有传packagename而是一个固定的值,因为存在多个马甲包装入手机的现象导致会命中。改为传入packagename即解决。 2.上文所说同个app多次调用结果不同的问题是因为使用了多进程调用,主进程调用不会命中而子进程再次调用则会命中。此时传入currentProcessName即解决。currentProcessName获取方法如下

public static String getCurrentProcessName() {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream("/proc/self/cmdline");
        byte[] buffer = new byte[256];// 修改长度为256,在做中大精简版时发现包名长度大于32读取到的包名会少字符,导致常驻进程下的初始化操作有问题
        int len = 0;
        int b;
        while ((b = fis.read()) > 0 && len < buffer.length) {
            buffer[len++] = (byte) b;
        }
        if (len > 0) {
            String s = new String(buffer, 0, len, "UTF-8");
            return s;
        }
    } catch (Exception e) {
        Timber.e(e);
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (Exception e) {                                                            

            }
        }
    }
    return null;
}

你要不要提个 pull request进来

好的,我整理下