在 iOS 越狱设备上,游戏外挂开发人员可以对游戏程序砸壳用于逆向分析,也可以利用 substrate 对游戏逻辑进行 hook 从而制作出各种游戏外挂。这些游戏外挂程序可以被其他越狱玩家直接安装,也可以通过 cydia 商店进行分发。鉴于用户使用越狱设备可能带来不良影响,所以很多 app 都会检测设备是否越狱。
我们可以在网络上找到许多越狱检测代码,像[1] [2] [3],但这些代码存在一些问题。
1. 误报/漏报。这些代码都会检测一些文件是否存在,比如 /Application/Cydia.app。如果一台越狱设备未使用 cydia 商店,就会造成漏报;如果一台设备使用了不完美越狱并使用了 cydia 商店,机器重启后其实已经是未越狱状态,但 /Application/Cydia.app 依然存在,这种情况下就会造成误报。
2. 在反越狱检测插件下失效。市面上存在许多免费的反越狱检测插件,常见的就有 hidejb / abapass / flyjb 等。这些插件对系统接口层做了许多 hook, 过滤所有与越狱相关的字符串,从而使得应用层无法正常检测。下文将分析反越狱插件的一些常见套路。
我们收集并分析了大量反越狱检测插件,这里展示一些它们绕过越狱检测的常用手段。
1. Hook NSFileManager 的 fileExistsAtPath,过滤越狱相关字符串。
2. 伪造进程模块列表,防止越狱相关模块被检测。
3. Hook stat / access / lstat 等 c 层 api, 过滤越狱相关文件。
4. 对 app 代码中的 svc 汇编代码进行 patch hook, 隐藏越狱相关文件。
我们在分析了大量反越狱插件的基础上,针对性地开发了越狱检测模块,该模块具有以下特点:
1. 不使用网上已有的越狱检测代码&思路,避免上文分析到的问题,不误报。
2. 针对反越狱插件做处理,不漏报。
3. 根据多种运行时信息综合判断,对未知反越狱插件/越狱方式做检测。