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 回归问题
这次就这些。请在网络上分享这篇文章,帮助我们把消息传出去。作为一个开源项目,我们的规模仍然很小,所以口碑传播对我们意义重大。
祝使用愉快!
oleavr