本文是 Frida 系列教程的第四篇,讲解 API查找器和拦截器的组合使用,以及替换 implementation 的方式进行 Hook。
第一篇:【Frida 实战】在 iOS 上分析应用
第二篇:【Frida 实战】Hook 大法,拦截器的使用
第三篇:【Frida 实战】如何拦截 sub_xxxx 这种函数
在前面的 Frida 教程中我们讲到了如何使用拦截器(Interceptor)对 Objective-C 方法和 C 函数进行 Hook,这种方式对指定的几个函数进行操作比较方便,但是如果有些情况需要批量 Hook,比如对某一个类的所有方法进行 Hook,或者对某个模块的特定名称的函数进行 Hook,可能我们并不知道准确的名称是什么,只知道大概的关键字,这种情况怎么 Hook 呢?这时就得使用 API查找器(ApiResolver)先把感兴趣函数给找出来,得到地址之后就能 Hook 了。
API查找器支持对 Objective-C 方法和 C 函数的查找,比如我们来写一个脚本,找到 NSFileManager 这个类名下的所有方法。新建一个 ApiResolver,如果查找 Objective-C,ApiResolver 参数中填写 objc,如果是查找 C 函数,ApiResolver 参数中填写 module,然后调用 enumerateMatches 枚举函数,每次枚举到一个函数会调用一次 onMatch,回调参数 match 包含 name 和 address 两个属性,分别代表名称和地址。整个枚举过程完成之后会调用 onComplete,代码如下:
var resolver = new ApiResolver('objc');resolver.enumerateMatches('*[NSFileManager *]', {
onMatch: function(match) {
console.log(match['name'] + ":" + match['address']); }, onComplete: function() {}});
附加 Safari 浏览器并加载脚本,会打印出 NSFileManager 所有的方法。
frida -U -l hook_objc.js "Safari 浏览器"-[NSFileManager dealloc]:0x1e2324034-[NSFileManager setDelegate:]:0x1e23b2744-[NSFileManager delegate]:0x1e2333ab8-[NSFileManager _info]:0x1e2333ae0-[NSFileManager removeItemAtURL:error:]: