模拟器检测手段也常用于APP的应用安全防护上,防止利用模拟器进行刷单,刷流量等恶意操作,所以也需要获取设备返回的一些信息来鉴别设备的真伪。
android.os.Build类包含设备硬件和版本信息。可以通过提取该类的静态字段来检测模拟器。
/system/build.prop 是一个属性文件,在Android系统中.prop文件定义了系统初始(或永久)的一些参数属性、功能的开放等
Systemproperties类在android.os下,但这个类是隐藏的,上层程序开发无法直接使用。用java的反射机制可以使用这个类来设置和获
大部分真机都是使用ARM架构,而模拟器运行在PC上的X86架构。因此可以利用ARM与X86的区别。来判断是否是真机。
对于使用qume的模拟器,可以通过qemu二进制翻译(Binary Translation)的一个优化特性来检测模拟器
物理CPU会在每执行一条指令以后,就把程序计数器加一,程序计数器永远都是最新的值。Qemu是在遇到需要返回最新值的时候才会更新程序计数器,其他时候不会每次都更新,来作为一种优化措施。因此,程序计数器会指向一个代码块的最开始位置,因为每次进行分支跳转的时候才需要更新程序计数器。
ARM采用的哈佛架构将指令存储跟数据存储分开,与之对应的,ARM的一级缓存分为I-Cache(指令缓存)与D-Cahce(数据缓存),而X86只有一块缓存,将一段代码可执行代码动态映射到内存,在执行的时候,X86架构上是可以修改这部分代码的,而ARM的I-Cache可以看做是只读,因为,当我们往PC对应的地址写指令的时候,其实是往D-Cahce写,而I-Cache中的指令并未被更新,这样,两端程序就会在ARM与x86上有不同的表现,根据计算结果便可以知道究竟是还在哪个平台上运行

