前言
经过上一次的 App 重签名,大概过程都熟悉了,现在开始新的练习,代码注入,其实过程很简单,就是重签名 App ,注入动态库。
环境配置
依照上次的步骤,只不过把 上次的 脚本保存下来,以后可以不用编辑,使用罢了。
但是,编译会报错,如下:
![](https://img.haomeiwen.com/i4790087/7db35b66fff311b9.png)
可以看到是因为脚本的执行权限问题,因为脚本内有很多文件读写的操作
赋予其执行权限:
chmod +x XcodeSignApp.sh
出了一个小插曲:
![](https://img.haomeiwen.com/i4790087/475b71f493bde3ae.png)
因为 文件路径的问题,开始没察觉出来,新建的是 APP 文件夹,但是 脚本中写的是 TargetApp,一定要和脚本一致,低级错误!
编译,OK!
注入原理
有一个问题:我们怎么注入代码呢?我们的工程已经把 app 包给替换了,怎么修改它的代码呢?
Mach-o 文件。
动态注入:在程序运行过程中,通过一些底层的函数去注入。
静态注入:修改 Mach-o 文件 注入。
都是改变的 二进制执行文件,要么把相关的源码打包进二进制文件中,要么动态加载库,系统的 dyld 加载的 如:dylib。
如:查看 WeC 的 Mach-o 文件,可以看到:
![](https://img.haomeiwen.com/i4790087/d6730d3c98e6cf32.png)
有很多的 dylib 文件,这些动态库,在程序启动的时候,Load Commands 列表中的字段,dyld 工具 都会去一个一个的去加载。
那我们注入代码可不可以在 二进制 文件中,添加一个动态库呢???
注入过程
- 新建 library
![](https://img.haomeiwen.com/i4790087/bb7344adddd9deb5.png)
- 在 库中创建 类,开发逻辑代码。
![](https://img.haomeiwen.com/i4790087/9001de35888ff735.png)
- 添加依赖关系,编译。
![](https://img.haomeiwen.com/i4790087/5efe81decc8635f6.png)
其实,这没添加依赖关系的,Xcode 自动做的,不添加也可以注入成功。
![](https://img.haomeiwen.com/i4790087/96f7581678710289.png)
![](https://img.haomeiwen.com/i4790087/fb5dfcb54a09c109.png)
正向开发,只需在代码中导入,但我们要改的是 Mach-o 文件,修改的工具:yololib
这个工具的作用就是:将我们 的动态库路径写入 Mach-o 文件中。
因为经常使用,放入/usr/local/bin
下使用更方便。
![](https://img.haomeiwen.com/i4790087/487ef1e5e980b6e1.png)
- 使用:
yololib WeChat Frameworks/QCHook.framework/QCHook
指令 Mach-o 文件 动态库路径,相对于可执行文件来说的路径。
![](https://img.haomeiwen.com/i4790087/b487b7b4d847f0be.png)
![](https://img.haomeiwen.com/i4790087/5b5066369b1dc8f7.png)
即代表修改注入成功。
但是运行,你会发现并不会执行注入的代码,因为一开始每次会替换掉你修改的 二进制文件,所以从根源上修改:
![](https://img.haomeiwen.com/i4790087/ca252e4e0848cf24.png)
修改这一个,Mach-o 文件,解压
![](https://img.haomeiwen.com/i4790087/e7cbf0761495a38f.png)
- 打包:
zip -ry WeChat.ipa Payload
![](https://img.haomeiwen.com/i4790087/123bc1b5aaa885bd.png)
- 运行成功:
![](https://img.haomeiwen.com/i4790087/879e17785d737a6d.png)
Mach-o 文件中,loadCommands 中注入的动态库。
![](https://img.haomeiwen.com/i4790087/9932239d042cfbf9.png)
开不开心???现在就可以随便玩了
注入小结
- 首先是环境的配置,重签名 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。
网友评论