代码注入探究


iOS中对ipa包进行代码注入,就是将外部代码注入现有ipa包中,进而进行打包并最终被执行的过程

这里使用的是动态库(.framework.dylib)注入的方式, 所有的系统库都属于动态库。动态库一般有两种,分别以.framework.dylib后缀结尾,通常把它们叫做FrameworkShared LibraryFramework本质上是由Shared Library加上头文件header和其他资源文件打包得到。说到动态库,就不得不说静态库(.a),静态库可以看做是一个具有特定功能的代码块,如果项目中引用了静态库,则编译时会将静态库直接复制到可执行文件(MachO)中,进而会导致MachO文件变大,而MachO文件的大小直接影响项目的启动时间和占用内存的大小

而项目中引用动态库时,动态库不会复制到MachO文件中,只有当动态库真正被用到时才会去加载。如果App将动态库作为它的依赖库,则在MachO文件中会添加这个动态库的引用,如果App在运行时动态加载动态库,则在MachO文件中不会添加动态库的引用。在使用App时,静态库和动态库都会被加载到内存中。当多个app使用同一个库时,如果这个库是动态库,由于动态库是可以被多个app的进程共用的,所以在内存中只会存在一份,而且使用这个动态库时,可能这个动态库已经存在于内存中了,因为其他启动的app也许也依赖了这个库。如果是静态库,由于每个appMachO文件中都会存在一份,则内存中可能会存在多份。相对静态库,使用动态库可以减少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,所以需要修改的是ncmdssizeofcmds这两个字段,它们分别表示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周报,欢迎关注或订阅

刚刚在线工作室,欢迎关注或提出建设性意见!

刚刚在线论坛, 欢迎踊跃提问或解答!

如有转载,请注明出处,谢谢!

本站总访问量 本文总阅读量