转自:https://www.wireghost.cn/2018/05/10/Android模拟器检测体系梳理/算法
模拟器做为一种虚拟机,配合改机工具,可以以较低成本实现设备多开,所以而备受黑灰产的青睐。如何准确识别模拟器成为App开发中的一个重要模块,目前也有专门的公司提供相应的SDK供开发者识别模拟器。经过前段时间对模拟器检测技术的调研,但愿能总结出一套特征挖掘的体系化方案。缓存
安卓模拟器是一种能够运行在电脑上的虚拟设备,经过它能够实现应用的跨平台操做,让移动端APP无需任何改动便可在PC上执行。网络
随着技术的不断发展,目前模拟器基本已经可以完成手机90%以上的功能。此外,因为在PC端工做,与传统手机相比,具备如下几点优点:架构
此外,Android模拟器鉴于自身技术瓶颈,也存在如下广泛问题:app
模拟器是用软件来模拟硬件操做,这就须要用到虚拟化技术。广义的虚拟化,是指将网络、CPU、内存及存储等各类实体资源,予以抽象、转换后呈现出来,进而打破实体结构间不可切割的障碍,使用户能够比本来的组态更好的方式来应用这些资源。咱们所熟知的虚拟机就是虚拟化技术中的一种,一般来讲它们只是模拟了一套与Host主机相同架构、相同指令集的硬件平台,不涉及内存和CPU的虚拟化。全部的Android模拟器都在不一样程度上运用了虚拟化技术,好比雷电、夜神,包括Bluestack模拟器是基于Virtualbox虚拟机,谷歌原生模拟器和红手指云模拟器则是应用了Qemu的虚拟化技术。框架
目前,已知的全部ARM架构的模拟器都是基于Qemu虚拟机。Qemu采用的是纯软件模拟,在物理机的操做系统上建立一个模拟硬件的程序来仿真全部想要的硬件,而后在上面跑ARM运行时。在这种环境下,因为程序每次执行都须要将其翻译成宿主机(X86)的指令,致使性能很是低下,这也是原生模拟器不够流畅的缘由之一。工具
当下主流的Android模拟器都是X86架构,基于Virtualbox虚拟机。因为不须要作CPU虚拟化,少了一层指令集转换过程,所以在运行支持X86架构的app时,就和普通的虚拟机没有区别,速度也就明显提升了不少。
此外,针对ARM架构的兼容性问题,广泛采用的是半虚拟化,根据二进制翻译技术将ARM指令动态翻译成X86指令。性能
目前市面上安卓模拟器软件种类繁多,有5一、mumu、蓝叠、夜神、逍遥、海马玩、雷电等等。经过在黑产汇集论坛、QQ群等多个渠道进行调研,咱们发现黑产当下经常使用的是夜神、雷电和逍遥模拟器。能够注意到,这些模拟器的共通点是都自带修改设备参数、多开、操做录制和虚拟定位等功能。
学习
模拟器检测的本质就是要利用模拟器和真机之间的微小差别,从而判断当前设备是否为模拟器,具体检测技术框架整理以下:atom
结合前面梳理出的模拟器检测框架,后续在作相应的特征挖掘时,可直接根据该脑图作进一步的完善和增强。
特征项 | 细分点 | 描述 | 备注 | |
软件信息 | 应用层 | |||
系统库 | ||||
无线射频 | WIFI | |||
GPS | ||||
… | ||||
硬件信息 | 底层硬件 | CPU | ||
电池 | ||||
设备参数 | ||||
硬件抽象层 | 图形 | |||
相机 | ||||
蓝牙 | ||||
输入 | ||||
存储 | ||||
传感器 | ||||
文件系统(重点关注Linux内核相关) | 检查/sys硬件驱动信息 | |||
检查/dev设备节点特征 | ||||
检查/proc运行时的内核信息映射 | ||||
… |
此外,基于文件系统差别的特征挖掘,具体可参考Android根目录文件结构进行操做,如下是几个重要的目录/文件的说明:
模拟器与真机的本质区别在于运行载体,市面上已知的ARM模拟器都是基于qemu虚拟机。因为qemu在执行程序时其实是将其翻译成宿主机的指令,好比将安卓的arm指令翻译成PC的x86指令。为了效率上的考虑,qemu在翻译执行arm指令时并无实时更新模拟的pc寄存器值,只会在一段代码翻译执行完以后再更新,而真机中pc寄存器是一直在更新的。根据这一点,能够设计一段CPU任务调度程序来检测模拟器。
优势:由于是基于qemu的二进制翻译技术来作特征检测,因此可以很好的识别这类Android模拟器。
缺点:
因为绝大部分手机都是基于ARM架构,而模拟器几乎所有是运行在PC的X86架构上。所以,能够利用ARM与X86的底层缓存行为差别来判断是否为真机。
具体来讲,ARM采用的是将指令存储与数据存储分开的哈佛架构,L1 Cache(一级缓存)被分红了平行的两块,即I-Cache(指令缓存)和D-Cache(数据缓存),而X86采用的是将指令存储和数据存储合并在一块儿的冯•诺伊曼结构,L1 Cache是连续的一块缓存。因此,若是咱们经过读写地址指令的方式对一段可执行代码进行动态修改,那么在执行的时候,X86架构上的指令缓存会被同步修改,而对ARM架构而言,这种数据读写操做修改的只是D-Cache中的内容,此时I-Cache中的指令并不会被更新。
优势:可以准确的识别arm和x86架构。
缺点:要执行汇编代码,在不一样的机器设备上须要考虑稳定性和兼容性等问题。实测发现容易引发崩溃,须要配合多进程予以解决。
这种检测方案本质上是对正经常使用户的行为模式进行统计分析,它也许不能有效的对真机和模拟器进行区分,但能够做为风险设备画像的一个参考维度。
检查WIFI列表这种方式,目前没发现明显缺点。当正常手机接入WIFI的时候,周边每每有复数的WIFI信号,而模拟器因为不具有检索周边WIFI的能力,其WIFI列表一般为空或者只有一个WIFI。
这种检测手法的原理是基于模拟器没有真实的GPS模块,一般没法获取到地理位置信息。缺点是部分用户在实际使用中可能会关闭该权限,致使获取不到数据。
特色是用于作特征检出的目录文件与底层硬件的关联性越强,其效果越好,反之越可能失效。建议尽可能提取和虚拟机、硬件驱动相关的文件特征,缺点是部分特征可能须要结合大量的机型数据作可靠性验证。