一:使用framework 注入
- 新建工程,使用第四讲的方法重签名APP,使新工程跑起来(加载的是重签名的APP)
- 新建framework(myF),将库文件加载到APP包里边,跑起来,看看打印🍺没有,如果打印,说明注入成功,如果没有打印,注入失败

- 结果是失败,why?因为frameworks 文件夹里边没有新建的myF.framework,所以不会加载新建的framework,也不会打印🍺

- 还有一种方法证明:查看machO文件,LC_LOAD_DYLIB 里边是否有新建的framework(machO文件里边的LC_LOAD_DYLIB 字段就是当前APP 使用的三方库,Value 里边保存的就是这个库的路径)

- 那么怎么才能让新建的framework,加载到frameworks文件夹里边呢(使 LC_LOAD_DYLIB 包含新建的framework)?
- 使用yololib工具给原始的app 包里边注入你自己新写的Framework (修改mochO文件)
3.1 打开原始的app 包,找到Framework 路径,例如:Frameworks/myF.framework/myF

3.2 在app包 里边直接执行 yololib 命令,注入成功

【注】
-
1.为什么不是用重签名完成的app 而是原始的app?
首先:xcode 运行 先编译你自己的工程,如果这时候注入Framework,那么就直接打包到Frameworks 文件夹里边去了
然后:再执行重签名,原始app 直接覆盖 xcode 编译完成的app 包,所以注入也就失败了(使用这种覆盖app欺骗的xcode 的方法来进行重签名) -
2.为什么不重签名不一次性签名成功,每次启动都要重新签名一次?
重签名的本质就是解密app包,苹果的加密过程我们不知道,(就算是破解了加密过程,如果苹果修改了加密过程,就的重新破解,费时费力),所以重签名的过程是:当app启动的时候(app加载到内存的时候,这个时间app是解密的),再进行重签名、 -
3.可以直接把yololib 放到usr/local/bin 目录下,终端直接敲yololib 命令

- 4.简易方法
如果重签名使用的是 shell 脚本的方法,可以在脚本里边直接添加下边的一句,直接重签和注入都使用sell 脚本完成,比较方便(原理其实是一样的,都使用yololib 命令,只是操作简化了)

二. 使用dylib 代码注入
- 新建一个dylib

- 修改dylib 的 Base SDK 属性,原来为 macOS ,修改为ios(因为 dylib 是 macOS的,现在要加载到app里边,所以要改)

- 新建一个 copy Files ,add 自己的dylib

【注】为什么要新建一个copy Files?
因为编译完成以后,dylib 没有直接加入到Frameworks 文件夹里边,使用这个可以
第一种Framework注入的时候,在高版本的Xcode中直接加入到文件夹里边,而低版本的Xcode也需要这样配置
- 直接使用shell 脚本的方法(为了简便),完成

- 当使用免费证书的时候,会出现崩溃

-
崩溃内容:新建的库签名信息有问题?去掉第3步,直接把 dylib 打包好丢入到原始app包里边,重新打包,然后再重签名,代码注入就好了。
【注】Framework 和 dylib 的区别请参考 [https://www.jianshu.com/p/a37328bcee8f](https://www.jianshu.com/p/a37328bcee8f) 2种方法,推荐使用Framework 注入 以上2种方法只是为了加载自己写的代码,而更改程序执行的流程就用到了方法交换(method swizz)
三. method swizzle
- 定义:利用oc 的runtime 特性,动态的改变SEL(方法编号)和IMP(方法实现)的对应关系,达到方法执行流程改变的目的

- 例如:VC 里边的viewDidLoad 方法

- 除了exchange 方法还有以下的方法,可以使用

【注】
如果hook(exchange)系统的方法,可以创建一个系统类的分类。
而如果hook自定义的类的方法,那么就会崩溃,详见下图:

- 为什么呢?看下图:

【注】:self 是当前方法的调用者,当前方法的调用者是person 而不是 hook ,所以就崩溃了。
- 怎么解决这个问题呢?
-
给person add 一个分类(如果是重签名app,hook原来app的方法,给原来app 的类新建一个分类是行不通的)
-
使用addmethod 方法,给person 类动态的添加一个方法,然后exchange 这2个方法,如图:
-

- 使用replaceMethod 方法,直接替换person 的方法

- 使用get 和 set 方法

网友评论