iOS经验总结hookiOS 底层学习方向、面试总结

iOS逆向 HOOK原理之fishhook

2021-05-25  本文已影响0人  编程怪才_凌雨画

一、HOOK概述

1.HOOK定义

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

下列示意图就是对HOOK功能的形象诠释:

2.HOOK方式

在iOS中HOOK技术有以下几种:

之前已经介绍过Method Swizzling了,OC的Runtime特性让它有了“黑魔法”之称,同时也是局限性所在

三者的区别如下:

二、fishhook

1.fishhook的使用

整个fishhook就开放了一个结构体rebinding和两个函数

使用fishhook的步骤:

  1. 导入头文件
#import "fishhook.h"

  1. 指定交换函数——rebinding结构体对象
struct rebinding nslog;
nslog.name = "NSLog";
nslog.replacement = fxNSlog;
nslog.replaced = (void *)&sys_nslog;
  1. 调用rebind_symbols重新绑定符号
struct rebinding rebs[] = {nslog};
rebind_symbols(rebs, 1);

完整代码如下:

#import "fishhook.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    struct rebinding nslog;
    nslog.name = "NSLog";
    nslog.replacement = fxNSlog;
    nslog.replaced = (void *)&sys_nslog;

    struct rebinding rebs[] = {nslog};
    rebind_symbols(rebs, 1);
}

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

void fxNSlog(NSString *format, ...) {
    format = [format stringByAppendingFormat:@"已hook"];
    sys_nslog(format);
}

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

@end

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这有个iOS交流群:642 363 427,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术,iOS开发者一起交流学习成长!

2.fishhook的局限性

前面介绍了fishhook是用来hook C函数的,但在此前提下还是有它的局限性——无法交换自定义函数

那么为什么系统级别的C函数就可以呢?这就要说到PIC技术了

3.PIC技术

PIC技术(Position-independent code),又叫做位置独立代码,是为了系统C函数在编译时期能够确认一个地址的一种技术手段

而自定义的C函数不会生成符号表,直接就是一个函数地址,所以fishhook的局限性就在于只有符号表内的符号可以hook(重新绑定符号)

4.LLDB调试

因为NSLog是个懒加载的符号,所以加了行代言代码

  1. 通过image list打印所有镜像资源——第一个就是进程的内存首地址
  1. 获取到MachO中NSLog的内存偏移量
使用计算器,内存首地址+内存偏移量=符号地址
  1. 通过memory read 内存地址读出符号地址
由于iOS是小端模式,内存地址8位倒着读
  1. 通过dis -s 内存地址查看汇编
此时的符号并没有绑定,因为还没有使用
  1. 过掉断点(使用NSLog)再进行查看
此时的NSLog符号已经被绑定
  1. 再跳到下一步(重绑定符号)进行查看
此时的NSLog符号已经被重绑定了

5.fishhook原理探索

接下来分析下rebind_symbols

接下来是_rebind_symbols_for_image对MachO文件的操作:按照规则计算各种表的地址和指针在表中的偏移量

最后一步,perform_rebinding_with_section根据算好的符号表地址和偏移量,找到在符号表中用于指向共享库目标函数的指针,将该指针的值(即目标函数的地址)赋值给rebinding*replaced,最后修改该指针的值为replacement(新的函数地址)

6.fishhook原理的实践——在MachO中查找函数实现

接下来就根据字符串对应在符号表中的指针,找到其在共享库的函数实现的

  1. NSLog在Lazy Symbol Pointers中位列第一个,下标为0
  1. Dynamic System Table->Indirect Symbols中的value与Lazy Symbol Pointers一一对应,此表中的Data(0xA9=169)即为另一个表的下标
  1. 拿着这个下标在Symbol Table->Symbols中找到NSLog,此时的Data对应String Table Index中的偏移值(0x0000009B)
  1. 最后在String Table中计算表头(0x000061EC)+偏移量(0x0000009B),找到NSLog的函数地址

7.fishhook应用场景

既然fishhook可以交换C函数,那么就可以交换method_exchangeImplementations等函数来防止HOOK,项目本身如果需要使用method_exchangeImplementations则可以使用新的函数地址来进行操作

写在后面

在安全攻防领域中,hook原理起到至关重要的作用,而使用fishhook做防护虽然意义不大,但是了解fishhook原理对后续的学习还是挺有帮助的,想了解更多逆向相关知识不妨动动小手,点赞我来为你的技术多添一份光彩。

原文:GitHub

上一篇 下一篇

猜你喜欢

热点阅读