很高兴宣布 Frida 16.6.0 发布,它显著改进了模块符号处理和性能,并修复了一些错误。
以下是主要亮点:
-
android:改善 ART 兼容性:
- 当缺少导出项时查找符号,因为 Frida 现已支持解析
.gnu_debugdata。 - 处理 runFlip 签名的变化(感谢 @matbrik)。
- 当缺少导出项时查找符号,因为 Frida 现已支持解析
- 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.ModuleAPI。已转为实例方法,以便高效执行多次查询。 - 停止支持在无 GObject 的情况下运行。节省的体积很小,不足以抵消增加的复杂性和降低的代码可读性。
-
gumjs:修复 V8
NativeCallback释放后使用问题(非 Interceptor),其中CpuContext的作用域过窄。
一如既往,祝大家黑客愉快!
oleavr