7.1 Mobile Substrate简介
Cydia Substrate
Cydia Substrate(以前叫做MobileSubstrate)是一个框架,允许第三方的开发者在系统的方法里打一些运行时补丁,扩展一些方法,类似OS X上的 Application Enhancer。
saurik为Substrate写了非常全的介绍文档。
Cydia Substrate有3部分组成:
- MobileHooker
- MobileLoader
- safe mode
MobileHooker
MobileHooker用来替换系统函数,这个过程也叫Hooking。有如下的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用来替换Objective-C的函数,MSHookFunction用来替换C/C++函数。具体用法参见这里 和 这里
MobileLoader
MobileLoader把第3方补丁程序加载进入运行的程序中。 MobileLoader首先会通过DYLD_INSERT_LIBRARIES把自己加载进入目标程序,然后它会在/Library/MobileSubstrate/DynamicLibraries/中找到需要加载的动态链接库并加载它们,控制是否加载到目标程序,是通过一个plist文件来控制的。如果需要被加载的动态库的名称叫做foo.dylib,那么这个plist文件就叫做foo.plist,这个里面有一个字段叫做filter,里面写明需要hook进的目标程序的bundle id。
比如,如果只想要foo.dylib加载进入SpringBoard,那么对应的plist文件中的filter就应该这样写:
Filter = {
Bundles = (com.apple.springboard);
};
关于使用DYLD_INSERT_LIBRARIES来注入代码的例子可以参见这里
Safe mode
当编写的扩展导致SpringBoard crash的时候,MobileLoader会捕获这个异常,然后让设备进入安全模式。在安全模式中,所有的第3方扩展都会被禁用。
下面这些signal会触发安全模式: SIGTRAP SIGABRT SIGILL SIGBUS SIGSEGV SIGSYS
小结
本文简要介绍了Cydia Substarte。后面要介绍的越狱程序Tweak,就是利用Cydia Substrate中的MobileLoader来加载的。