首页
社区
课程
招聘
[原创]【Frida 实战】Hook 大法,拦截器的使用
发表于: 2020-5-10 15:27 63520

[原创]【Frida 实战】Hook 大法,拦截器的使用

2020-5-10 15:27
63520

本文是 Frida 实战系列教程的第二篇。第一篇请查看 https://www.ioshacker.net/thread-360-1-1.html

拦截器(Interceptor)是 Frida 很重要的一个功能,它能够帮助我们 Hook C 函数、Objective-C 方法,在第一篇使用 frida-trace 跟踪 CCCrypt 函数的实例中,frida-trace 实际上也用到了拦截器。

在学习使用拦截器(Interceptor)之前,有必要了解在 frida 脚本里如何对 Objective-C 的数据类型进行处理,比如像 NSString、NSData、NSArray、NSDictionary 都是很常见的类型,我们必须要知道这些类型在 frida 脚本中该怎么读取内容。下面通过一个实例来看看 NSString 如何读取内容并输出。

应用在发送 HTTP 请求时,通常都会调用 [NSURL URLWithString:] 这个方法来初始化 URL 地址,我们对这个方法进行跟踪,执行下面的命令,xxx 代表目标应用的名称。

然后在 handlers 找到 NSURL_URLWithString.js 文件,可以看到 UTF8String 这个函数是 NSString,我们调用 UTF8String 即可得到字符串。

然后我们来做第二个实例,了解如何获取 NSData 的字符串。应用发送 HTTP 请求,通常会调用 [NSURLRequest setHTTPBody:] 设置 HTTPBody,需要注意的是除了 NSURLRequest,可能还会有一个 NSMutableURLRequest,对这两个方法进行跟踪,

找到 NSMutableURLRequest_setHTTPBody.js 修改成如下代码,可以看到调用 NSData 的 bytes 函数得到内存地址,然后再调用 readUtf8String 读取内存中的数据,即可得到字符串。

遍历 NSDictionary 的代码如下:

遍历 NSArray 的代码如下:

下面我们学习如何使用拦截器编写一个 Hook fopen 的功能。了解一下 fopen 函数的原型和功能,原型如下:

其功能是使用给定的模式 mode 打开 filename 所指向的文件。文件如果打开成功,会返回一个指针,相当于句柄。如果文件打开失败则返回 0。

新建一个文件 fopen.js,添加下面的代码,其中 Interceptor.attach() 是我们添加的拦截器,拦截 fopen 函数,onEnter 是进入 fopen 函数时要执行的代码,打印出 fopen 的第一个参数,也就是 fopen 准备操作的文件路径,onLeave 是离开 fopen 函数时要执行的代码,打印返回值,并将返回值替换成 0, 这样 fopen 打开文件就会失败。

然后在计算机上执行命令 frida -U -l /Users/exchen/frida/fopen.js xxx,-l 参数表示加载指定的脚本文件,xxx 是你要操作的应用名称。此时我们看到原本 fopen 能操作的文件,使用拦截器修改返回值之后会打开失败。还有一种加载脚本的方法,是先进入交互模式,比如执行 frida -U xxx,注入 xxx 应用的进程,再调用 %load 命令加载脚本。如果想退出frida,保持应用在前台,然后在计算机上按 control+D 即可。

除了系统库自带的函数,我们还可以拦截自定义的函数,比如我们自定义一个 getStr 函数,返回的参数是一个字符串指针,我们在 onLeave 函数中添加下面的代码,新建一个变量 string,分配内存并填充字符串 4567789, 然后将返回值替换变量 string。

frida 不仅可以拦截 C 函数,还可以拦截 Objective-C 方法,比如我们编写脚本对 +[NSURL URLWithString:] 进行拦截,代码如下,其中 onEnter 调用 ObjC.classes.NSString.stringWithString_ 给 NSString 传递新的值,这样相当于替换原本的 URL。

有时候被拦截的函数调用的次数较多,打印的信息也会较多,我们需要保存成文件,方便以后慢慢查看,可以使用下面的代码将有用的信息保存成文件。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-5-12 02:33 被暗夜盗魔编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (12)
雪    币: 2512
活跃值: (672)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
第三篇:https://bbs.pediy.com/thread-259875.htm
2020-5-31 22:03
0
雪    币: 185
活跃值: (292)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
顶楼主
2020-7-24 11:12
0
雪    币: 248
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
666
2020-9-11 11:11
0
雪    币: 196
活跃值: (376)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
666666
2021-3-12 17:10
0
雪    币: 139
活跃值: (1170)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
如何fopen后,配合像CCCrypt的函数配套hook呢,比如应用场景 我fopen hook到后用js脚本过滤下文件名,然后匹配到我想要hook的文件名,接着再hook CCCrypt,从而得到这个加密文件的密钥,加密算法等等。
2021-7-9 12:08
1
雪    币: 276
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
为撒我尝试拦截NSURL URLWithString,urlString的修改值传不会args[2],就是app的请求Url还是不会变。
2022-3-19 17:00
1
雪    币: 276
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
哦哦那个上面那个我解决了,还想问一下怎么修改那个NSData数据。
2022-3-19 19:18
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9

顶,分享的很详细

最后于 2022-7-14 16:22 被-小君编辑 ,原因:
2022-7-14 15:57
0
雪    币: 27
活跃值: (1603)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
牛的,ios逆向必备
2022-10-4 13:03
0
雪    币: 693
活跃值: (3771)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
2022-10-4 23:44
0
雪    币: 982
活跃值: (426)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
如果函数返回布尔类型,在OnLeave使用typeof 或Objc.Object会导致app崩溃
2023-6-1 10:52
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
NSString   转换类型 NSDictionary, 在frida 的js中要怎么实现
2023-11-8 16:04
0
游客
登录 | 注册 方可回帖
返回
//