[iOS逆向]11、inlineHook

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=NOEnable Bitcode=YES
編譯 DpbbyX.framework 或者 dobby.dylib

Dobby

2.2、使用Dobby

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

DobbyDemo

編譯運(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ù)地址

x17

2.2.1、直接函數(shù)地址替換
1、通過 MachOView 查看 sum 函數(shù)的偏移為 0x5D68
函數(shù)偏移

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é)果同上

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容