逆向学习笔记11——fishhook执行原理及简单防护

1,fishhook的执行原理

C语言函数通常是静态的,编译之后,从汇编代码变成了内存地址。iOS系统实现了一个动态缓存库技术,一些公共的系统库放进内存中的某个地方,当某个iOS项目启动后,machO文件会在Data段创建一个指针,dyld动态将machO中Data段中这个指针指向外部函数,这里的指针指向内部函数的调用,指向外部函数的地址,而这个指针也就是我们通常说的符号;这也是为什么fishhook中函数名为rebind_symbols(重新绑定符号),实际上是修改这个指针指向外部函数的地址,这也就是为什么修改不了内部函数和自定义函数,只能修改machO外部函数(在符号表中能找到的函数)。由于苹果实现了ASLR技术(不了解ASLR,看这篇逆向学习笔记8——ASLR),所以这些动态缓存库函数在APP项目的内存地址不确定,每次启动APP的时候都会有相应的变化,这是C语言的动态表现
下载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,创建一个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);//闪退,只要发现你hook我,我就闪退
}


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

viewController中代码如下

- (IBAction)clickLeftBtn:(id)sender {
    NSLog(@"点击按钮1");
}

- (IBAction)clickRightBtn:(id)sender {
    NSLog(@"点击按钮2");
}

  • 2.2Hook代码

新建一个hookDemo,拿到刚刚创建的antiHookDemo的app,创建一个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阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,959评论 0 7
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 19,784评论 0 50
  • HOOK概述 HOOK(钩子) 其实就是改变程序执行流程的一种技术的统称! iOS中HOOK技术的几种方式 1、M...
    Colin_狂奔的蚂蚁阅读 1,704评论 1 3
  • 小时候 最盼望的就是吃肉 父亲,卖掉一身的力气 换回几张皱巴巴的钱 和一块肥肉 母亲,扯一把地里的蒜苗 用柴火炒出...
    行走的野草阅读 243评论 5 0
  • 致敬新乡陆航团 梁子 志坚行苦勤实训,养兵千日佑安宁。 崇山峻岭早踏遍,乘风破浪赛蛟龙。 万里江...
    梁子仗剑走天下阅读 4,117评论 0 1