美文网首页
fishHook-代码实例

fishHook-代码实例

作者: Code_人生 | 来源:发表于2019-10-23 16:58 被阅读0次
#import "ViewController.h"

#import "fishhook.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    
    //指定交换的函数
    struct rebinding nslog;
    nslog.name = "NSLog";
    nslog.replacement = myNSLog;
    //fishhook 运行的时刻,动态的获取到NSLog的地址。
    nslog.replaced = (void *)&sys_nslog;
    
    //结构体数组
    struct rebinding rebs[1] = {nslog};
    
    /** 用于交换C函数
     * arg1:存放rebinding结构体的数组
     * arg2:
     */
    rebind_symbols(rebs, 1);
    
}

//函数指针,用来保存原始的函数地址
static void(*sys_nslog)(NSString * format,...);

//C函数的名称,就是函数的指针!
//定义一个新的函数
void myNSLog(NSString * format,...) {
    format = [format stringByAppendingFormat:@"------钩上了!!!!"];
 
    //调用系统的函数
    sys_nslog(format);
}

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


@end
  • 可以HOOK系统的C函数,但无法HOOK自定义的函数
  • fishHook 无法交换自定义函数!!!,这个函数肯定是C函数,因为fishHook只能交换C函数
#import "ViewController.h"

#import "fishhook.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    
    //结构体
    struct rebinding funcd;
    funcd.name = "func";
    funcd.replacement = newFunc;
    //fishhook 运行的时刻,动态的获取到NSLog的地址。
    funcd.replaced = (void *)&funcP;

    //结构体数组
    struct rebinding rebs[1] = {funcd};

    rebind_symbols(rebs, 1);
    
}

//函数的实现地址在MachO本地文件。
void func(const char * str) {
    NSLog(@"%s",str);
}

//原始的函数指针
static void(*funcP)(const char *);

//新函数
void newFunc(const char * str) {
    NSLog(@"勾住了");//指向的符号!!
    funcP(str);
}


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

@end

相关文章

网友评论

      本文标题:fishHook-代码实例

      本文链接:https://www.haomeiwen.com/subject/qjjkvctx.html