很高兴宣布 Frida 16.6.0 发布,它显著改进了模块符号处理和性能,并修复了一些错误。

以下是主要亮点:

  • android:改善 ART 兼容性:
    • 当缺少导出项时查找符号,因为 Frida 现已支持解析 .gnu_debugdata。
    • 处理 runFlip 签名的变化(感谢 @matbrik)。
  • android:修复 enumerateLoadedClasses() 中的溢出(感谢 @123edi10)。 现在会逐步创建和清理全局引用,而不是在开始和结束时一次性处理全部引用。
  • android:在 registerClass() 中支持静态方法(感谢 @5andr0)。
  • java:修复 32 位系统上由 JVMTI 驱动的 Java.choose()。
  • module:将 Module API 改为实例方法,以便高效执行多次查询。之前只在 JavaScript(GumJS)层以这种方式建模,其中这类 JS 对象会将模块路径作为字符串传给 enumerateExports() 等每次查询。底层 C API 现在也以相同方式建模。
  • gumjs:添加 findSymbolByName() 和 getSymbolByName() 方法。 直接以原生方式按名称查找符号,而不是枚举所有符号后再在 JavaScript 中过滤。
  • module:优化 find_symbol_by_name() 的回退路径。当 Module 实现缺少优化的符号查找方法时, 构建排序索引并对其进行二分搜索。
  • elf-module:未找到符号时使用 MiniDebugInfo。当 enumerate_symbols() 遇到内存中 没有符号的 ELF 时,实例化一个离线 ElfModule 实例并解析 .gnu_debugdata 节。 解压其中嵌入的 ELF,并将其符号作为回退。
  • ncm:将每次传输的数据报上限设为 16,改善用户空间 USB CDC-NCM 驱动的性能 (感谢 @hsorbo 与我结对编程!)。
  • 移植到新的 Gum.Module API。已转为实例方法,以便高效执行多次查询。
  • 停止支持在无 GObject 的情况下运行。节省的体积很小,不足以抵消增加的复杂性和降低的代码可读性。
  • gumjs:修复 V8 NativeCallback 释放后使用问题(非 Interceptor),其中 CpuContext 的作用域过窄。

一如既往,祝大家黑客愉快!