逆向學習筆記11——fishhook執(zhí)行原理及簡單防護

1庸论,fishhook的執(zhí)行原理

C語言函數通常是靜態(tài)的职辅,編譯之后棒呛,從匯編代碼變成了內存地址。iOS系統(tǒng)實現了一個動態(tài)緩存庫技術域携,一些公共的系統(tǒng)庫放進內存中的某個地方簇秒,當某個iOS項目啟動后,machO文件會在Data段創(chuàng)建一個指針秀鞭,dyld動態(tài)將machO中Data段中這個指針指向外部函數趋观,這里的指針指向內部函數的調用,指向外部函數的地址锋边,而這個指針也就是我們通常說的符號皱坛;這也是為什么fishhook中函數名為rebind_symbols(重新綁定符號),實際上是修改這個指針指向外部函數的地址豆巨,這也就是為什么修改不了內部函數和自定義函數剩辟,只能修改machO外部函數(在符號表中能找到的函數)。由于蘋果實現了ASLR技術(不了解ASLR,看這篇逆向學習筆記8——ASLR)往扔,所以這些動態(tài)緩存庫函數在APP項目的內存地址不確定贩猎,每次啟動APP的時候都會有相應的變化,這是C語言的動態(tài)表現萍膛。
下載fishhook

  • 1.1交換方法

準備如下代碼

#import "ViewController.h"
#import "fishhook.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"123");//之所以這里打印下吭服,因為NSLog是懶加載列表,如果不添加蝗罗,內存中無法找到NSLog內存地址
    struct rebinding nslogBind;
    nslogBind.name = "NSLog";
    nslogBind.replacement = myNSLog;
    nslogBind.replaced = (void *)&old_nslog;
    
    struct rebinding rebs[] = {nslogBind};
    rebind_symbols(rebs, 1);
}

static void (*old_nslog)(NSString *format, ...);

void myNSLog(NSString *format, ...){
    NSString * str = [NSString stringWithFormat:@"%@\n??哈哈??",format];
    old_nslog(str);
}


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSLog(@"hello fish hook");
}

先運行一下艇棕,點擊屏幕,打印結果如下:

2018-05-15 16:44:01.289126+0800 FishHook[5266:1450255] hello fish hook
??哈哈??

很明顯串塑,根據結果可以知道沼琉,fishhook交換方法成功了。

  • 1.2驗證fishhook綁定

接下來拟赊,我們探索下fishHook的流程刺桃,在rebind_symbols(rebs, 1);加一個斷點。從machO的懶加載列表中拿出NSLog的地址偏移值吸祟,如下圖

image.png

然后通過lldb拿到ASLR瑟慈,通過下面操作,拿到內存中的NSLog函數屋匕。
image.png

斷點單步走葛碧,過掉rebind_symbols(rebs, 1);,也就是讓fishHook交換成功后,再重新打印过吻,地址內存偏移0x8018的值进泼,如下圖

image.png

根據結果蔗衡,很明顯看出,fishhook確實修改了符號綁定乳绕。

  • 1.3驗證fishhook無法修改自定義函數

代碼如下

- (void)viewDidLoad {
    [super viewDidLoad];
    struct rebinding rebing;
    rebing.name= "func";
    rebing.replacement = newFunc;
    rebing.replaced = (void *)&newFuncP;
    struct rebinding rebs[] = {rebing};
    rebind_symbols(rebs, 1);
}
static void (*newFuncP)(void);
void newFunc(){
    NSLog(@"這是新的newFunc 函數");
}
void func(){
    NSLog(@"這是自定義func 函數");
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    func();
}

點擊屏幕绞惦,打印結果如下:

2018-05-16 10:08:09.350558+0800 FishHook[6722:1744594] 這是自定義func 函數

很明顯,這里方法沒有替換成功洋措。也說明fishhook無法修改自定義函數济蝉。

2,利用fishhook防護

  • 2.1 防護代碼

新建一個antiHookDemo菠发,并在target添加一個xxxFramework王滤,在xxxFramework導入fishhook,創(chuàng)建一個HookManager類,添加如下代碼

+(void)load{
   Method oldMethod = class_getInstanceMethod(objc_getClass("ViewController"), @selector(clickLeftBtn:));
   Method newMethod = class_getInstanceMethod(self, @selector(clickLeftBtn:));
   method_exchangeImplementations(newMethod, oldMethod);

   struct rebinding  exchangebinding;
   exchangebinding.name = "method_exchangeImplementations";
   exchangebinding.replacement = myExchange;
   exchangebinding.replaced = (void *)&exchangeP;
   
   struct rebinding  getIMPbinding;
   getIMPbinding.name = "method_getImplementation";
   getIMPbinding.replacement = myExchange;
   getIMPbinding.replaced = (void *)&getIMP;
   
   struct rebinding  setIMPbinding;
   setIMPbinding.name = "method_setImplementation";
   setIMPbinding.replacement = myExchange;
   setIMPbinding.replaced = (void *)&setIMP;
   struct rebinding rebs[] = {exchangebinding,getIMPbinding,setIMPbinding};
   
   rebind_symbols(rebs, 3);
}

