iOS Fishhook

在iOS开发中,在不干预实现源码的情况下,想要要改变这个方法的实现(比如替换或追加实现)存在多种方案,可以继承重写、借助类别,或者依赖Method Swizzling,但是这些都是基于面向对象语言Objective-C才能实现的,如果是一个C实现的函数方法,这些方案都是行不通的。

那对于C函数方法的拦截,有什么比较靠谱的方案呢,简单google一下,发现Fishhook比较火热,自己之前也没了解过C相关的hook方案,在此简单备注。

什么是fishhook?

fishhook 是Facebook开源的一种C函数的hook方案,它的实现原理是动态修改Mach-O符号表,Mach-O是Mach Object文件格式的缩写,iOS的app可执行文件格式就是Mach-O。

fishhook 原理

参考fishhook官方文档“How it works”,链接关系表如下图:
符号表链接图(来源网络)

dyld 通过更新在Match-O二进制文件__DATA特定部分的函数指针来链接lazy和non-lazy两种符号表,fishhook通过确定位置去更新每个符号的名字链接到rebind_symbols并添加相应的替代品以实现重绑。

如图所示,__DATA区包含和动态链接相关的两部分:__nl_symbol_ptr 和 __la_symbol_ptr。__nl_symbol_ptr为一个指针数字直接非惰性绑定数据,__la_symbol_ptr也是一个指针数组,在第一次调用的时候通过dyld_stub_binder辅助链接。为了寻找一个符号名的特定位置,需要经过几层间接跳转。对于__DATA这两部分,<match-o/loader.h>结构体部分提供了偏移量进入间接符号表。间接符号表位于二进制的__LINKEDIT段,仅仅是一个索引到符号表的数组,它的排序在non-lazy 和 lazy两部分是相同的。因此,获取struct section nl_symbol_ptr,在符号表第一地址的位置就是indirect_symbol_table[nl_symbol_ptr->reserved1]。符号表本身是一个struct nlist的数组(参考<mach-o/nlist.h>),每个nlist包含进入__LINKEDIT里字符表位置,这个位置存着实际的符号表。所以,对于每个__nl_symbol_ptr和__la_symbol_ptr 的指针,我们能够找到相应的符号,然后将相应的字符串和想替换的字符串进行比较,如果匹配,我们就以新添加的指针替换原指针。

fishhook 的简单尝试

拦截 socket函数int socket(int, int, int);和int connect(int, const struct sockaddr *, socklen_t)做简单尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import "AppDelegate.h"
#import "fishhook.h"
static int (*orig_socket)(int, int, int);
static int (*orig_connect)(int, const struct sockaddr *, socklen_t);
int my_socket(int domain, int type, int protocol)
{
printf("this is my socket!");
return orig_socket(domain,type,protocol);;
}
int my_connect(int socket, const struct sockaddr * addr, socklen_t len)
{
printf("this is my connect");
return orig_connect(socket,addr,len);
}
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
rebind_symbols((struct rebinding[2]){{"socket", my_socket, (void *)&orig_socket},{"connect", my_connect, (void *)&orig_connect}}, 2);
return YES;
}
@end

推荐

  1. Fishhook Github:https://github.com/facebook/fishhook
  2. iOS安全攻防(十七):Fishhook:http://blog.csdn.net/yiyaaixuexi/article/details/19094765