iOS逆向安防從入門到禿頭--InlineHook

小谷禿頭合集ios

  • 目前主流的HOOK框架:OC的Method swizzlingfishHookInlineHookCydia Substrategit

  • 關於MethodSwizzlingfishHook,兄弟們估計用的很多了。我就不在這裏班門弄斧了~github

  • 幾天瞭解一波新秀 -- InlineHookxcode

1. Dobby框架

因爲InlineHook出來不是針對於iOSMacOS工程的(是全平臺的~),因此咱們要用cmake編譯它markdown

1.1. Dobby框架的安裝

  • 首先咱們先clone下來(放到你想要放到的目錄😆)

git clone https://github.com/jmpews/Dobby.git --depth=1框架

  • 而後咱們進入Dobby目錄,建立build_for_ios_arm64文件夾(官方推薦目錄名),而後進入建立的文件夾~

命令行~ide

cd Dobby && mkdir build_for_ios_arm64 && cd build_for_ios_arm64函數

  • 最後咱們用cmake編譯成xcode工程~ (這個時候在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
複製代碼
  • 編譯完成~如圖所示

1.png

1.2. 生成framework

有了xcode工程了。兄得們,編譯成framework還遠嗎?post

  • 首先選擇框架進行編譯

2.png

  • 編譯成功~

3.png

當使用時,可能會報bitcode錯誤。關上就好了學習

2. 使用及原理

咱們最重要的老是實用性,有機會的話能夠理解下的思想~

2.1. InlineHook 的使用

InlineHookfishhook的使用差很少,都比較方便(我首先在項目中舉例使用,而後在實戰純地址)

  • 介紹下InlineHookhook函數
// replace function
/** argv1:hook的函數地址 argv2:新函數的地址 argv3:原始函數指針 */
int DobbyHook(void *address, void *replace_call, void **origin_call);
複製代碼

很形象生動:替換函數

  • 搞起搞起~
// 1 導入framework

// 2 引入頭文件

// 3使用

int sum(int a, int b){
    return a + b;
}

int (*sum_p)(int a, int b);

int sumReplace(int a, int b){
    NSLog(@"HOOK住了~");
    return a + b;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    DobbyHook(sum, sumReplace, (void *)&sum_p);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"click ~");
    sum(10, 20);
}
複製代碼

就使用這個DobbyHook函數,注:在運行時調用的。不是編譯階段

2.2. 原理分析

兄弟們也能夠本身看源碼(我看了下源碼。感受有點不合適在博客裏面寫(C++,彙編啥太多了)),這裏咱們直接斷點看彙編。看看他作了什麼操做

  • 我先把DobbyHook函數註釋掉,看看原始的彙編

4.png

彙編不太熟悉的兄得們,能夠看看我以前的博客(註釋超級詳細了,哈哈)

  • 觀察下DobbyHook函數調用以後的~

5.png

因此說:InlineHook實在運行時hook。而後經過尋找符號地址,改變執行的彙編代碼,起到hook的目的

  • 兄弟們都會想到,這樣直接改不就影響函數棧平衡了嗎?

解釋:

若是沒有調用原始函數: 接下br x17下面的代碼是不會執行了

若是調用了原始函數:首先會記住函數地址。在新函數中實現棧平衡而後在調回原始函數

3. HOOK純地址

兄得們都清楚,InlineHook主要是用於咱們逆向開發中。因此咱們獲取不到要hook的函數sum ,這個時候兄弟們有什麼辦法嗎?(說實話,我剛開始有點上頭的~,我很是自信的想用下某信舉例,結果我好像搞不定它。😆)

  • 首先咱們模擬環境 -- 脫符號

6.png

  • 而後咱們查看要hook應用的MachO文件

7.png

  • 咱們隨機找個函數,而後模擬這個函數(我是不知道這個函數是什麼的,因此我要經過彙編判斷)

  • 咱們知道參數爲4個字節,初步判斷爲int型

int xxx(int a, int b){
    return a + b;
}
複製代碼

咱們判斷函數爲此(因爲用的w0,w1因此判斷不是OC方法),並且能夠用過MachO獲取偏移值爲5DD0

#import "InjectTest.h"
#import <mach-o/dyld.h>
#import "DobbyX.framework/Headers/dobby.h"

@implementation InjectTest

//int xxx(int a, int b){
//return a + b;
//}

//原始地址的指針
int (*xxx_p)(int a, int b);

//新函數替代
void xxxReplace(int a, int b){
    NSLog(@"HOOK 到了~");
    xxx_p(a,b);
}

+ (void)load{
    //設置偏移地址
    uintptr_t offset = 0x100005DD0;
    //獲取ASLR隨機值
    uintptr_t alsr = _dyld_get_image_vmaddr_slide(0);
    //肯定函數hook的地址
    offset += alsr;
    
    //HOOK 函數
    DobbyHook((void *)offset, xxxReplace, (void *)&xxx_p);
    
}

@end
複製代碼

有一點須要記住。ASLR是不帶PAGEZORE

  • 觸發函數時,就會被hook住~

8.png

4. 總結

又到了總結的時候了

    1. 兄弟們,我們離逆向開發又近了一步
    1. 辛虧有兄弟們的支持,我才能堅持學習寫博客,必須感謝一波~
    1. 小谷但願和兄弟們在學習的道路上越走越遠。只但願在學習的海洋不被落下~
    1. 我以爲HOOK這個東西只有實操才能感覺它的優美~ 😆
    1. 兄弟們。之後產出博客請多多指點~
相關文章
相關標籤/搜索