简介
Cydia Substrate (以前叫做MobileSubstrate)是一个框架,运行在越狱iOS设备上,使开发人员可以编写和安装“插件”,以实现 hook并替换系统函数、将第三方动态链接库插入到指定的目标app中等目的。
Cydia Substrate可以实现修改应用程序的行为、自定义用户界面、增强系统功能等功能。
详细的文档:https://www.cydiasubstrate.com/id/264d6581-a762-4343-9605-729ef12ff0af/
组成部分
Cydia Substrate由三部分组成:
- MobileHooker
- MobileLoader
- Safe mode
1) MobileHooker
MobileHooker用来hook并替换系统函数
有如下API可用:
IMP MSHookMessage(Class class, SEL selector, IMP replacement, const char* prefix); // prefix should be NULL.
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
void MSHookFunction(void* function, void* replacement, void** p_original);
MSHookMessageEx用来hook Objective-C的函数,MSHookFunction用来hook C/C++函数。
参见:
https://www.cydiasubstrate.com/api/c/MSHookMessageEx/
https://www.cydiasubstrate.com/api/c/MSHookFunction/
2) MobileLoader
MobileLoader把第三方动态链接库注入运行的目标app中
- MobileLoader首先会通过DYLD_INSERT_LIBRARIES把自己注入目标app
- 然后它会在/Library/MobileSubstrate/DynamicLibraries/中找到需要注入的动态链接库并加载它们
- 控制是否将加载到此目标app,加载规则是通过一个plist文件来控制的。如果动态库的名称叫做foo.dylib,那么这个plist文件就叫做foo.plist,这个里面有一个字段叫做filter,里面写明需要注入的目标app的BundleID
比如,要把foo.dylib注入com.apple.springboard,那么foo.plist文件中的filter就应该这样写:
Filter = {
Bundles = (com.apple.springboard);
};
3) Safe mode
当编写的扩展导致SpringBoard crash的时候,MobileLoader会捕获这个异常,然后让设备进入安全模式。在安全模式中,所有的第3方扩展都会被禁用。
下面这些signal会触发安全模式: SIGTRAP SIGABRT SIGILL SIGBUS SIGSEGV SIGSYS
参考
https://wizardforcel.gitbooks.io/ios-sec-wiki/content/chapter7/issue7-1.html