11. Tweak工作原理

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

http://www.cydiasubstrate.com/api/c/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

http://www.cydiasubstrate.com/api/c/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插件包

你可能感兴趣的:(11. Tweak工作原理)