Framework & 代码注入
前言
经过上一次的 App 重签名,大概过程都熟悉了,现在开始新的练习,代码注入,其实过程很简单,就是重签名 App ,注入动态库。
环境配置
依照上次的步骤,只不过把 上次的 脚本保存下来,以后可以不用编辑,使用罢了。
但是,编译会报错,如下:

可以看到是因为脚本的执行权限问题,因为脚本内有很多文件读写的操作
赋予其执行权限:
chmod +x XcodeSignApp.sh
出了一个小插曲:

因为 文件路径的问题,开始没察觉出来,新建的是 APP 文件夹,但是 脚本中写的是 TargetApp,一定要和脚本一致,低级错误!
编译,OK!
注入原理
有一个问题:我们怎么注入代码呢?我们的工程已经把 app 包给替换了,怎么修改它的代码呢?
Mach-o 文件。
动态注入:在程序运行过程中,通过一些底层的函数去注入。
静态注入:修改 Mach-o 文件 注入。
都是改变的 二进制执行文件,要么把相关的源码打包进二进制文件中,要么动态加载库,系统的 dyld 加载的 如:dylib。
如:查看 WeC 的 Mach-o 文件,可以看到:

有很多的 dylib 文件,这些动态库,在程序启动的时候,Load Commands 列表中的字段,dyld 工具 都会去一个一个的去加载。
那我们注入代码可不可以在 二进制 文件中,添加一个动态库呢???
注入过程
- 新建 library

- 在 库中创建 类,开发逻辑代码。

- 添加依赖关系,编译。

其实,这没添加依赖关系的,Xcode 自动做的,不添加也可以注入成功。


正向开发,只需在代码中导入,但我们要改的是 Mach-o 文件,修改的工具:yololib
这个工具的作用就是:将我们 的动态库路径写入 Mach-o 文件中。
因为经常使用,放入/usr/local/bin
下使用更方便。

- 使用:
yololib WeChat Frameworks/QCHook.framework/QCHook
指令 Mach-o 文件 动态库路径,相对于可执行文件来说的路径。


即代表修改注入成功。
但是运行,你会发现并不会执行注入的代码,因为一开始每次会替换掉你修改的 二进制文件,所以从根源上修改:

修改这一个,Mach-o 文件,解压

- 打包:
zip -ry WeChat.ipa Payload

- 运行成功:

Mach-o 文件中,loadCommands 中注入的动态库。

开不开心???现在就可以随便玩了
注入小结
- 首先是环境的配置,重签名 APP。
- Target 下创建 Framworks ,依赖关系添不添加都可以,Xcode 自动将 Framworks 打包进 App 包 同级目录和 Mach-O 文件里面。
- 但是运行,是不会执行我们注入的动态库中的代码的,但是我们知道 Mach-o 文件中,loadCommands 中的动态库就是 目标 APP 运行需要加载的动态库,所以修改Mach-o 文件,告诉 Mach-O 我们要执行的动态库的路径,就可以执行我们的代码。
即Mach-o 文件中,loadCommands 中注入的动态库。
使用 yololib 工具修改 Mach-o 二进制文件。
image list
查看 项目依赖的库。
- 修改之后 ,Xcode 又会重新打包,签名。
这其中 Xcode 其实做了很多的事情,就是 忽悠 Xcode。