如何给iOS的APP注入dylib(动态库)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何给iOS的APP注入dylib(动态库)相关的知识,希望对你有一定的参考价值。
参考技术A ios如需hook修改功能,添加授权弹窗等时候,需要注入动态库(dylib)来实现添加功能给小白出个简单教程,详细的就不写了
需要准备的:
1,mac (虚拟机也可以)
2,optool
准备好后开始注入
终端拖入optool ,输入注入命令,最后拖入app主文件点击回车完成注入
iOS开发逆向之代码注入(上)
本文主要讲解代码注入的两种方式:FrameWork注入、dylib注入
代码注入
一般修改原始的程序,是利用代码注入
的方式,注入代码就会选择利用FrameWork
或者Dylib
等三方库的方式注入。
查看Mach-O文件
在了解注入前,我们首先需要了解ipa包中的静态库是如何注入的,有以下两种方式查看Mach-O可执行文件
- 1、终端命令:
otool -l WeChat
- 2、MachOView 二进制文件分析工具(注:分析时可能出现无法分析的情况,可以通过 CMD + o 打开)
Mach-O
文件中主要看load Commands
(即加载命令集),从这里可以看出动态库的加载等。其中大部分格式为:LC_LOAD_DYLIB(xxx)
,是在指定路径下加载xxx,如下所示
所以,综上所述,如果需要注入代码,是以动态库的形式注入
方式1: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函数的
第二步:yololib手动注入,修改Mach-O字段
- 4、通过
yololib
工具修改Mach-O字段:./yololib WeChat Frameworks/CJLHook.framework/CJLHook
(注:需要将WeChat可执行文件拷贝过来)
* 第一个参数:目标可执行文件
* 第二个参数:CJLHook的路径
-
5、查看Mach-O可执行文件,可以看到已经加进来了
-
6、重新打包,过程如下:
-
解压
微信-7.0.8.ipa
-
替换Payload中的可执行文件为上一步的Mach-O文件
-
重新打包:
zip -ry WeChat.ipa Payload/
-
然后替换ipa包
-
-
7、运行程序,可以看到成功执行了 CJLHook中的load
方式2:dylib注入
准备工作:创建一个空工程,并进行WeChat的重签名,可以参考这篇文章iOS逆向 10:应用重签名(下)
dylib注入
- 1、选择target -> + -> mac os ->
Library
,命名为CJLHook
-
2、在
Build Setting
中配置CJLHook-
1)
Base SDK
改为ios
-
2)
Code Signing identify
改为iOS Developer
-
-
3、当前工程中拷贝lib
- 1)、Build Phase -> + ->
New Copy File...
- 2)、然后选择拷贝到的目标文件:
Frameworks
- 3)、添加
dylib
- 1)、Build Phase -> + ->
-
4、在CJLHook.m文件中
重写load
函数
#import "CJLHook.h"
@implementation CJLHook
+(void)load{
NSLog(@"CJLHook ---- 注入成功");
}
@end
- 5、脚本注入dylib,将
yololib
拷贝至根目录,在appSign.sh
末尾添加以下命令
#注入
./yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libCJLHook.dylib"
- 6、编译工程,查看Mach-O文件中的Frameworks文件,已经包含了CJLHook的dylib
- 7、运行程序,从日志可以看出执行了CJLHook中的load
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130 595 548,不管你是小白还是大牛都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)
总结
-
代码注入:一般会选择利用
FrameWork
或者Dylib
等三方库的方式注入 -
Framwork手动注入
流程:-
1、通过Xcode新建Framwork,将库安装进入APP包
-
2、通过yololib注入Framwork库路径。命令:
$yololib(空格)MachO文件路径(空格)库路径
-
3、所有的Framwork加载都是
由DYLD加载
进入内存被执行的 -
4、注入成功的库路径会写入到MachO文件的
LC_LOAD_DYLIB
字段中
-
-
Dylib注入
流程:-
1、通过Xcode
新建Dylib库
(注意:Dylib属于MacOS所以需要修改相关属性配置) -
2、
添加Target依赖
,让Xcode将自定义Dylib文件打包进入APP包。 -
3、利用
yololib
进行注入。
-
以上是关于如何给iOS的APP注入dylib(动态库)的主要内容,如果未能解决你的问题,请参考以下文章