运行环境检测
- 动态分析技术
- 除了静态分析和动态调试,还可用它分析软件
- 基于自定义的沙盒环境,通过 Hook 系统中所有关键 API 来输出程序运行时的动态信息
- 效率较高
- 可在运行时检测软件的运行环境,判断程序是否被第三方恶意使用或跟踪分析
模拟器检测
-
主流沙盒的运行环境都是基于 Android 源码改造的定制版本的模拟器,只要检测运行环境是否为 Android 模拟器,即可判断是否运行于沙盒
-
模拟器和真机的差异:
-
手机服务的差异
- 模拟器中所有与设备运行相关的信息都是被模拟的,包括设备的 ID、手机号、IMEI、IMSI 等,其中最明显的是模拟器中的手机号以 155 开头(正常手机号不可能如此)
- 模拟器启动后会开启 5554 端口,可通过检测该端口是否被使用,从而判断是否运行在模拟器
-
系统属性的差异
-
分别在真机和模拟器的 adb shell 环境中执行
getprop
命令,即可发现系统属性的差异-
真机
-
模拟器
-
-
模拟器中设备厂商、硬件、model 等属性值都固定为 sdk 或 generic,真机不会出现此情况
-
-
系统文件的差异
- 模拟器中有
/init.goldfish.rc
、/system/bin/qemud
这类真机不会有的文件
- 模拟器中有
-
系统硬件的差异
- 模拟器中查看
/proc/cpuinfo
的信息,会显示 Goldfish 之类的字样,真机不会如此
- 模拟器中查看
-
-
示例代码(根据上述信息判断程序是否运行于模拟器):
private boolean checkEMU(Context context) { if ("runchu".equals(getProp(context, "ro.hardware"))) return true; if ("1".equals(getProp(this, "ro.kernel.qemu"))) return true; if ("generic".equals(getProp(context, "ro.product.device"))) return true; if (Build.MANUFACTURER.contains(