iOS
中对ipa
包进行代码注入,就是将外部代码注入现有ipa
包中,进而进行打包并最终被执行的过程
这里使用的是动态库(.framework
、.dylib
)注入的方式, 所有的系统库都属于动态库。动态库一般有两种,分别以.framework
和.dylib
后缀结尾,通常把它们叫做Framework
和Shared Library
。Framework
本质上是由Shared Library
加上头文件header
和其他资源文件打包得到。说到动态库,就不得不说静态库(.a
),静态库可以看做是一个具有特定功能的代码块,如果项目中引用了静态库,则编译时会将静态库直接复制到可执行文件(MachO
)中,进而会导致MachO
文件变大,而MachO
文件的大小直接影响项目的启动时间和占用内存的大小
而项目中引用动态库时,动态库不会复制到MachO
文件中,只有当动态库真正被用到时才会去加载。如果App
将动态库作为它的依赖库,则在MachO
文件中会添加这个动态库的引用,如果App
在运行时动态加载动态库,则在MachO
文件中不会添加动态库的引用。在使用App
时,静态库和动态库都会被加载到内存中。当多个app
使用同一个库时,如果这个库是动态库,由于动态库是可以被多个app的进程共用的,所以在内存中只会存在一份,而且使用这个动态库时,可能这个动态库已经存在于内存中了,因为其他启动的app
也许也依赖了这个库。如果是静态库,由于每个app
的MachO
文件中都会存在一份,则内存中可能会存在多份。相对静态库,使用动态库可以减少app
占用的内存大小和启动时间
使用动态库App
使用静态库App
使用动态库有两种方式,一种是将动态库添加为依赖库,这样会在工程启动时加载动态库,一种是使用dlopen
在运行时加载动态库,这两种方式的区别在于加载动态库的时机。在iOS
中一般使用第一种方法,第二种如果在iOS
中使用了这种方式,一般是不能上架到App Store
的
Framework注入 以下均使用真机运行。这里以微信为例,打开ipa
包,查看Framework
再使用MachOView打开微信的可执行文件(这次比较意外竟然闪退,github从新下载源码编译即可,记得把BaseSDK改成Mac系统的版本号),可见Load Commonds
是根据动态库指定的路径去加载的
那我们可以自己创建一个动态库去注入到微信的可执行文件中
首先创建一个动态库,然后编译运行
可以看到安装包中Frameworks
目录下已经有了我们创建的动态库
但是此时MachO
文件内并没有这个库,也就是说运行后这个库的代码并不会被执行,也就是这个库并没有被链接到可执行文件中
使用yololib
工具可以修改MachO
文件,将动态库写入MachO
文件中。注意要将yololib
复制到/usr/local/bin
或$PATH
中的其他路径,这样就可以在终端使用这个命令
yololib
需要两个参数,第一个参数指定被修改的MachO
文件的路径,第二个参数指定动态库的路径,也可以将此命令写入脚本和ipa
包重签一并执行
在使用yololib
去添加动态库依赖时,会修改MachO
文件的两个地方,修改MachO
文件的头文件和添加一个dylib_command
结构体,由于增加了一条Load Commands
,所以需要修改的是ncmds
和sizeofcmds
这两个字段,它们分别表示Load Commands
的总数目和总大小。再次编译后,通过MachOView
查看可执行文件
这之后再次运行即可看到我们注入的代码了
Dylib注入 首先创建一个dylib
库,这是个macOS
的库
Embed Frameworks
添加依赖
将Base SDK
改为iphoneos
,默认是macos
Code Signing identity
改为iphone developer
, 默认是Mac developer
这时候编译运行,包中已经有了这个dylib
库
再使用yololib
将这个库写入MachO
文件中运行即可
1 2 #INJECT_DYLIB_RELATIVE_PATH="Frameworks/libfishInject.dylib" #yololib "$TARGET_APP_PATH/$APP_BINARY" "$IINJECT_DYLIB_RELATIVE_PATH"
InjectCode
如有任何疑问或问题请联系我:fishnewsdream@gmail.com,欢迎交流,共同提高!
Objective-C/Swift技术开发交流群201556264,讨论何种技术并不受限,欢迎各位大牛百家争鸣!
微信公众号OldDriverWeekly
,欢迎关注并提出宝贵意见
老司机iOS周报 ,欢迎关注或订阅
刚刚在线工作室 ,欢迎关注或提出建设性意见!
刚刚在线论坛 , 欢迎踊跃提问或解答!
如有转载,请注明出处,谢谢!