提取ipa
获得ipa包的途径有多个,可以通过iTunes/PP助手(需越狱)等途径获取,比较简单。(注意高版本的iTunes取消了应用商店,iTunes途径需降级,Mojava版本暂不兼容降级版iTunes)
代码注入
准备脱壳后的ipa文件,一般修改原始的程序,是利用代码注入的方式,注入代码就会选择利用FrameWork或者Dylib等三方库的方式注入。
查看Mach-O文件
在了解注入前,我们首先需要了解ipa包中的静态库是如何注入的,有以下两种方式查看Mach-O可执行文件
- 1、终端命令:
otool -l WeChat - 2、MachOView 二进制文件分析工具(注:分析时可能出现无法分析的情况,可以通过 CMD + o 打开)
Mach-O文件中主要看load Commands(即加载命令集),从这里可以看出动态库的加载等。其中大部分格式为:LC_LOAD_DYLIB(xxx),是在指定路径下加载xxx,如下所示
所以,综上所述,如果需要注入代码,是
以动态库的形式注入
Framework手动注入
第一步:动态库进入App包,即Framework注入
- 1、创建一个
Framework,命名为CJLHook(创建位置:target -> + -> ios -> Framework)
- 2、在CJLHook中创建
inject文件,在生命周期方法load函数中写注入代码
+(void)load{
NSLog(@"CJLHook ------ 注入成功");
}
- 3、编译工程(注:这里的工程依然需要重签名),然后查看工程的可执行文件Wechat,查找其中的Frameworks,从这里可以看到
CJLHook,但是此时并不会执行其中的load函数
load不会执行的原因:查看此时的Mach-O文件中的Load Commands,并没有发现CJLHook,所以此时是不会执行其中的load函数的
第二步:optool手动注入,修改Mach-O字段
- 4、这边简单说一下,动态库注入可以借助 yololib,也可以借助 optool,将对应的执行文件下载后,放置于
/usr/local/bin目录下。
PS: 使用yololib注入动态库后在64位的系统上运行会直接闪退(亲测的结果,具体为啥闪退咱就不懂了,反正它就是闪退了,无限闪退、没拿到崩溃日志具体是啥原因 emmm...),不建议使用,所以咱们这边就使用optool。
使用提前准备好的动态库(比如随便创建个动态库,动态库内实现个 +(void)load 函数,在 load 函数内实现个延迟弹窗)。
使用终端注入动态库:
$ optool install -c <command> -p <payload> -t <target> [-o=<output>] [-b] [--resign]
# 例如 optool install -c weak -p "@rpath/xx.framework/xxx" -t Payload/xxx.app/xxx
执行后提示
Found thin header...
Inserting a LC_LOAD_WEAK_DYLIB command for architecture: arm64
Successfully inserted a LC_LOAD_WEAK_DYLIB command for arm64
Writing executable to Payload/xxx.app/xxx...
则表示注入成功,再将 Framewrok,放置于 Payload/xxx.app/Framewroks 文件夹内就行,这步千万别遗漏,漏了直接闪退给你看(出现 image no found 的崩溃) 。
-
5、重新打包,过程如下:
- 解压
微信-7.0.8.ipa - 替换Payload中的可执行文件为上一步的Mach-O文件
- 重新打包:
zip -ry WeChat.ipa Payload/ - 然后替换ipa包
- 解压
-
6、运行程序,可以看到成功执行了 CJLHook中的load
PS:
- 如果
Payload/xxx.app/Framewroks内有其它动态库,需要先将Framewroks内的其它动态库先进行签名。 - 如果替换成功后无法安装,可以重新签名