有了应用重签名的基础,已经能把其他App
(比如WeChat
)安装到自己的设备上了。
既然都安装上了,那能不能搞点事情呢?比如:调试、破解或者让安装在我们设备上的WeChat
执行我们的代码呢?想要实现这些便有了代码注入。
1、代码注入原理
一个App
在执行的时候会执行3部分代码,第一部分为MachO
文件的代码,第二部分为加入的FrameWork
库,第三部分为系统库。
因为非越狱手机不能修改系统库,首先这个Pass
;MachO
是二进制文件,都是汇编,虽然也能修改,但是比较麻烦,目前我们不考虑;所以最简单就是再往App
里面添加一个FrameWork
库即可。
2、FrameWork库运行的规则
既然能Run
起来,那加入一个FrameWork
库就太简单了,但是我们加入的FrameWork
库是在我们新建的工程(WeChatDemo
)里面的,而当前运行的是WeChat.app
里面FrameWork
库。
那么如何让WeChat
调用我们的FrameWork
库,WeChat
调用自己的FrameWork
的规则是什么呢?这就涉及到了MachO
文件,MachO
中会明确的说明调用了那些FrameWork
库。
3、初识MachO文件
那MachO
文件是什么呢?我们之前打开WeChat.app
的时候有一个黑色的名称为WeChat
的文件,这个就是MachO
文件。
MachO
只是一种格式而已,就和Windows
上的.exe
差不多。想到打开MachO
需要一个叫MachOView
的工具。用MachOView
打开WeChat.MacO
,就是下方所示。
我们也可以用终端输入otool -l WeChat
查看一下WeChat.MacO
发现MachOView
工具就是帮我们把终端显示的内容整理成可视化的而已。
我们能看到FrameWork
在Load command
下呢,打开MachoView
的Load command
发现了之前重签名的FrameWork
库marsbridgemetwork.framework
,原来只要WeChat.MachO
文件中Load command
标明了的FrameWork
库都会被调用。
那我们如何将我们的FrameWork
库插入到Load Comands
中去呢?
4、Load Commands 关联 FrameWork 库
首先在Targets
下新建一个FrameWork
库
编译之后在/WeChat.app/FrameWorks
下就会看到我们新建的FrameWork
库,
运行一下很遗憾的发现没有执行我们加入的代码,因为打开MachO
的Load Commands
发现是没有我们的WeChatHook.frameWork
的。
想要在Load Commands
中关联我们的WeChatHook.frameWork
库还需要一个工具yololib
。建议把yololib
放在/usr/local/bin
下,ls
后会看到pod
也在这个文件夹下,因为这个文件夹下的Shell
指令在任何地方都可以执行。
接下来找到WeChaDemo
工程下方的WeChaDemo.app
,右键显示包内容。
在当前目录下向WeChat.machO
中关联我们的FrameWork
,终端输入yololib WeChat Frameworks/WeChatHook.framework/WeChatHook
,就是给 WeChat.machO
中注入了一个相对于WeChat
路径下的FrameWork
,因为WeChatHook.framework
是文件夹,真正的FrameWork
是/WeChatHook.framework/WeChatHook
。
终端显示注入成功了,我们打开WeChat.MachO
的Load Commands
查看一下,发现了我们WeChatHook
。
因为脚本的原因,脚本里面写的是先解压再覆盖,随意我们需要将WeChat.ipa
重新压缩一下,不然就会覆盖我们现在已经注入的WeChatHook
的WeChat.machO
文件。
将我们的修改成功的WeChat.machO
拷贝出来到我们工程的WeChatDemo
的APP
下,然后对微信-7.0.5(越狱应用).ipa
解压,替换Payload
下WeChat.app
中的WeChat.machO
,删掉Payload
之外的其他文件,然后重新压缩Payload
。
终端输入 zip -ry WeChat.ipa Payload
,压缩后就重新得到了WeChat.ipa
,如果不想重新压缩更改自动重签名脚本即可。
重新Run
,发现输出了我们刚才注入的代码。
5、修改Shell脚本一步到位
我们既然用了Shell
脚本那就希望更简单些,我们修改一下Shell
脚本。
在Shell
脚本的最后添加上 yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/WeChatHook.framework/WeChatHook"
注意:我的FrameWork
叫WeChatHook.framework
你叫什么自行修改。
6、DYLib注入
当前使用的是Framework
注入的,也可以使用Library
注入,原理是一样的,但是有一些细节要注意。
Library
生成的Target
直接就会有.h
和.m
文件不需要再新建,然后.m
文件添加我们的+ (void)load;
方法
Run
一下,Show in Finder
我们工程中的DYLib.app
查看我们替换的WeChat.app
中的FrameWork
文件夹,并没有发现我们刚才新建的WeChatHook
。
注意:我们新建的WeChatHook.dylib
是MacOS
的所以我们需要修改一些配置。
我们需要将MacOS
的修改成iOS
的
配置一下,让Xcode帮我们把这个库Copy
到.app
中去
修改添加的位置
然后Show in Finder
我们的DYLib.app
的/FrameWork
中就能看到我们的WeChatHook
了。
最后修改我们的自动重签名脚本
#注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libWeChatHook.dylib"
最后就成功的打出了我们注入的代码
以上就是代码注入(上篇)的内容,下篇正在努力整理。