过去几周,我们在所有平台上密集修复了大量问题,我想是时候再提升一个次版本号,让大家关注这次发布了。
其中有一项修复尤其值得单独说明。Android Java 集成中长期存在一个错误:传递异常时,进程偶尔会崩溃,堆栈跟踪中通常会出现 GetOatQuickMethodHeader()。感谢 Jake Van Dyke 和 Giovanni Rocca 协助追踪这个问题。自从 Frida 支持 ART 以来,这个错误就一直存在,因此这项修复值得庆祝。🎉
我们的 V8 运行时也稳定了许多,子进程门控比以往任何时候都更好用,Android 设备兼容性显著改善,等等。
归根结底,这是 Frida 有史以来最稳定的版本——现在正是确认自己正在运行 Frida 12.6 的时候。
尽情使用吧!
12.6.1 的变更
- Android Java 集成中的异常传递修复,在以解释器模式运行 VM 时引入了性能瓶颈,例如通过 Java.deoptimizeEverything() 运行时。以 Pixel 3(Android 9)从启动 Dropbox 应用到登录界面为例,之前大约需要 94 秒,现在只需约 6 秒。
12.6.2 的变更
- 感谢 Giovanni Rocca 贡献的修复,Android Java 集成现在支持更多 arm64 系统。
- Android Java 集成再次支持同时供多个脚本使用。
12.6.3 的变更
- 感谢 Eugene Kolo 贡献的修复,Java.choose() 现在可在 Android >= 8.1 上正常工作。
- Android Java 集成的解除 hook 功能现已恢复。这也意味着卸载脚本时会正确还原 hook。
- Frida 现在可以与加入“每脚本运行时选择”功能之前的旧版 Frida 通信。
12.6.4 的变更
- 构建系统已在所有平台上恢复正常。
12.6.5 的变更
- Linux 线程枚举现在可在 x86-64 上正常工作。
- Stalker 终于能够处理可重启的 Linux 系统调用。
12.6.6 的变更
- Android Java 集成已在 32 位 ARM 上完全恢复正常。
12.6.7 的变更
- 现已支持最新的 Chimera iOS 越狱;已确认可在 1.0.8 上正常工作。
- Linux 注入器现在可以处理 libc 名称存在歧义的目标进程,这在 Android 上经常出现。
12.6.8 的变更
- ObjC.Object 现在提供 $moduleName,可用于确定某个类属于哪个模块。感谢 David Weinstein 贡献这项实用功能!
12.6.9 的变更
- 现已完整支持最新版 unc0ver 越狱。
- 早期插桩逻辑已得到改进,现可完整支持 iOS 12。感谢 Francesco Tamagni 协助完成这些棘手的改动。
- iOS 12 上的内存范围枚举现在更加可靠,因为属于线程的内存范围已被正确隐藏。
- 隐藏的内存范围现在会被合并,使查找更快。
- 子进程门控现在可以将子进程保持暂停超过 25 秒。此前,子进程会在这个意外设置的超时时间后自动恢复。这也会影响 Android 上的早期插桩,因为它构建在子进程门控之上。
- 感谢 John Coates 的出色贡献,Swift 绑定现已支持 RPC,并迁移至 Swift 5.0。
12.6.10 的变更
- 内存范围枚举现在在所有平台上都很可靠。此前存在一个长期错误:移除操作将已有范围拆分时会出现问题。
12.6.11 的变更
- 感谢 CodeColorist 提供的优秀修复,在 iOS >= 12 上枚举应用时现在会包含图标。
- 感谢 gebing 的精彩贡献,Gadget 现在能够检测 Android 应用的可执行文件名和包名。
- 内存范围隐藏功能获得了一项影响 Windows 用户的关键修复。
12.6.12 的变更
- frida-inject 工具现在支持通过 -P/–parameters 向脚本传递参数。感谢 Eugene Kolo 贡献这项实用功能。
- 当脚本卸载发生阻塞时,子进程门控不再死锁。感谢 Ioannis Gasparis 协助追踪这个问题。
- 子进程门控变得更加可靠:Frida 现在会在更高的编号区间分配文件描述符,以避免应用在 fork()+exec() 期间调用 dup2() 时关闭它们。这种情况通常发生在 Android 应用调用 Runtime.exec() 时。感谢 Ioannis Gasparis 协助追踪这个问题。
- 在 Muhammed Ziad 大量精彩贡献的帮助下,艰难的 Android NDK r20 升级终于落地。
- 错误处理得到改进,可避免因权限不足导致初始化失败时发生崩溃。感谢 pancake 报告问题。
- 在分支中搁置已久的 iOS 原生 lockdown 集成终于合并。它尚未完成,被视为不稳定 API,但由于正在进行一项重大重构,必须将其合并。
- Stalker 现在允许从 transform 回调中调用 unfollow(),不会再像以前那样导致进程崩溃。感谢 Giovanni Rocca 协助修复此问题。
- Gadget 的 Android 包名检测逻辑得到改进,可以处理此前未考虑到的一种边界情况。感谢 xiaobaiyey 报告问题并提出修复建议。
- Java.registerClass() API 得到改进,支持指定父类;同时还修复了该 API 以及带泛型数组处理方面的大量问题。衷心感谢 gebing 带来的这些出色改进。
12.6.13 的变更
- Agent 和 Gadget 中的构造函数与析构函数现在终于能够正确排序,因此可以移除 libc shim 中针对内存分配器的变通方案。由于工具链的 libgcc 发生细微变化,这些脆弱的变通方案在 Android 的 32 位 ARM 进程中以一种全新且离奇的方式失效了。
- libc shim 现在还会处理 __cxa_atexit() 和 atexit(),其中前者对于避免泄漏至关重要。
12.6.14 的变更
- 感谢 gebing 贡献的出色改进,Java.registerClass() API 现在支持用户定义的构造函数和字段。
- 现在会在所有平台上清理临时文件。
- Windows 上的 frida-server 现在会处理 Ctrl+C,以支持优雅关闭且不留下临时文件。
12.6.15 的变更
- NativePointerValue(即除了 NativePointer 外,还支持传入带有 handle 属性的对象)现在再次可在所有环境中正常工作。
12.6.16 的变更
- frida-gadget-ios 元软件包现在不再有依赖项。
12.6.17 的变更
- 崩溃报告器集成现在兼容 iOS 12.4。
- Java 集成得到改进,在被替换的方法被调用时会立即释放全局句柄,以免句柄耗尽。感谢 gebing 带来这项优秀改进。
- 新增 Java.retain(),允许保存 this,供日后在被替换的 Java 方法之外使用。
- 对旧版 Android 的支持现在应该略有改善。
- 在 i/macOS 上向目标进程注入库时,如果目标进程终止,Frida 不再崩溃。
- 感谢 Jon Wilson 的出色贡献,现已支持 MIPS64。
- 感谢 gebing 的修复,Memory.patchCode() 在 android-arm64 上不再崩溃。
- 现在可以正确拦截已被拦截的 Thumb 函数。
- 在 iOS 进程生命周期早期记录日志时,Frida 不再崩溃。
- 简单的 ModuleApiResolver 查询现在快如闪电。
- Duktape 运行时不再包含存在问题的 Reflect 内置对象。
- Interceptor C API 已重构,以改进命名。
12.6.18 的变更
- Gadget 二进制文件再次会在所有平台上剥离符号。
12.6.19 的变更
- 所有 API 现在都可以取消。Python 和 Node.js 语言绑定支持传入 Cancellable 对象。其他语言绑定的行为与之前相同,非常欢迎大家贡献改进。
12.6.20 的变更
- DeviceManager.find_device() 启动时不再崩溃。
12.6.21 的变更
- Future.wait_async() 在最后一刻被取消时不再崩溃。
12.6.22 的变更
- 状态管理得到改进,在已释放状态下也允许调用 eternalize() 和 post()。
- dispose() RPC 导出现在会收到一个说明原因的参数,以区分 unload、exit 和 exec。
- 如果 exec 转换失败,现在可以再次对脚本调用 dispose()。
- frida-inject CLI 工具得到改进,会在分离时退出。
- 当 post_rpc_message() 失败时,RpcClient 不再崩溃。
- 现在会在 iOS 和 Android 上禁用 Fruity 与 Droidy 后端,以减小这些后端不适用平台上的占用空间。
12.6.23 的变更
- 请求进行期间丢失 HostSession 时,Frida 不再崩溃。
oleavr