iOS逆向之HOOK原理(十一)

HOOK概述

HOOK(鉤子) 其實就是改變程序執行流程的一種技術的統稱!

HOOK原理圖.jpg

iOS中HOOK技術的幾種方式

1、Method Swizzle

利用OC的Runtime特性,動態改變SEL(方法編號)和IMP(方法實現)的對應關系,達到OC方法調用流程改變的目的。主要用于OC方法。

2、fishhook

它是Facebook提供的一個動態修改鏈接mach-O文件的工具。利用MachO文件加載原理,通過修改懶加載和非懶加載兩個表的指針達到C函數HOOK的目的。
https://github.com/facebook/fishhook

==fishhook在OC中的使用:==

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"123");
    
    //定義rebinding結構體
    struct rebinding nslogBind;
    //函數的名稱
    nslogBind.name = "NSLog";
    //新的函數地址
    nslogBind.replacement = myLog;
    //保存原始函數地址的變量的指針
    nslogBind.replaced = (void *)&old_mylog;

    //定義數組
    struct rebinding rebindings[] = {nslogBind};

    /*
     arg1 : 存放rebinding結構體的數組
     arg2 : 數組的長度
     */
    rebind_symbols(rebindings, 1);
}

//函數指針,用來保存原始的函數地址
static void (*old_mylog)(NSString *format, ...);

//新的NSLog
void myLog(NSString *format, ...) {
    format = [format stringByAppendingString:@"\n勾上了!"];
    //再調用原來的
    old_mylog(format);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"點擊了屏幕!!!");
}

@end

==NSLog的綁定過程:==

在MachO文件中查看NSLog的內存地址

屏幕快照 2018-05-13 下午10.28.35.png
(lldb) image list
[  0] D92A4EC1-406D-3C26-9F39-C3D4A46A2948 0x00000001049f4000 /Users/yaoqi/Library/Developer/Xcode/DerivedData/001-fishHookDemo-cwtlojyvecrawmdgeiokwkgwddql/Build/Products/Debug-iphoneos/001-fishHookDemo.app/001-fishHookDemo 
[  1] 477A8A1F-098B-3A80-860D-656A3F4918EA 0x0000000104d38000 /Users/yaoqi/Library/Developer/Xcode/iOS DeviceSupport/11.2.1 (15C153)/Symbols/usr/lib/dyld 
[  2] B0F8DF97-77EC-3600-8A9F-35035B889EFD 0x0000000184dd9000 /Users/yaoqi/Library/Developer/Xcode/iOS DeviceSupport/11.2.1 (15C153)/Symbols/System/Library/Frameworks/Foundation.framework/Foundation 
(lldb) x 0x00000001049f4000+0x8018
0x1049fc018: 24 af de 84 01 00 00 00 34 b9 dd 84 01 00 00 00  $.......4.......
0x1049fc028: 90 f5 a2 8d 01 00 00 00 58 ab 9f 04 01 00 00 00  ........X.......
(lldb) dis -s 0x0184deaf24
Foundation`NSLog:
    0x184deaf24 <+0>:  sub    sp, sp, #0x20             ; =0x20 
    0x184deaf28 <+4>:  stp    x29, x30, [sp, #0x10]
    0x184deaf2c <+8>:  add    x29, sp, #0x10            ; =0x10 
    0x184deaf30 <+12>: add    x8, x29, #0x10            ; =0x10 
    0x184deaf34 <+16>: str    x8, [sp, #0x8]
    0x184deaf38 <+20>: add    x1, x29, #0x10            ; =0x10 
    0x184deaf3c <+24>: mov    x2, x30
    0x184deaf40 <+28>: bl     0x184ec6d38               ; _NSLogv
(lldb) ni
(lldb) ni
(lldb) ni
(lldb) ni
(lldb) ni
(lldb) ni
(lldb) x 0x00000001049f4000+0x8018
0x1049fc018: bc 9d 9f 04 01 00 00 00 34 b9 dd 84 01 00 00 00  ........4.......
0x1049fc028: 90 f5 a2 8d 01 00 00 00 3c ee f7 83 01 00 00 00  ........<.......
(lldb) dis -s 0x01049f9dbc
001-fishHookDemo`myLog:
    0x1049f9dbc <+0>:  sub    sp, sp, #0x30             ; =0x30 
    0x1049f9dc0 <+4>:  stp    x29, x30, [sp, #0x20]
    0x1049f9dc4 <+8>:  add    x29, sp, #0x20            ; =0x20 
    0x1049f9dc8 <+12>: mov    x8, #0x0
    0x1049f9dcc <+16>: stur   x8, [x29, #-0x8]
    0x1049f9dd0 <+20>: sub    x9, x29, #0x8             ; =0x8 
    0x1049f9dd4 <+24>: str    x0, [sp, #0x10]
    0x1049f9dd8 <+28>: mov    x0, x9
(lldb) 

==NSLog在MachO文件中的反向查找過程:==

MachO文件的查找過程.png

3、Cydia Substrate

Cydia Substrate 原名為 Mobile Substrate ,它的主要作用是針對OC方法、C函數以及函數地址進行HOOK操作。當然它并不是僅僅針對iOS而設計的,安卓一樣可以用。官方地址:
http://www.cydiasubstrate.com/
?
Cydia Substrate主要由3部分組成:

  • MobileHooker

MobileHooker顧名思義用于HOOK。它定義一系列的宏和函數,底層調用objc的runtime和fishhook來替換系統或者目標應用的函數.
其中有兩個函數:

MSHookMessageEx 主要作用于Objective-C方法

void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP result)

MSHookFunction 主要作用于C和C++函數

void MSHookFunction(voidfunction,void* replacement,void** p_original)

Logos語法的%hook 就是對此函數做了一層封裝

  • MobileLoader

MobileLoader用于加載第三方dylib在運行的應用程序中。啟動時MobileLoader會根據規則把指定目錄的第三方的動態庫加載進去,第三方的動態庫也就是我們寫的破解程序.

  • safe mode

因為APP程序質量參差不齊崩潰再所難免,破解程序本質是dylib,寄生在別人進程里。 系統進程一旦出錯,可能導致整個進程崩潰,崩潰后就會造成iOS癱瘓。所以CydiaSubstrate引入了安全模式,在安全模 式下所有基于CydiaSubstratede 的三方dylib都會被禁用,便于查錯與修復。

代碼的基本防護

==注入的Framework庫中的Hook代碼:==

#import "hookMgr.h"
#import "fishhook.h"
#import <objc/message.h>

@implementation hookMgr
//專門HOOK
+(void)load
{
    NSLog(@"hookMgr--Load");
    //內部用到的交換代碼!
    Method old = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btnClick1:));
    Method new = class_getInstanceMethod(self, @selector(click1Hook:));
    method_exchangeImplementations(old, new);
    
    
    //基本防護
    struct rebinding bd;
    bd.name = "method_exchangeImplementations";
    bd.replacement = myExchang;
    bd.replaced = (void *)&exchangeP;
    
    struct rebinding bd1;
    bd1.name = "method_getImplementation";
    bd1.replacement = myExchang;
    bd1.replaced = (void *)&getIMP;
    
    struct rebinding bd2;
    bd2.name = "method_setImplementation";
    bd2.replacement = myExchang;
    bd2.replaced = (void *)&setIMP;
    
//    method_getImplementation
//    method_setImplementation
    
    struct rebinding rebindings[] = {bd,bd1,bd2};
    rebind_symbols(rebindings, 3);
}

