本文主要介绍利用动态库对第三方App实现代码静态注入,一般有两种注入方式:Framework,Dylib。大体包含以下几个步骤:
- App添加动态库,并添加工程与动态库的关联关系。
- 修改Mach-O文件的Load Commands。
- 在注入的动态库中写上自己的代码。
一、Framework注入
- 创建一个工程,按照文章 iOS App重签名 实现脚本自动化重签名。
-
添加一个Cocoa Touch Framework动态库。New Copy File Phase,新建一个Copy File文件,Destination选择Frameworks,并把动态库Add进去。这样就给动态库添加了依赖。这个依赖添加后执行编译Xcode就会将动态库打包到App包的Frameworks文件夹下面。编译后,会发现Products目录和包内容Frameworks目录底下都增加了新添加的动态库。
- 在动态库底下新建一个类,在类里面可以复写+ (void)load方法,注入代码。
这个时候运行工程,代码注入是不会成功的。还需要把动态库的路径写入Mach-O文件。
把Products目录下App包内容里的Mach-O文件拷贝到桌面。用 yololib 工具把动态库的路径写入Mach-O文件。它其实是去修改了Mach-O文件的二进制。
yololib Mach-O文件名称 Frameworks/xxxFramework.framework/xxxFramework
这个时候再看Mach-O文件的Load Commands最底下,就会发现动态库已经写入了,这样当程序启动的时候dyld就会去加载新添加的动态库了。把工程文件所在目录下的APP文件夹里的ipa包解压,并把App包内容里的Mach-O文件替换为桌面上的Mach-O文件(要改源头)。
把ipa包解压后的Payload文件夹拖到APP文件夹下,并把Payload文件夹打包为ipa包。其余文件夹删掉。
zip -ry xxx.ipa 要打包的文件夹
运行工程,我们会发现注入动态库的代码执行了。
注:上面的4、5、6步可以写在脚本里,这样就可以省去这些步骤。下面的Dylib注入,用脚本把动态库的路径写入了Mach-O文件。
二、Dylib注入
- 创建一个工程,按照文章 iOS App重签名 实现脚本自动化重签名。
- 添加一个Library动态库。这个Library是在macOS->Framework & Library里。New Copy File Phase,新建一个Copy File文件,Destination选择Frameworks,并把动态库Add进去。这样就给动态库添加了依赖。
- 由于Library动态库是在macOS平台下的,属于X86架构。所以需要在TARGETS->添加的Library库->Build Settings里设置成iOS平台。需要设置两处:
- Base SDK修改为Latest iOS(iOS xxx)
- Code Signing Identity修改为iOS Developer
- 在动态库底下新建一个类,在类里面可以复写+ (void)load方法,注入代码。
- 运行工程,我们会发现注入动态库的代码执行了。