发红包

前言

OC 中对某个对象的方法的调用并不像 C++ 一样直接取得方法的实现的偏移值来调用,所以 C++ 方法与实现的关系在编译时就可确定。而 OC 中方法和实现的关系是在运行时决定的。在调用某个对象的方法时,实际上是调用了 obj_msgsend 向对象发送一个名称为方法名的消息,而我们可以替换这个响应这个消息的实现内容。OC 中比较有力的动态特性 Method Swizzing 就是建立在这个基础之上。

参考文章

MobieSubstrate

MobieSubstrate 是现有越狱插件运行的基础;它由3部分组成:

  • MobileHooker

它的作用是替换函数实现

  • MobileLoader

它的作用是加载第三方动态链接库,也就是我们开发的 tweak。在 iOS 启动时,由 launchd 将 MobileLoader 载入内存,然后 MobileLoader 会 dlopen 所有 /Library/MobileSubstrate/DynamicLibraries/ 目录下的动态链接库。
另外我们需要为编写的 tweak 同时编写一个跟 tweak 同名的 plist 文件,指定 tweak 的作用范围。

这个我们要从二进制文件的结构说起,从下面的图来看,Mach-O文件的数据主体可分为三大部分,分别是头部(Header)、加载命令(Load commands)、和最终的数据(Data)。mobileloader会在目标程序启动时,会根据指定的规则检查指定目录是否存在第三方库,如果有,则会通过修改二进制的loadCommands,来把自己注入进所有的app当中,然后加载第三方库。

使用cycript 开始分析

    原文作者:kunnan
    原文地址: https://segmentfault.com/a/1190000011794517
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