Android检测模拟器
1. 前言
模拟器大家都应该很熟悉的吧!现在市面上的模拟器多的数不清,例如:雷电模拟器、夜神模拟器等等。而因为模拟器所搭载的Android系统是阉割过的,一些安全相关的功能都没有了。这就造成了一个安全问题,在模拟器运行的APP,可被动态调试、抓取数据等,从而增大APP被破解、敏感数据遭泄露的风险。所以一些公司就会禁止用户在模拟器中使用他们的APP。
那怎么检测APP当前运行的环境是模拟器呢?接下来我就介绍一个方案给大家吧!
2. 解决方案
网上相关资料其实蛮多的,但是因为模拟器的技术也在逐步增长,所以有些资料其实并没有完全有用,还是会出现无法检测某些模拟器。
我在GitHub上发现了一个开源项目 anti-emulator 。经测试可以检测出市面上较常用的模拟器。我将关键代码提取了出来,封装成一个module,详见 lib_anti_emulator。
我封装了两个方法,如下所示:
/*** 检测是否是模拟器** @param context 上下文* @return true:是模拟器;false:不是模拟器*/
public static boolean check(Context context) {try {return isTaintTrackingDetected(context) || isMonkeyDetected() || isDebugged()|| isQEmuEnvDetected(context);} catch (Exception e) {e.printStackTrace();return false;}
}/*** 检测是否是模拟器,安全模式<br>* 机制较弱,可避免部分真机被识别为模拟器,但是这也造成了有些模拟器无法被识别** @param context 上下文* @return true:是模拟器;false:不是模拟器*/
public static boolean checkSafely(Context context) {try {return isTaintTrackingDetected(context) || isMonkeyDetected() || isDebugged()|| isQEmuEnvSafeDetected(context);} catch (Exception e) {e.printStackTrace();return false;}
}
这两个方法的区分,看注释大家也应该很清楚了。而这也是 anti-emulator 的最大缺点,可以说是检测机制太强,或者说某些真机系统被魔改了,造成真机会被错误识别为模拟器的bug。所以如果使用 check
方法,为了避免用户无法正常使用APP,就需要我们再做一些处理,例如当被检测为模拟器时,可以弹出窗口,引导用户上报相关真机信息,然后后台审核并记录这些信息,将此用户所使用的真机加入白名单,免检测模拟器。
当然如果APP不需要这么强的检测机制的话,那就用 checkSafely
方法就行了。
3. 演示
我在我的 BlogDemo 中已加入演示代码,感兴趣的可以去看看。下面是演示的相关内容,演示环境是雷电模拟器。
3.1 标准模式
能够正确检测模拟器,提示“是模拟器”。
3.2 安全模式
不能够正确检测模拟器,提示“不是模拟器”。PS:雷电模拟器的仿真程度真高,所以平时大家调试APP的时候,如果不想用真机,可以试试雷电模拟器哦!比起 Android Studio 自带的模拟器,不会那么吃 CPU 和内存。
如果想进一步交流和学习的同学,可以加一下QQ群哦!
Android检测模拟器相关推荐
- Android恶意软件模拟器检测技术
前言 下面的报告来自SophosLabs实验室的Android安全专家陈宇,还有来自Android组的成员William Lee, Jagadeesh Chandraiah and Ferenc Lá ...
- Android Studio模拟器启动时显示Could not automotically detect an ADB binary
Android Studio模拟器启动时,会显示Could not automotically detect an ADB binary.的提示信息如图1所示. 图1 提示信息 图1中的提示信息的意思 ...
- Android反模拟器的总结
0x00背景: 很多病毒都很先检测检测运行环境.如果不是沙箱环境就释放恶意代码. 我们来总结他检测了哪些模拟器的特性 0x01检测特定文件 检测一些系统特定属性,如检测当前设备手机号,设备Device ...
- android SDK模拟器环境搭建
android SDK模拟器环境搭建 一.下载安装android SDK 两种方式: (1)官网下载(需FQ):https://developer.android.com/studio/index.h ...
- Android Studio 模拟器卡慢、占内存解决方法
Android Studio 模拟器卡慢.占内存解决方法 Android Studio 模拟器卡慢.占内存解决方法 在使用Android virtual device来进行调试运行时会比较慢,性能也不 ...
- 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)
源:介绍一款比Android原生模拟器还要快的模拟器Genymotion
- 更改android AVD模拟器创建路径位置的方法
2019独角兽企业重金招聘Python工程师标准>>> 使用eclipse创建的android AVD模拟器,默认位置一般在用户文件夹下的.android文件夹中,并且路径不可有中文 ...
- android 检测字符串是否为合法域名
今天,简单讲讲android里如何检测输入的字符串为合法的域名. 这个昨天搜索了很多资料,基本没有找到符合要求的代码.后来,花了很多时间,才解决了问题.这里记录一下. 一.检查输入域名是否合法. 具体 ...
- 解决Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示
Android 启动模拟器是出现" Failed to allocate memory: 8"错误,模拟器无法启动,如下: [2012-11-26 13:40:12 - TestS ...
最新文章
- 开机自启动脚本_Linux配置开机自启动执行脚本的两种方法
- zcmu1540(二分)
- Boost::context模块fiber的分段的测试程序
- (十三)算法设计思想之“动态规划”
- 机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构
- uni-app单个页面的生命周期函数
- 2022年轻人潮流爱好报告:被朋友圈高赞的神秘爱好,不烧钱还能脱单
- matlab grp2idx,求教:m-fold cross validation 在matlab下如何实现?
- 最全常见算法工程师面试题目整理
- [史]世界史上的6大古帝国
- python怎么算列表的平方_总算明了python如何求平方
- 谈Objective-C Block的实现(转载唐巧)
- aspose转pdf不显示中文_Word转PDF后有空白页是怎么回事?
- 判断一个数是否为质数的三种方法
- 从黄金时代到没落尽头,“寻求出售”的GoPro遭遇了什么?
- Spring Boot学习笔记(超详细)
- 【u-boot】u-boot-2016.09 make编译过程分析(二)
- 秒杀微服务实现抢购代金券功能
- mysql学习总结-初识+数据管理+增删改查+常用函数+事务理解+数据库设计+JDBC引入
- EasyUI datagrid列名包含特殊字符(如:%等),会导致表格错位
热门文章
- 如何测试nginx服务器性能测试,Nginx性能测试工具--httperf
- python延时函数 微秒_Python程序可显示当前时,分,秒和微秒
- 剑指offer第二版(leetcode)Java题解(不断更新)
- 8-14-粘包问题、(通过简单报头)解决粘包问题、定制复杂报头
- linux命令英文单词缩写,linux常用命令的英文单词缩写
- 天猫数据爬取解决找不到json文件的问题
- 三阶矩阵的lu分解详细步骤_计算方法(三)矩阵分解2-LU分解
- 计算机专业surface pro,surface pro4家庭版和专业版的不同
- linux系统rc路由配置_Linux下多播路由的实现
- surface pro4 java开发_写给那些想买Surface Pro4的童鞋们