hook原理之fishhook

HOOK概述

HOOK,中文翻译为“挂钩”或“钩子”。在ios逆向中是指改变程序运行流程的一种技术。通过hook可以让别人的程序执行自己所写的代码。

常用的几种HOOK技术

1、Method Swizzle

这是交换方法,利用OC的runtime原理,动态改变SEL和IMP的对应关系,使得调用时流程改变。

hook原理之fishhook_第1张图片

2、fishhook

它是Facebook提供的一个动态修改链接machO文件的工具。利用machO文件的加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。

3、Cydia Substrate

cydia substr是一个强大的框架。主要作用是针对oc方法、c函数以及函数地址进行hook操作。同时也可以应用于安卓。

fishhook

fishhook简单使用

github上下载,将fishhook.c和.h文件拖入项目中即可,

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //指定交换的函数
    struct rebinding nslog;
    nslog.name = "NSLog";
    nslog.replacement = my_NSLog;
    
    //fishhook 运行的时刻,动态的获取到NSLog的地址。
    nslog.replaced = (void *)&sys_nslog;
    
    struct rebinding rebs[1] = {nslog};
    
    /**
     * 存放rebinding结构体的数组
     * 存放数量
     */
    rebind_symbols(rebs, 1);
}
//---------------NSLog--------------------
//函数指针,用来保存原始的函数地址
static void(*sys_nslog)(NSString * format,...);

void my_NSLog(NSString * _Nonnull format, ...){
    // 为了证明确实修改了,我们增加输出
    format = [format stringByAppendingFormat:@"\n 流弊了"];
    
    sys_nslog(format);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"来了");
}

fishhook只能修改系统的共享缓存,也就是苹果为了节约内存,将系统的动态库放在内存的一块特殊区域,然后将这块区域共享给所有应用,由于苹果采用PIC技术,位置代码独立,在machO文件创建两张表,懒加载和非懒加载表,里面存放指向外面函数的地址(符号)。当应用加载时,dylb会加载共享缓存,链接方法地址,fishhook通过符号表找到对应的函数地址,重新绑定地址,达成修改程序的流程的目的。而我们自己写的方法, 没有办法在编译时就获得函数的地址,所以fishhook无法hook我们自己写的方法。

你可能感兴趣的:(hook原理之fishhook)