本文主要講解代碼注入的兩種方式: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)
手動注入-01 2、在CJLHook中創(chuàng)建
inject文件,在生命周期方法load函數(shù)中寫注入代碼
+(void)load{
NSLog(@"CJLHook ------ 注入成功");
}
- 3、編譯工程(注:這里的工程依然需要重簽名),然后查看工程的可執(zhí)行文件Wechat,查找其中的Frameworks,從這里可以看到
CJLHook,但是此時并不會執(zhí)行其中的load函數(shù)
手動注入-03
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í)行文件拷貝過來)
手動注入-04第一個參數(shù):目標(biāo)可執(zhí)行文件
第二個參數(shù):CJLHook的路徑
-
5、查看Mach-O可執(zhí)行文件,可以看到已經(jīng)加進(jìn)來了
手動注入-05 -
6、重新打包,過程如下:
解壓
微信-7.0.8.ipa替換Payload中的可執(zhí)行文件為上一步的Mach-O文件
重新打包:
zip -ry WeChat.ipa Payload/然后替換ipa包
-
7、運(yùn)行程序,可以看到成功執(zhí)行了 CJLHook中的load
手動注入-07
方式2:dylib注入
準(zhǔn)備工作:創(chuàng)建一個空工程,并進(jìn)行WeChat的重簽名,可以參考這篇文章iOS逆向 10:應(yīng)用重簽名(下)
dylib注入
-
1、選擇target -> + -> mac os ->
Library,命名為CJLHook
dylib注入-01 -
2、在
Build Setting中配置CJLHook1)
Base SDK改為ios2)
Code Signing identify改為iOS Developer
-
3、當(dāng)前工程中拷貝lib
dylib注入-03- 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
dylib注入-06 -
7、運(yùn)行程序,從日志可以看出執(zhí)行了CJLHook中的load
dylib注入-07
總結(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)行注入。








