Frida 的合作伙伴们最近在多条战线上持续攻坚,进展多到让我觉得值得写下这篇文章,把消息传出去。

在 Dalvik 方面,@marc1006 贡献了一项非常棒的新功能——对象挖掘,也就是扫描堆来查找某种类型的对象。看看这个:

const strings = [];
Dalvik.choose('java.lang.String', {
  onMatch(str) {
    strings.push(str);
  },
  onComplete() {
    console.log('Found ' + strings.length + ' strings!');
  }
});

与此同时,@Tyilo 也为 Objective-C 添加了同样的功能:

const strings = [];
ObjC.choose(ObjC.classes.NSString, {
  onMatch(str) {
    strings.push(str);
  },
  onComplete() {
    console.log('Found ' + strings.length + ' strings!');
  }
});

在移动平台的其他消息中,@pancake 添加了在 Firefox OS 上枚举应用的支持。太棒了!

在这些工作进行的同时,@s1341 一直在努力提升 QNX 移植版的稳定性,据报告,现在已经运行得非常好。

在我这边,我一直在 NowSecure 用 Frida 解决一些有趣的挑战,并在 Objective-C 集成中遇到了不少错误和限制。现在已支持重写处理按值传递结构体类型的方法,例如 -[UIView drawRect:],这意味着 NativeFunction 和 NativeCallback 也支持这些类型。要声明一个结构体,只需用一个数组开头,按顺序指定各字段的类型。你甚至可以嵌套它们。因此,对于 - drawRect: 这种按值传递结构体、而该结构体又由另外两个结构体组成的情况,可以这样声明:

const f = new NativeFunction(ptr('0x1234'), 'void',
    [[['double', 'double'], ['double', 'double']]]);

另一件值得一提的事是,一个尤其容易在对 32 位 iOS 应用进行插桩时显现、但影响所有平台的长期问题,终于得到了修复。

下面快速过一遍所有变更:

4.1.8:

  • core:添加在 Firefox OS 上枚举应用的支持
  • core:添加 NativePointer.toMatchPattern(),供 Memory.scan() 使用
  • core:修复 QNX 注入器竞态条件
  • objc:大幅改进类型处理
  • objc:修复从 JS 字符串到 NSString 的隐式转换
  • objc:修复注册第二个代理或未命名类时的崩溃
  • objc:新增 ObjC.Object 属性:$className 和 $super
  • dalvik:添加用于对象挖掘的 Dalvik.choose()

4.1.9:

  • core:NativeFunction 和 NativeCallback 现在支持按值传递结构体类型的函数
  • core:修复 Process.getModuleByName() 中意外的大小写敏感问题
  • dalvik:新增对象属性:$className

4.2.0:

  • core:向 Interceptor 的 onEnter 和 onLeave 回调添加 this.returnAddress
  • objc:添加用于对象挖掘的 ObjC.choose()

4.2.1:

  • core:修复 QNX 上枚举已剥离符号库的导出项
  • objc:新增 ObjC.Object 属性:$kind,其值为 instance、class 或 meta-class 之一
  • objc:修复 $class 属性,使其对类也能正确处理
  • objc:修复查找不存在的方法时的崩溃
  • python:确保反应器线程能平稳关闭
  • frida-discover:修复回归问题
  • frida-repl:修复评估表达式期间目标崩溃时的卡死

4.2.2:

  • core:修复异常处理中的怪异行为,该问题在 ios-arm 上非常明显
  • core:QNX 稳定性改进
  • objc:添加 ObjC.api,用于直接访问 Objective-C 运行时 API
  • objc:新增 ObjC.Object 属性:equals、$superClass 和 $methods
  • objc:修复 iOS 7 兼容性
  • objc:修复 ObjC.classes 和 ObjC.protocols 的 toJSON()
  • dalvik:修复 java.lang.CharSequence 的处理
  • frida-repl:添加 %time 命令,便于进行性能分析

4.2.3:

  • core:修复处理没有 message 对象的异常时的崩溃
  • core:修复 CpuContext JS 包装器的生命周期
  • core:向 Process.enumerateRanges() 公开文件映射信息
  • core:在枚举时支持合并相邻区间
  • core:添加用于查找模块和区间的便捷 API
  • core:让 QNX mprotect 在循环中读取,而不是只读一次
  • dalvik:类型转换失败时避免使进程崩溃
  • dalvik:允许使用 null 作为调用参数
  • objc:修复简单字段类型结构体的转换
  • objc:通过缓存包装对象加快隐式字符串转换

4.2.4:

  • objc:修复与尚未实现的类交互时的崩溃

4.2.5:

  • core:优化 Interceptor 回调逻辑,在未同时指定 onEnter 和 onLeave 时将速度提高一倍
  • core:修复 arm64 上调用上下文所见的返回地址
  • core:添加 arm64 模糊回溯器

4.2.6:

  • core:修复在 arm64 上访问第 4 至第 7 个参数的问题
  • core:添加 Memory.readFloat()、Memory.writeFloat()、Memory.readDouble() 和 Memory.writeDouble()
  • dalvik:改进类型检查
  • qnx:实现侧栈,以便用栈消耗很大的 V8 引擎调用 onEnter()/onLeave()

4.2.7:

  • core:Darwin 后端错误修复
  • core:优化 send() 数据载荷的处理
  • core:添加通过 task_for_pid(0) 与 iOS 内核交互的 API,仅在 attach(pid=0) 会话中可用
  • core:在 QNX 上为被替换函数添加侧栈支持
  • objc:向 ObjC.classes 添加 getOwnPropertyNames()
  • frida-repl:改进补全

4.2.8:

  • python:修复 Py3k 回归问题

4.2.9:

  • objc:向 ObjC.Object 添加 $ownMethods
  • dalvik:添加原始类型数组和对象数组支持
  • python:改进 Python 2 与 3 之间的兼容性
  • frida-repl:改进魔法命令

4.2.10:

  • core:修复 arm64 上 Interceptor 破坏向量寄存器的问题
  • core:改进 Android 上的临时目录处理

4.2.11:

  • dalvik:添加访问实例字段和静态字段的支持
  • dalvik:改进类型转换
  • python:在 Mac 上延迟解析 Python 运行时,使我们的二进制文件能适用于多种 Python 发行版
  • python:支持 pip

4.2.12:

  • python:修复 Py3k 回归问题

这次就这些。请在网络上分享这篇文章,帮助我们把消息传出去。作为一个开源项目,我们的规模仍然很小,所以口碑传播对我们意义重大。

祝使用愉快!