這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰ios
本文主要講解代碼注入的兩種方式:FrameWork注入、dylib注入
markdown
通常修改原始的程序,是利用代碼注入
的方式,注入代碼就會選擇利用FrameWork
或者Dylib
等三方庫的方式注入。app
查看Mach-O文件ide
在瞭解注入前,咱們首先須要瞭解ipa包中的靜態庫是如何注入的,有如下兩種方式查看Mach-O可執行文件函數
otool -l WeChat
Mach-O
文件中主要看load Commands
(即加載命令集),從這裏能夠看出動態庫的加載等。其中大部分格式爲:LC_LOAD_DYLIB(xxx)
,是在指定路徑下加載xxx,以下所示 工具
因此,綜上所述,若是須要注入代碼,是以動態庫的形式注入
oop
第一步:動態庫進入App包,即Framework注入post
Framework
,命名爲 CJLHook
(建立位置:target -> + -> ios -> Framework)inject
文件,在生命週期方法load函數中寫注入代碼+(void)load{
NSLog(@"CJLHook ------ 注入成功");
}
複製代碼
CJLHook
,可是此時並不會執行其中的load函數 load不會執行的緣由:查看此時的Mach-O文件中的Load Commands,並無發現
CJLHook
,因此此時是不會執行其中的load函數的ui
第二步:yololib手動注入,修改Mach-O字段
yololib
工具修改Mach-O字段:./yololib WeChat Frameworks/CJLHook.framework/CJLHook
(注:須要將WeChat可執行文件拷貝過來) - 第一個參數:目標可執行文件
- 第二個參數:CJLHook的路徑
複製代碼
六、從新打包,過程以下:
解壓微信-7.0.8.ipa
替換Payload中的可執行文件爲上一步的Mach-O文件
從新打包:zip -ry WeChat.ipa Payload/
而後替換ipa包
七、運行程序,能夠看到成功執行了 CJLHook中的load
準備工做:建立一個空工程,並進行WeChat的重簽名,能夠參考這篇文章iOS逆向 10:應用重簽名(下)
dylib注入
Library
,命名爲CJLHook
Build Setting
中配置CJLHook
1)Base SDK
改成 ios
2)Code Signing identify
改成 iOS Developer
- 1)、Build Phase -> + ->
New Copy File...
- 2)、而後選擇拷貝到的目標文件:Frameworks
- 3)、添加dylib
重寫load
函數#import "CJLHook.h"
@implementation CJLHook
+(void)load{
NSLog(@"CJLHook ---- 注入成功");
}
@end
複製代碼
yololib
拷貝至根目錄,在appSign.sh
末尾添加如下命令#注入
./yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libCJLHook.dylib"
複製代碼
代碼注入:通常會選擇利用FrameWork
或者Dylib
等三方庫的方式注入
Framwork手動注入
流程:
一、經過Xcode新建Framwork,將庫安裝進入APP包
二、經過yololib注入Framwork庫路徑。命令:$yololib(空格)MachO文件路徑(空格)庫路徑
三、全部的Framwork加載都是由DYLD加載
進入內存被執行的
四、注入成功的庫路徑會寫入到MachO文件的LC_LOAD_DYLIB
字段中
Dylib注入
流程:
一、經過Xcode新建Dylib庫
(注意:Dylib屬於MacOS因此須要修改相關屬性配置)
二、添加Target依賴
,讓Xcode將自定義Dylib文件打包進入APP包。
三、利用yololib
進行注入。