1、inlineHook概述
所謂InlineHook(內(nèi)聯(lián)鉤?),就是直接修改?標(biāo)函數(shù)的頭部代碼。讓它跳轉(zhuǎn)到?定義函數(shù)中執(zhí)?代碼,從?達(dá)到Hook的?的。這種Hook技術(shù)?般用于靜態(tài)語(yǔ)?。
Dobby,是一個(gè)全平臺(tái)的inlineHook(內(nèi)聯(lián)鉤子)框架。Dobby 是通過插入 __DATA 段和__TEXT 段到 Mach-O 中。
-
__DATA用來記錄Hook信息(Hook數(shù)量、每個(gè)Hook方法的地址)、每個(gè)Hook方法的信息(函數(shù)地址、跳轉(zhuǎn)指令地址、寫Hook函數(shù)的接口地址)、每個(gè)Hook的接口(指針)。 -
__Text用來記錄每個(gè)Hook函數(shù)的跳轉(zhuǎn)指令。
Dobby 通過 mmap 把整個(gè) Mach-O 文件映射到用戶的內(nèi)存空間,寫入完成保存本地。所以 Dobby并不是在原 Mach-O 上進(jìn)行操作,而是重新生成并替換。
2、Dobby
2.1、編譯Dobby
1、git clone源碼
#depth用于指定克隆深度,為1即表示只克隆最近一次commit.
git clone https://github.com/jmpews/Dobby.git --depth=1
2、Dobby是跨平臺(tái)的,使用cmake將這個(gè)工程編譯成為Xcode工程。編譯命令如下:
cd Dobby && mkdir build_for_ios_arm64 && cd build_for_ios_arm64
cmake .. -G Xcode \
-DCMAKE_TOOLCHAIN_FILE=cmake/ios.toolchain.cmake \
-DPLATFORM=OS64 -DARCHS="arm64" -DCMAKE_SYSTEM_PROCESSOR=arm64 \
-DENABLE_BITCODE=0 -DENABLE_ARC=0 -DENABLE_VISIBILITY=1 -DDEPLOYMENT_TARGET=9.3 \
-DDynamicBinaryInstrument=ON -DNearBranch=ON -DPlugin.SymbolResolver=ON -DPlugin.Darwin.HideLibrary=ON -DPlugin.Darwin.ObjectiveC=ON
3、編譯完成后進(jìn)入目錄 build_for_ios_arm64 打開 Xcode 編譯,設(shè)置 CODE_SIGNING_ALLOWED=NO、Enable Bitcode=YES
編譯 DpbbyX.framework 或者 dobby.dylib

2.2、使用Dobby
1、將 DobbyX.framework 拖入新建的工程中,新建 Copy Files ,將 DobbyX.framework 添加進(jìn)入

編譯運(yùn)行成功
[*] ================================
[*] Dobby
[*] ================================
[*] dobby in debug log mode, disable with cmake flag "-DDOBBY_DEBUG=OFF"
2.2.1、直接函數(shù)符號(hào)替換
@implementation ViewController
int sum(int a,int b){
return a + b;
}
- (void)viewDidLoad {
[super viewDidLoad];
//HOOK sum -- 修改的Text段實(shí)際上是替換!
DobbyHook((void *)sum, mySum, (void *)&sum_p);
}
//函數(shù)指針用于保留原來的執(zhí)行
static int (*sum_p)(int a,int b);
//新函數(shù)地址
int mySum(int a,int b){
NSLog(@"HOOK 成功了!%d,",sum_p(a,b));
return a - b;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"sum:%d",sum(10, 20));
}
執(zhí)行結(jié)果
2022-01-09 18:07:45.376665+0800 InlineProject[6934:1301584] HOOK 成功了!30,
2022-01-09 18:07:45.376974+0800 InlineProject[6934:1301584] sum:-10
1、直接調(diào)用 sum 和使用 Dobby 后調(diào)用 sum 的匯編對(duì)比
1)、直接調(diào)用 sum
InlineProject`sum:
0x10432de04 <+0>: sub sp, sp, #0x10 ; =0x10
0x10432de08 <+4>: str w0, [sp, #0xc]
0x10432de0c <+8>: str w1, [sp, #0x8]
-> 0x10432de10 <+12>: ldr w8, [sp, #0xc]
0x10432de14 <+16>: ldr w9, [sp, #0x8]
0x10432de18 <+20>: add w0, w8, w9
0x10432de1c <+24>: add sp, sp, #0x10 ; =0x10
0x10432de20 <+28>: ret
和普通的函數(shù)調(diào)用相同,在函數(shù)內(nèi)棧平衡操作
2)、使用 Dobby 后
InlineProject`sum:
0x102ec9dd0 <+0>: adrp x17, 0
0x102ec9dd4 <+4>: add x17, x17, #0xe50 ; =0xe50
0x102ec9dd8 <+8>: br x17
-> 0x102ec9ddc <+12>: ldr w8, [sp, #0xc]
0x102ec9de0 <+16>: ldr w9, [sp, #0x8]
0x102ec9de4 <+20>: add w0, w8, w9
0x102ec9de8 <+24>: add sp, sp, #0x10 ; =0x10
0x102ec9dec <+28>: ret
通過匯編查看 x17 寄存器存儲(chǔ)的是mySum的函數(shù)地址

2.2.1、直接函數(shù)地址替換
1、通過
MachOView 查看 sum 函數(shù)的偏移為 0x5D68
2、函數(shù)
sum 的真實(shí)地址 addr = aslr + offset
@implementation ViewController
int sum(int a,int b){
return a + b;
}
//版本不修改的情況下,寫死沒問題!!
static uintptr_t sumP = 0x100005d68;
- (void)viewDidLoad {
[super viewDidLoad];
//獲取ASLR 相當(dāng)于rebase
uintptr_t aslr = _dyld_get_image_vmaddr_slide(0);
sumP += aslr;
NSLog(@"sumP:%p\n sum:%p",(void *)sumP,sum);
//HOOK sum -- 修改的Text段實(shí)際上是替換!
DobbyHook((void *)sumP, mySum, (void *)&sum_p);
}
//函數(shù)指針用于保留原來的執(zhí)行
static int (*sum_p)(int a,int b);
//新函數(shù)地址
int mySum(int a,int b){
NSLog(@"HOOK 成功了!%d,",sum_p(a,b));
return a - b;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"sum:%d",sum(10, 20));
}
@end
最終運(yùn)行結(jié)果同上