iOS越狱设备中程序化检测Shadow Tweak以阻止应用访问的最优方案
单纯检查/Library/MobileSubstrate/DynamicLibraries/Shadow.dylib或Shadow.plist这类文件路径的方法可靠性极低——用户可以轻易修改文件名、移动文件位置,甚至通过其他注入方式绕过检测。以下是更可靠的检测方案:
遍历进程加载的动态库列表
通过_dyld_get_image_count()获取当前进程已加载的镜像数量,再用_dyld_get_image_name()逐个获取镜像路径,检查路径中是否包含"Shadow"相关特征字符串。即使文件名被修改,部分特征标识仍可能残留,能有效识别被注入的Shadow动态库。查找Shadow特有的符号/函数
Shadow Tweak在注入后会暴露特定的符号,可通过dlsym(RTLD_DEFAULT, "目标符号名")尝试查找(比如逆向Shadow后得到的_SHIsShadowActive这类专属符号)。如果能成功获取到符号地址,即可判定设备安装了Shadow Tweak。结合越狱环境做专项排查
先通过基础越狱检测(比如检查/Applications/Cydia.app路径、检测ptrace系统调用是否被hook)确认设备处于越狱状态,再针对性执行Shadow的检测逻辑,减少非越狱环境下的误判。检测自身函数是否被Shadow hook
Shadow的核心功能是hook应用函数,可通过mach_vm_read_overwrite()读取自身关键函数的前几个字节,与编译时的原始字节对比。如果字节不一致,结合其他Shadow特征(比如动态库痕迹),即可判断是否被Shadow攻击。
当检测到Shadow Tweak存在时,可直接调用exit(1)终止应用进程,阻止后续访问。
内容的提问来源于stack exchange,提问作者Kasun Ranasinghe

