iOS逆向之旅(进阶篇) — HOOK(FishHook)

官方简介

fishhook is a very simple library that enables dynamically rebinding symbols in Mach-O binaries running on iOS in the simulator and on device. This provides functionality that is similar to using DYLD_INTERPOSE on OS X. At Facebook, we've found it useful as a way to hook calls in libSystem for debugging/tracing purposes (for example, auditing for double-close issues with file descriptors).
【简而言之就是一个很轻量级的库(就两个文件),可以动态的去修改macho可执行文件的属性】
项目地址:FishHook

案例一【HOOK 系统函数】

  • 直接把FishHook的两个文件直接拖进项目,并引入头文件
image.png
  • 申明一个函数指针用于保存原NSLog的真实函数地址
    static void(*origNSLog)(NSString *format, ...);
  • 自定义一个新的函数用于取代NSLog
void newNSLog(NSString *format, ...){
    //再调用系统的nslog
    origNSLog(@"就不打印");
}
  • 调用fishhook的rebind_symbols实现hook
struct rebinding bind;
bind.name = "NSLog";//要HOOK系统函数的函数名称
bind.replacement = newNSLog;//新的函数去替换系统的NSLog
bind.replaced = (void *)&origNSLog;//把真正的NSLog地址保存到origNSLog
struct rebinding rebs[] = {bind};
rebind_symbols(rebs, 1);

上面这种事传统的写法,我们也可以简写成
rebind_symbols((struct rebinding [1]){{"NSLog",newNSLog,(void*)&origNSLog}}, 1);

  • 这样就hook成功了,直接看效果
image.png

HOOK成功~~~~~~~~~

案例二【HOOK 自定义函数】

  • 在案例一的基础上继续加,首先声明一个自定义函数func
void func(){
    NSLog(@"123");
}
  • 申明一个函数指针用于保存原func的真实函数地址
    static void(*origFunc)();
  • 自定义一个新的函数用于取代func
void newFunc(){
    NSLog(@"456");
}
  • 调用fishhook的rebind_symbols实现hook
    rebind_symbols((struct rebinding [1]){{"func",newFunc,(void*)&origFunc}}, 1);
  • 查看hook结果
image.png

不难看出hook失败了,hook成功的话,应该打印456才对

FishHook的原理

通过以上两个案例为何FishHook能hook系统函数,却hook不了我们自己的函数,接下来我们对其原理进行分析

科普一下

ASLR技术:是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度。对于我们APP而言,它保证每次MachO文件加载的时候是随机地址【这个我们可以通过LLDB指令的image list去查看】


image.png

根据苹果pic技术【位置代码独立】,当我们Macho需要调用系统库函数的时候,会在_DATA段中建立一个指针。DYLD【动态库加载】会进行动态的绑定,会将这个指针指向外部函数

回过头我们在分析我们之前的两个案例

根据PIC技术,我们在调用NSLog的时候,系统会现在_Data段建立一个指针,这个指针在DYLD动态加载Foundation框架时,把这个指针指向NSLog的的真实地址。
fishhook他实际就是在改这个指针,让这个指针向我们本地函数的地址。
所以fishhook的函数名字就叫rebind_symbols(重新绑定这个符号【指针】),很贴切。而我们本身自己的函数,不存在这个DYLD动态加载的过程,自然无法HOOK的了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容