Android模拟器检测常用方法

简介:

Android开发过程中,防作弊一直是老生常谈的问题,而模拟器的检测往往是防作弊中的重要一环,接下来有关于模拟器的检测方法,和大家进行一个简单的分享。

1.传统的检测方法。

传统的检测方法主要是对模拟器的IMSI、IDS、默认文件等几个方面进行检测。

(1)默认号码:


[java] view plain copy

  1. private static String[] known_numbers = {"15555215554""15555215556",  

  2.             "15555215558""15555215560""15555215562""15555215564",  

  3.             "15555215566""15555215568""15555215570""15555215572",  

  4.             "15555215574""15555215576""15555215578""15555215580",  

  5.             "15555215582""15555215584"};  

(2)默认ID:



[java] view plain copy

  1. private static String[] known_device_ids = {"000000000000000"};  

(3)默认IMSI:



[java] view plain copy

  1. private static String[] known_imsi_ids = {"310260000000000"};  

(4)默认文件路径:



[java] view plain copy

  1. private static String[] known_files = {  

  2.             "/system/lib/libc_malloc_debug_qemu.so",  

  3.             "/sys/qemu_trace",  

  4.             "/system/bin/qemu-props"};  

在得知了这些信息后,只需在运行时进行检测,如果检测结果和默认值吻合,那么检测设备便是模拟器。不过随着防反作弊技术的迭代,现在很多模拟器都可以改变这些值来逃避检测,所以上述传统方法在很多时候未曾达到开发者的预期效果。



2.基于模拟器cpu信息的检测。

成功率相较于传统方法,有了更高的成功率。

cpu信息检测主要是在cpu信息看看是否包含intel、amd等字段,很多模拟器目前对于cpu信息还无法进行模拟。

(1)读取cpu信息:


[html] view plain copy

  1. public static String readCpuInfo() {  

  2.        String result = "";  

  3.        try {  

  4.            String[] args = {"/system/bin/cat", "/proc/cpuinfo"};  

  5.            ProcessBuilder cmd = new ProcessBuilder(args);  

  6.   

  7.            Process process = cmd.start();  

  8.            StringBuffer sb = new StringBuffer();  

  9.            String readLine = "";  

  10.            BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));  

  11.            while ((readLine = responseReader.readLine()) != null) {  

  12.                sb.append(readLine);  

  13.            }  

  14.            responseReader.close();  

  15.            result = sb.toString().toLowerCase();  

  16.        } catch (IOException ex) {  

  17.        }  

  18.        return result;  

  19.    }  

(2)进行判定:



[java] view plain copy

  1. String cpuInfo = readCpuInfo();  

  2. if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {return true;}  

类似的还有



[java] view plain copy

  1. String[] blockList = "google_sdk,sdk,sdk_x86,vbox86p".split(",");  

原理相同。



3.关键路径检测特定模拟器检测

前面2个方法在很大程度上已经可以鉴定出很多模拟器了,但是对于某些在反防作弊上同样热爱的模拟器,需要特定的检测方法。

bluestacks成功躲避了前两种检测方法,所以在这里给予其VIP的待遇。

以下是总结出来的一些bluestacks的关键路径:


[java] view plain copy

  1. private static String[] known_bluestacks = {"/data/app/com.bluestacks.appmart-1.apk""/data/app/com.bluestacks.BstCommandProcessor-1.apk",  

  2.            "/data/app/com.bluestacks.help-1.apk""/data/app/com.bluestacks.home-1.apk""/data/app/com.bluestacks.s2p-1.apk",  

  3.            "/data/app/com.bluestacks.searchapp-1.apk""/data/bluestacks.prop""/data/data/com.androVM.vmconfig",  

  4.            "/data/data/com.bluestacks.accelerometerui""/data/data/com.bluestacks.appfinder""/data/data/com.bluestacks.appmart",  

  5.            "/data/data/com.bluestacks.appsettings""/data/data/com.bluestacks.BstCommandProcessor""/data/data/com.bluestacks.bstfolder",  

  6.            "/data/data/com.bluestacks.help""/data/data/com.bluestacks.home""/data/data/com.bluestacks.s2p""/data/data/com.bluestacks.searchapp",  

  7.            "/data/data/com.bluestacks.settings""/data/data/com.bluestacks.setup""/data/data/com.bluestacks.spotlight""/mnt/prebundledapps/bluestacks.prop.orig"  

  8.    };  


检测方法:



[java] view plain copy

  1. public static boolean checkBlueStacksFiles() {  

  2.         for (int i = 0; i < known_bluestacks.length; i++) {  

  3.             String file_name = known_bluestacks[i];  

  4.             File qemu_file = new File(file_name);  

  5.             if (qemu_file.exists()) {  

  6.                 FkLog.e("Result : Find BlueStacks Files!");  

  7.                 return true;  

  8.             }  

  9.         }  

  10.         FkLog.e("Result : Not Find BlueStacks Files!");  

  11.         return false;  

  12.     }  


这种基于关键路径的检测,便可以成功的检测出bluestacks。



4.模拟器检测新思路

模拟器检测与模拟器反检测都在不断的更新迭代中,无法确保哪一种方法会永垂不朽,在这里分享下新的思路。

电池信息检测

可以从电池的温度和电量等信息入手,检测温度在使用过程中是否一直保持不变、或者是电量一直是固定值并且不是百分之百等等。

亲测可以鉴别出genymotion、bluestacks等主流模拟器。


5.写在最后

其实很多时候在检测模拟器的过程中,都不是只使用某一种固定的方法,一来需要具体问题具体分析,二来也需要用多种方法来综合检测。言而总之,有了十八般武艺才能见招拆招。

ps:如有错误或需要补充的地方,请各位多多指正~













本文转自ljianbing51CTO博客,原文链接: http://blog.51cto.com/ljianbing/1879626,如需转载请自行联系原作者



相关文章
|
3月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
61 0
|
5月前
|
安全 Android开发
夜神模拟器 安卓7.0 burp抓包 https流量
夜神模拟器 安卓7.0 burp抓包 https流量
172 0
|
8月前
|
Android开发
Android RecyclerView的notify方法和动画的刷新详解(二)
Android RecyclerView的notify方法和动画的刷新详解
143 0
|
6月前
|
存储 传感器 定位技术
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
75 0
|
23天前
|
Android开发
Android调用相机与相册的方法2
Android调用相机与相册的方法
17 0
|
3月前
|
安全 Java 数据安全/隐私保护
Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现
Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现
73 0
|
8月前
|
Android开发
Android LayoutInflater.from(context).inflate()方法的作用
Android LayoutInflater.from(context).inflate()方法的作用
48 0
|
4月前
|
XML JSON Android开发
[Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换
[Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换
54 0
|
4月前
|
XML 监控 Java
Android App开发之事件交互Event中检测软键盘和物理按键讲解及实战(附源码 演示简单易懂)
Android App开发之事件交互Event中检测软键盘和物理按键讲解及实战(附源码 演示简单易懂)
132 0
|
4月前
|
XML Java Android开发
Android Studio App自定义控件中视图的构造和测量方法讲解及实战(附源码 实现下拉刷新功能 超详细必看)
Android Studio App自定义控件中视图的构造和测量方法讲解及实战(附源码 实现下拉刷新功能 超详细必看)
42 1