static void (*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);
IMP _Nonnull (*setIMP)(Method _Nonnull m, IMP _Nonnull imp);
IMP _Nonnull (*getIMP)(Method _Nonnull m);

void myExchange(Method _Nonnull m1, Method _Nonnull m2){
   NSLog(@"外部hook  不給過");
   //這里可以做些讓程序崩潰的事情
   exit(0);//閃退滓鸠,只要發(fā)現你hook我雁乡,我就閃退
}


-(void)clickLeftBtn:(id)sender{
   NSLog(@"原始hook打印");
}

viewController中代碼如下

- (IBAction)clickLeftBtn:(id)sender {
    NSLog(@"點擊按鈕1");
}

- (IBAction)clickRightBtn:(id)sender {
    NSLog(@"點擊按鈕2");
}

  • 2.2Hook代碼

新建一個hookDemo,拿到剛剛創(chuàng)建的antiHookDemo的app糜俗,創(chuàng)建一個xxframework踱稍,添加如下代碼

+(void)load
{
    Method oldMethod = class_getInstanceMethod(objc_getClass("ViewController"), @selector(clickRightBtn:));
    Method newMethod = class_getInstanceMethod(self, @selector(hookMethod));
    method_exchangeImplementations(oldMethod, newMethod);
}


-(void)hookMethod{
    NSLog(@"我hook到你了");
}

利用重簽和代碼注入方法直接運行到真機,程序閃退吩跋,打印結果為

2018-05-16 10:28:09.350558+0800 hookDemo[6722:1744594] 外部hook  不給過

從打印結果出來和程序閃退可以看出防護成功了??寞射。
(不了解重簽的童鞋,逆向學習筆記9——代碼重簽名逆向學習筆記10——代碼注入)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末锌钮,一起剝皮案震驚了整個濱河市桥温,隨后出現的幾起案子,更是在濱河造成了極大的恐慌梁丘,老刑警劉巖侵浸,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異氛谜,居然都是意外死亡掏觉,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門值漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澳腹,“玉大人,你說我怎么就攤上這事杨何〗此” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵危虱,是天一觀的道長羊娃。 經常有香客問我,道長埃跷,這世上最難降的妖魔是什么蕊玷? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任邮利,我火速辦了婚禮,結果婚禮上垃帅,老公的妹妹穿的比我還像新娘延届。我一直安慰自己,他們只是感情好挺智,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布祷愉。 她就那樣靜靜地躺著,像睡著了一般赦颇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赴涵,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天媒怯,我揣著相機與錄音,去河邊找鬼髓窜。 笑死扇苞,一個胖子當著我的面吹牛,可吹牛的內容都是我干的寄纵。 我是一名探鬼主播鳖敷,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼程拭!你這毒婦竟也來了定踱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤恃鞋,失蹤者是張志新(化名)和其女友劉穎崖媚,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體恤浪,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡畅哑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了水由。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荠呐。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砂客,靈堂內的尸體忽然破棺而出泥张,到底是詐尸還是另有隱情,我是刑警寧澤鞭盟,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布圾结,位于F島的核電站,受9級特大地震影響齿诉,放射性物質發(fā)生泄漏筝野。R本人自食惡果不足惜晌姚,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歇竟。 院中可真熱鬧挥唠,春花似錦、人聲如沸焕议。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盅安。三九已至唤锉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間别瞭,已是汗流浹背窿祥。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝙寨,地道東北人晒衩。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像墙歪,于是被迫代替她去往敵國和親听系。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,962評論 0 7
  • 重新系統(tǒng)學習下C++虹菲;但是還是少了好多知識點靠胜;socket;unix届惋;stl髓帽;boost等; C++ 教程 | 菜...
    kakukeme閱讀 19,793評論 0 50
  • HOOK概述 HOOK(鉤子) 其實就是改變程序執(zhí)行流程的一種技術的統(tǒng)稱! iOS中HOOK技術的幾種方式 1脑豹、M...
    Colin_狂奔的螞蟻閱讀 1,706評論 1 3
  • 小時候 最盼望的就是吃肉 父親郑藏,賣掉一身的力氣 換回幾張皺巴巴的錢 和一塊肥肉 母親,扯一把地里的蒜苗 用柴火炒出...
    行走的野草閱讀 243評論 5 0
  • 致敬新鄉(xiāng)陸航團 梁子 志堅行苦勤實訓瘩欺,養(yǎng)兵千日佑安寧必盖。 崇山峻嶺早踏遍,乘風破浪賽蛟龍俱饿。 萬里江...
    梁子仗劍走天下閱讀 4,125評論 0 1