1. Cydia Substrate 和 Mobile Substrate
- Cydia Substrate 原名为 Mobile Substrate 已经正式更名为 Cydia Substrate。
- 它是越狱后cydia插件/软件(主要指theos开发的tweak)运行的一个基础依赖包。提供软件运行的公共库,可以用来动态替换内存中的代码、数据等,所以iOS系统越狱环境下安装绝大部分插件,必须首先安装Cydia Substrate。
- Cydia Substrate主要由3部分组成:MobileHooker,MobileLoader 和 safe mode。
2.MobileHooker
MobileHooker用于替换覆盖系统的方法,这个过程被称为Hooking(挂钩)
它主要包含两个函数:
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++函数
Logos语法%hook就是对此函数做了一层封装,让编写hook代码变的更直观,上面的例子用的就是logos语法。
- MSHookMessageEx
void MSHookMessageEx(Class _class, SEL message, IMP hook, IMP *old);
NSString *(*oldDescription)(id self, SEL _cmd);
// implicit self and _cmd are explicit with IMP ABI
NSString *newDescription(id self, SEL _cmd) {
NSString *description = (*oldDescription)(self, _cmd);
description = [description stringByAppendingString:@"!"];
return description;
}
MSHookMessageEx(
[NSObject class], @selector(description),&newDescription, &oldDescription
);
- MSHookFunction
void MSHookFunction(void *symbol, void *hook, void **old);
void *(*oldConnect)(int, const sockaddr *, socklen_t);
void *newConnect(int socket, const sockaddr *address, socklen_t length) {
if (address->sa_family == AF_INET) {
sockaddr_in *address_in = address;
if (address_in->sin_port == htons(6667)) {
sockaddr_in copy = *address_in;
address_in->sin_port = htons(7001);
return oldConnect(socket, ©, length);
}
}
return oldConnect(socket, address, length);
}
MSHookFunction(&connect, &newConnect, &oldConnect);
3. MobileLoader
- MobileLoader 将tweak插件注入到第三方应用程序中(动态注入:ptrace)
- 启动时MobileLoader会根据/Library/MobileSubstrate/DynamicLibraries/目录中plist文件指定的作用范围,有选择的在第三方进程空间里通过dlopen函数加载同名的dylib。
- 每一个.dylib文件都会有一个同名的.plist文件。.plist文件的作用就是用来指定tweak插件的作用对象。
luz-iphone:/Library/MobileSubstrate/DynamicLibraries root# pwd
/Library/MobileSubstrate/DynamicLibraries
luz-iphone:/Library/MobileSubstrate/DynamicLibraries root# ls
AppList.dylib@ MFService.dylib* MyFirstReProject.plist afc2dService.dylib*
AppList.plist MFService.plist* PreferenceLoader.dylib* afc2dService.plist
MFAccelerator.dylib* MFServiceEx.dylib* PreferenceLoader.plist patcyh.dylib@
MFAccelerator.plist* MFServiceEx.plist* RHRevealLoader.dylib* patcyh.plist
MFHongbaoRobot.dylib* MobileSafety.dylib* RHRevealLoader.plist
MFHongbaoRobot.plist* MobileSafety.plist RocketBootstrap.dylib@
MFService.bundle/ MyFirstReProject.dylib* RocketBootstrap.plist
4. safe mode
- 因为APP程序质量参差不齐崩溃再所难免,tweak本质是dylib,寄生在别人进程里,如注入Springboard等,系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。
- 所以CydiaSubstrate引入了安全模式,在安全模式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复。
删除Tweak插件包
ssh到iPhone
dpkg -r com.iosre.myfirstreprojec 可以删除对应的Tweak插件包
网友评论