iOSTweak底层实现Cydia Substrate

释放双眼,带上耳机,听听看~!

原来叫Mobile Substrate

他是越狱后插件和软件运行的基础依赖包, 提供动态注入的功能, Logos语法底层就是通过Cydia Substrate实现

主要由三部分组成: MobileHooker, MoblieLoader, safe mode

1. MobileHooker

用于hook方法

主要用到两个函数:
MSHookMessageEx 主要作用于Objective-C方法
MSHookFunction 主要作用于c/c++函数

Logos语法 %hook就是对此函数做了一层封装, 方便编写

  1. MSHookMessageEx

    void MSHookMessageEx(Class _class, SEL message, IMP hook, IMP *old);

    demo:

    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
    );
    1. MSHookFunction

      2.1. MSGetImageByName(== dlopen的功能)
      获取操作对象

      2.2. MSFindSymbol (== dlsym == nlist)
      获取操作对象的方法

      demo:

      MSImageRef image;
      image = MSGetImageByName("/usr/lib/libSystem.B.dylib");
      void *(*palloc)(size_t);
      palloc = (void *(*)(size_t)) MSFindSymbol(image, "_malloc");
      void *data = (*palloc)(1024);
      free(data);
      

      2.3. MSHookFunction

      void MSHookFunction(void *symbol, void *hook, void **old);

      demo:

      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, &copy, length);
      }
      }
      return oldConnect(socket, address, length);
      }
      MSHookFunction(&connect, &newConnect, &oldConnect);
      

2. MoblieLoader

  • 将tweak插件注入到第三方应用程序中(动态注入: ptrace)
  • 启动时MoblieLoader会根据 /Library/MobileSubstrate/DynamicLibraries/ 目录中的plist文件制定的作用范围, 有选择的在第三方进程空间里通过dlopen函数加载同名的dylib

    每一个.dylib, 都有一个同名的.plist,
    .plist的作用就是用来指定tweak插件的作用范围

3. safe mode 安全模式

自己制作的tweak把系统搞崩溃
可以进入到safe mode可以fix tweak造成的崩溃

  1. ssh到 iPhone
  2. 执行: dpkg -r 插件包名(com.app.zhz), 命令执行后其实是删除 /Library/MobileSubstrate/DynamicLibraries/ 目录下该app的tweak

人已赞赏
iOS文章

iOS开发UIImage+Addition

2020-3-4 14:14:21

iOS文章

iOS开发NSDictionary+Addition

2020-3-4 16:14:22

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索