本文主要講解代碼注入的兩種方式:FrameWork注入色解、dylib注入
代碼注入
一般修改原始的程序,是利用代碼注入
的方式暇韧,注入代碼就會選擇利用FrameWork
或者Dylib
等三方庫的方式注入。
查看Mach-O文件
在了解注入前,我們首先需要了解ipa包中的靜態(tài)庫是如何注入的摹闽,有以下兩種方式查看Mach-O可執(zhí)行文件
- 1、終端命令:
otool -l WeChat
- 2褐健、MachOView 二進(jìn)制文件分析工具(注:分析時可能出現(xiàn)無法分析的情況付鹿,可以通過 CMD + o 打開)
Mach-O
文件中主要看load Commands
(即加載命令集),從這里可以看出動態(tài)庫的加載等蚜迅。其中大部分格式為:LC_LOAD_DYLIB(xxx)
舵匾,是在指定路徑下加載xxx,如下所示
所以谁不,綜上所述坐梯,如果需要注入代碼,是以動態(tài)庫的形式注入
方式1:Framework手動注入
第一步:動態(tài)庫進(jìn)入App包刹帕,即Framework注入
-
1吵血、創(chuàng)建一個
Framework
,命名為CJLHook
(創(chuàng)建位置:target -> + -> ios -> Framework) 2轩拨、在CJLHook中創(chuàng)建
inject
文件践瓷,在生命周期方法load函數(shù)中寫注入代碼
+(void)load{
NSLog(@"CJLHook ------ 注入成功");
}
-
3、編譯工程(注:這里的工程依然需要重簽名)亡蓉,然后查看工程的可執(zhí)行文件Wechat晕翠,查找其中的Frameworks,從這里可以看到
CJLHook
砍濒,但是此時并不會執(zhí)行其中的load函數(shù)load不會執(zhí)行的原因:查看此時的Mach-O文件中的Load Commands淋肾,并沒有發(fā)現(xiàn)
CJLHook
,所以此時是不會執(zhí)行其中的load函數(shù)的
第二步:yololib手動注入爸邢,修改Mach-O字段
-
4樊卓、通過
yololib
工具修改Mach-O字段:./yololib WeChat Frameworks/CJLHook.framework/CJLHook
(注:需要將WeChat可執(zhí)行文件拷貝過來)第一個參數(shù):目標(biāo)可執(zhí)行文件
第二個參數(shù):CJLHook的路徑
-
5、查看Mach-O可執(zhí)行文件,可以看到已經(jīng)加進(jìn)來了
-
6杠河、重新打包碌尔,過程如下:
解壓
微信-7.0.8.ipa
替換Payload中的可執(zhí)行文件為上一步的Mach-O文件
重新打包:
zip -ry WeChat.ipa Payload/
然后替換ipa包
-
7、運(yùn)行程序券敌,可以看到成功執(zhí)行了 CJLHook中的load
方式2:dylib注入
準(zhǔn)備工作:創(chuàng)建一個空工程唾戚,并進(jìn)行WeChat的重簽名,可以參考這篇文章iOS逆向 應(yīng)用重簽名(下)
dylib注入
-
1待诅、選擇target -> + -> mac os ->
Library
叹坦,命名為CJLHook
-
2、在
Build Setting
中配置CJLHook1)
Base SDK
改為ios
2)
Code Signing identify
改為iOS Developer
-
3卑雁、當(dāng)前工程中拷貝lib
- 1)募书、Build Phase -> + ->
New Copy File...
- 2)绪囱、然后選擇拷貝到的目標(biāo)文件:
Frameworks
- 3)、添加
dylib
- 1)募书、Build Phase -> + ->
4莹捡、在CJLHook.m文件中
重寫load
函數(shù)
#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文件荷逞,已經(jīng)包含了CJLHook的dylib
-
7媒咳、運(yùn)行程序,從日志可以看出執(zhí)行了CJLHook中的load
image
作為一個開發(fā)者种远,有一個學(xué)習(xí)的氛圍跟一個交流圈子特別重要涩澡,這是一個我的iOS開發(fā)交流群:130 595 548,不管你是小白還是大牛都?xì)g迎入駐 坠敷,讓我們一起進(jìn)步妙同,共同發(fā)展!(群內(nèi)會免費(fèi)提供一些群主收藏的免費(fèi)學(xué)習(xí)書籍資料以及整理好的幾百道面試題和答案文檔Oビ)
總結(jié)
代碼注入:一般會選擇利用
FrameWork
或者Dylib
等三方庫的方式注入-
Framwork手動注入
流程:1粥帚、通過Xcode新建Framwork,將庫安裝進(jìn)入APP包
2限次、通過yololib注入Framwork庫路徑芒涡。命令:
$yololib(空格)MachO文件路徑(空格)庫路徑
3、所有的Framwork加載都是
由DYLD加載
進(jìn)入內(nèi)存被執(zhí)行的4卖漫、注入成功的庫路徑會寫入到MachO文件的
LC_LOAD_DYLIB
字段中
-
Dylib注入
流程:1费尽、通過Xcode
新建Dylib庫
(注意:Dylib屬于MacOS所以需要修改相關(guān)屬性配置)2、
添加Target依賴
羊始,讓Xcode將自定義Dylib文件打包進(jìn)入APP包旱幼。3、利用
yololib
進(jìn)行注入突委。