代码注入(上)
有了应用重签名的基础,已经能把其他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
文件。
![](https://img.haomeiwen.com/i2252239/1a01d60038e4922b.png)
MachO
只是一种格式而已,就和Windows
上的.exe
差不多。想到打开MachO
需要一个叫MachOView
的工具。用MachOView
打开WeChat.MacO
,就是下方所示。
![](https://img.haomeiwen.com/i2252239/7c6645706122adde.png)
我们也可以用终端输入otool -l WeChat
查看一下WeChat.MacO
发现MachOView
工具就是帮我们把终端显示的内容整理成可视化的而已。
![](https://img.haomeiwen.com/i2252239/2e4994bff7fd846d.png)
我们能看到FrameWork
在Load command
下呢,打开MachoView
的Load command
发现了之前重签名的FrameWork
库marsbridgemetwork.framework
,原来只要WeChat.MachO
文件中Load command
标明了的FrameWork
库都会被调用。
![](https://img.haomeiwen.com/i2252239/e7792a85ee52519f.png)
那我们如何将我们的FrameWork
库插入到Load Comands
中去呢?
4、Load Commands 关联 FrameWork 库
首先在Targets
下新建一个FrameWork
库
![](https://img.haomeiwen.com/i2252239/23c2b122e8e0a590.png)
![](https://img.haomeiwen.com/i2252239/0d9109ea440d3fc3.png)
编译之后在/WeChat.app/FrameWorks
下就会看到我们新建的FrameWork
库,
![](https://img.haomeiwen.com/i2252239/3b9883d02b650e42.png)
![](https://img.haomeiwen.com/i2252239/be2e44c17a92e557.png)
运行一下很遗憾的发现没有执行我们加入的代码,因为打开MachO
的Load Commands
发现是没有我们的WeChatHook.frameWork
的。
![](https://img.haomeiwen.com/i2252239/7c6645706122adde.png)
想要在Load Commands
中关联我们的WeChatHook.frameWork
库还需要一个工具yololib
。建议把yololib
放在/usr/local/bin
下,ls
后会看到pod
也在这个文件夹下,因为这个文件夹下的Shell
指令在任何地方都可以执行。
![](https://img.haomeiwen.com/i2252239/44aba9003ffd126d.png)
![](https://img.haomeiwen.com/i2252239/e956ae39868e9b0d.png)
接下来找到WeChaDemo
工程下方的WeChaDemo.app
,右键显示包内容。
在当前目录下向WeChat.machO
中关联我们的FrameWork
,终端输入yololib WeChat Frameworks/WeChatHook.framework/WeChatHook
,就是给 WeChat.machO
中注入了一个相对于WeChat
路径下的FrameWork
,因为WeChatHook.framework
是文件夹,真正的FrameWork
是/WeChatHook.framework/WeChatHook
。
![](https://img.haomeiwen.com/i2252239/c4906a3bcc47acd1.png)
![](https://img.haomeiwen.com/i2252239/25183767e0d65332.png)
终端显示注入成功了,我们打开WeChat.MachO
的Load Commands
查看一下,发现了我们WeChatHook
。
![](https://img.haomeiwen.com/i2252239/c970b3a17c120526.png)
因为脚本的原因,脚本里面写的是先解压再覆盖,随意我们需要将WeChat.ipa
重新压缩一下,不然就会覆盖我们现在已经注入的WeChatHook
的WeChat.machO
文件。
将我们的修改成功的WeChat.machO
拷贝出来到我们工程的WeChatDemo
的APP
下,然后对微信-7.0.5(越狱应用).ipa
解压,替换Payload
下WeChat.app
中的WeChat.machO
,删掉Payload
之外的其他文件,然后重新压缩Payload
。
![](https://img.haomeiwen.com/i2252239/3b9883d02b650e42.png)
![](https://img.haomeiwen.com/i2252239/761580127b2c3836.png)
终端输入 zip -ry WeChat.ipa Payload
,压缩后就重新得到了WeChat.ipa
,如果不想重新压缩更改自动重签名脚本即可。
![](https://img.haomeiwen.com/i2252239/8aa65d635cf3cd63.png)
重新Run
,发现输出了我们刚才注入的代码。
![](https://img.haomeiwen.com/i2252239/ecf5f06bb80b9bab.png)
5、修改Shell脚本一步到位
我们既然用了Shell
脚本那就希望更简单些,我们修改一下Shell
脚本。
在Shell
脚本的最后添加上 yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/WeChatHook.framework/WeChatHook"
注意:我的FrameWork
叫WeChatHook.framework
你叫什么自行修改。
6、DYLib注入
当前使用的是Framework
注入的,也可以使用Library
注入,原理是一样的,但是有一些细节要注意。
![](https://img.haomeiwen.com/i2252239/d81d3a2488f6f75a.png)
Library
生成的Target
直接就会有.h
和.m
文件不需要再新建,然后.m
文件添加我们的+ (void)load;
方法
![](https://img.haomeiwen.com/i2252239/db4b37ca71a594d2.png)
Run
一下,Show in Finder
我们工程中的DYLib.app
查看我们替换的WeChat.app
中的FrameWork
文件夹,并没有发现我们刚才新建的WeChatHook
。
![](https://img.haomeiwen.com/i2252239/b43e92d20ee1e06c.png)
注意:我们新建的WeChatHook.dylib
是MacOS
的所以我们需要修改一些配置。
我们需要将MacOS
的修改成iOS
的
![](https://img.haomeiwen.com/i2252239/eaeadc0099d06af9.png)
![](https://img.haomeiwen.com/i2252239/9e78d2f73f555a23.png)
配置一下,让Xcode帮我们把这个库Copy
到.app
中去
![](https://img.haomeiwen.com/i2252239/cb4d81c6fa8eb7c8.png)
![](https://img.haomeiwen.com/i2252239/3c685b37a6f83af2.png)
修改添加的位置
![](https://img.haomeiwen.com/i2252239/e3e0b30ace36925a.png)
然后Show in Finder
我们的DYLib.app
的/FrameWork
中就能看到我们的WeChatHook
了。
![](https://img.haomeiwen.com/i2252239/4dfc3a79caa28c4a.png)
最后修改我们的自动重签名脚本
#注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libWeChatHook.dylib"
最后就成功的打出了我们注入的代码
![](https://img.haomeiwen.com/i2252239/2f698e9649e0f903.png)
以上就是代码注入(上篇)的内容,下篇正在努力整理。