上一篇文章我介绍了 iOS 内核级越狱检测屏蔽方案:KernBypass,在本文中看川将继续介绍另一种 iOS 越狱检测屏蔽插件 Shadow。
Shadow 插件由开发者 jjolano 开发,目前项目开源在 github上:
https://github.com/jjolano/shadow
在越狱 iPhone 上安装 Shadow
项目 README 中有详细说明:
Add https://ios.jjolano.me to your package manager and install the Shadow (me.jjolano.shadow
) package. Alternatively, download the latest release directly from GitHub and open the file with your package manager.
You may need additional repositories for dependencies - these are the current dependencies:
libSandy
from opa334's Repo (preferences - sandboxed loading)AltList
from opa334‘s Repo (preferences - application listing)HookKit Framework
(hooking + change hooking library feature)RootBridge Framework
(rootless compatibility/universal binary building)
A recommended (but not required) package is Injection Foundation
from PoomSmart's Repo (https://poomsmart.github.io/repo
). This package ensures that Shadow is injected properly into certain apps.
Shadow 拥有强大的 Hook 能力
一般的越狱检测思路,无非就是检查特定文件目录路径是否存在:
- /Applications/Cydia.app
- /Library/MobileSubstrate
- ...
检查 stat、access、dladdr 等基础 API 是否在合法的动态库中,判断是否有 DYLD_INSERT_LIBRARIES
特征环境变量等。
但这些手段,都扛不住 Hook。
可以在 Shadow 的设置页面针对指定 App 启用不同特性的 Hook,特性全部开启,屏蔽效果更佳。
Shadow 内置了对众多关键系统 API 的 Hook,看川粗略分析,Hook 的系统方法包括但不限于:
_dyld_image_count
_dyld_get_image_name
_dyld_get_image_header
_dyld_register_func_for_add_image
_dyld_register_func_for_remove_image
dladdr
dlsym
dlopen
access
open
stat
sysctl
task_info
syscall
chroot
ptrace
objc_getClass
class_getImageName
objc_copyClassNamesForImage
objc_copyImageNames
NSFileManager
NSProcessInfo
NSBundle
更强悍的是,jjolano 还贴心地为我们提供了 HookKit 套件,基于 HookKit,可以在 Shadow 中自由切换不同的 Hook 组件,包括 fishhook、libhooker、Substitute等,涵盖了 inline hook、fishhook 以及 Objetive-C Runtime Hook 方式。
以使用 Substitute 为例,当调用 _dyld_image_count
时,在 iOS 12 上测试的正常调用指令如下:
0x200521080 <+0>: adrp x8, 227542
0x200521084 <+4>: add x8, x8, #0xf08 ; gUseDyld3
0x200521088 <+8>: ldrb w8, [x8]
0x20052108c <+12>: cbz w8, 0x200521094 ; <+20>
0x200521090 <+16>: b 0x20052b2f8 ; dyld3::_dyld_image_count()
但启用 Shadow 后变成了:
0x200521080 <+0>: adrp x17, -1047280
0x200521084 <+4>: add x17, x17, #0x870 ; ___lldb_unnamed_symbol234
0x200521088 <+8>: br x17
0x20052108c <+12>: cbz w8, 0x200521094 ; <+20>
0x200521090 <+16>: b 0x20052b2f8 ; dyld3::_dyld_image_count()
br x17
指令即跳转到 Shadow 的实现中,包括 access、stat 等,都是一样的处理逻辑,Shadow 在其内部维护了一个特征字符串列表,比如 /Library/MobileSubstrate、substitute 等,对符合特征的文件路径绕过处理,从而导致常规检测返回错误结果。
这篇文章:iOS有反检测能力的越狱工具shadow的分析和检测 有对 Shadow 的详细分析,可以作为参考。
留言板