这次有一些很酷的新功能。直接进入正题吧。
tvOS 和 watchOS
本次令人兴奋的贡献之一来自 @tmm1,他提交了大量 pull request,为 tvOS 添加支持。太棒了!在合并这些改动时,我也借此机会添加了 watchOS 支持。
这也是简化构建系统的绝佳时机,我们移除了为支持 autotools 等非 Meson 构建系统而引入的复杂性。作为这次清理的一部分,现在针对 iOS Simulator、tvOS Simulator 等模拟器目标提供独立二进制文件。此前只支持 x86_64 iOS Simulator,现在 arm64 也已覆盖。
macOS 13 和 iOS 16
本周早些时候,@hsorbo 和我进行了一次愉快且高效的结对编程,着手处理 Apple 最新操作系统中的动态链接器变更。在 i/macOS 上使用 Frida 的用户可能已经注意到,spawn() 在 macOS 13 和 iOS 16 上无法工作了。
这个问题很有意思。事实证明,文件系统中的 dyld 二进制文件现在会在 dyld_shared_cache 中查找 UUID 与自身相同的 dyld;如果找到,就会把执行流转到那里。不过,要解释这为什么会破坏 Frida 的 spawn() 功能,还需要一点背景,请耐心听我说。
调用 attach() 时,如果 Frida 尚未注入 agent,它所做的工作之一就是注入 agent。但在执行注入前,我们会检查进程是否已充分初始化,也就是 libSystem 是否已经初始化。
如果尚未初始化,例如在 spawn() 之后目标停在 dyld 入口点时,Frida 基本上会推进主线程执行,直至到达 libSystem 已就绪的位置。这通常通过硬件断点完成。
由于新版 dyld 会链接到 dyld_shared_cache 中自身的另一个副本,Frida 此前把断点设置在从文件系统映射进来的版本中,而不是缓存中的版本。显然,这个断点永远不会命中,因此我们最终会在等待它发生时超时。
不过,修复相当直接,因此我们赶在最后一刻把它纳入了这个版本。
编译器改进
frida.Compiler 刚刚获得大幅改进,现在支持通过 tsconfig.json 进行更多配置,也支持使用本地 frida-gum 类型定义。
V8 调试器
改为每个脚本使用一个 V8 Isolate 后,V8 调试器集成失效了;这是一项为支持 V8 快照而必须进行的精细重构。现在该功能已恢复正常。
依赖项升级
本次工作量较大的部分显然是依赖项升级。目前,我们的大多数依赖项均已升级,例如从支持 ARMv9.2 的 Capstone 到使用 PCRE2 的最新版 GLib,等等。
迁移到 PCRE2 意味着 Memory.scan() 的正则表达式支持也随之升级,因为 GLib 此前使用的是 PCRE1。不过,我们目前还没有在任何平台上启用 PCRE2 的 JIT;以后要改进这一点并不困难。
交叉发布:frida-tools 12.0.2
我们还发布了全新的 frida-tools 版本。感谢 @tmm1,其中包含一项令人兴奋的新功能。frida-ls-devices 工具现在会显示信息更丰富的设备名称,并在第四列显示操作系统名称和版本:

升级方式:
$ pip3 install -U frida frida-toolsEOF
这个版本还包含其他一些好东西,建议查看下方的变更日志。
尽情使用吧!
变更日志
- darwin:添加 watchOS 和 tvOS 支持。感谢 @tmm1!
- darwin:修复 macOS 13 和 iOS 16 上的早期插桩。(感谢 @hsorbo 与我结对完成这个问题!)
- interceptor:在 iOS 等 W^X 系统上修改页面时暂停线程。这提高了对繁忙进程进行插桩时的稳定性。
- system-session:暂时重新启用 Exceptor。
- compiler:允许配置 target、lib 和 strict。
- compiler:修复对本地 frida-gum 类型定义的支持。
- compiler:使用 git 中最新的 @types/frida-gum。
- ci:停止为 Node.js 10 提供预构建版本。
- ci:发布 Node.js 19 的预构建版本。
- ci:发布 Electron 21 而非 20 的预构建版本。
- unw-backtracer:提高 32 位 ARM 上的准确性。
- thread:向 Gum C API 添加 suspend() 和 resume()。
- darwin:改进 chained fixup 的处理。
- darwin:修复 arm64e 上的 Objective-C 符号合成。
- linux:检测 Linux 上的 noxsave。
- linux:改进注入器以处理伪 .so 映射。感谢 @lx866!
- module-map:支持查找带有 ptrauth 位的地址。
- gumjs:添加 NativeFunction traps: ‘none’ 选项。感谢 @mrmacete!
- gumjs:防止 File 和 SQLite API 触发 Interceptor。感谢 @mrmacete!
- gumjs:执行 V8 作业时持有 Isolate 锁。
- gumjs:修复销毁 V8 脚本时的死锁。
- gumjs:修复 V8 调试器无法看到已加载脚本的问题。
- gumjs:修复 Darwin/arm64e 上对 CModule 外部工具链的支持。
- gumjs:当 V8 MAP_JIT 在 Darwin 上失败时使用后备方案。
- gumjs:初始化后不再冻结 V8 标志,以避免在 Darwin 上的强化进程中出现问题。
- socket:升级到 libsoup 3.x,以支持 HTTP/2。
- devkit:向 frida-core kit 添加 .gir。感谢 @lateralusd!
- devkit:更新示例以使用当前的 Device API。
- python:在所有平台上支持 UNIX socket 地址。
- node:修复 Node.js v19 兼容性。
- deps:将大多数依赖项升级到最新最佳版本。
- build:重构并移除非 Meson 遗留代码。
oleavr