//保留原來的交換函數
IMP _Nonnull (*setIMP)(Method _Nonnull m, IMP _Nonnull imp);
IMP _Nonnull (*getIMP)(Method _Nonnull m);
void (*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);

//新的函數
void myExchang(Method _Nonnull m1, Method _Nonnull m2){
    NSLog(@"檢測到了HOOK!!!");
    //強制退出!
    exit(1);
}


-(void)click1Hook:(id)sendr{
    NSLog(@"原來APP的HOOK保留!!");
}

@end

==使用Monkey創建的工程去Hook App中的代碼:==

如果別人要Hook自己寫的App中的代碼,就會閃退。

// 修改 MachO

#import <UIKit/UIKit.h>

%hook ViewController

- (void)btnClick2:(id)org
{
    NSLog(@"??????????????????????????????");
    exit(0);
}

%end

HOOK原理總結

  1. MachO文件是被誰加載?DYLD(負責加載系統動態庫)加載
  2. ASLR技術 MachO文件加載的時候是隨機地址
  3. PIC位置代碼獨立

如果MachO內部需要調用系統的庫函數
現在_DATA段(可讀可寫)中建立一個指針,指向外部函數
DYLD會動態的進行綁定,將MachO中的_DATA中的指針,指向外部函數
_DATA中的指針就是一個symbols

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • iOS逆向之HOOK原理 HOOK概述 HOOK(鉤子) 其實就是改變程序執行流程的一種技術的統稱!image.p...
    WinJayQ閱讀 1,895評論 0 2
  • layout: wikititle: iOS逆向分析筆記categories: Reverse_Engineeri...
    超哥__閱讀 10,870評論 3 16
  • 一、HOOK概述 HOOK(鉤子) 其實就是改變程序執行流程的一種技術的統稱! iOS中HOOK技術的幾種方式 1...
    iOS小肖閱讀 272評論 0 0
  • 轉發自 2016-07-07何兆林騰訊Bugly 如果您有耐心看完這篇文章,您將懂得如何著手進行app的分析、追蹤...
    樹懶啊樹懶閱讀 10,670評論 5 63
  • 一部作品要做到雅俗共賞是有難度的,這個難度關鍵在如何把握其結合點。 人們普遍認為,...
    冰夫閱讀 290評論 0 0