上一个大型版本的主题是 Stalker。对还不熟悉它的用户来说,它本质上是一个代码跟踪引擎:可跟踪线程,捕获执行的每个函数、每个代码块,甚至每条指令。除了跟踪代码,它还允许在任意位置添加和删除指令,并运用高级 JIT 技巧使这一切非常快速。

这听起来可能仍有些抽象,来看几个例子。你可以用它确定“这个函数还调用了哪些函数”。或者,你想在应用代码的每条 RET 指令处,用 Apple 语音合成器读出 RAX 寄存器的值?这里展示了实现方式。这也是我 2017 年 r2con 演讲中的演示之一。

此前 Stalker 仅支持 Intel 架构和 ARM64。现在我非常高兴地宣布:Stalker 也支持 ARM32 了!🎉 希望这个大家期待已久的后端能推动更多人在 Stalker 之上构建很酷的项目。它的潜力远不止“代码跟踪”;结合 CModule 后,也很容易在快速原型、动态行为和性能之间取得平衡。

此版本有太多内容值得介绍。另一项重大变化是升级了所有依赖,其中最有趣的可能是 V8 8.4。这意味着无需用 frida-compile 编译 Agent,就能使用可选链和空值合并运算符等最新 JavaScript 特性。此外还有性能提升,V8 在这方面也持续进步。

我们还新增了 Android 11 Developer Preview 4 支持;即使在未越狱 iOS 上,现在也完全支持 iOS/arm64e 应用。所有受支持平台都有大量改进。特别值得强调的是,我们终于消除了影响 Duktape JS 运行时的长期资源泄漏;自从 Duktape 成为默认 JS 运行时起,这个错误就一直存在。

这些改进涉及的领域实在太多,无法逐一深入说明,请务必查看下面的变更日志。

尽情体验吧!

12.9.0 的变更

  • Stalker 现已支持 ARM32。🎉
  • Stalker JS 集成不再破坏 errno / LastError。
  • Stalker.follow() 现在在 x86 和 ARM64 上可靠工作,包括 Windows 上目标线程处于系统调用时。
  • Stalker 终于能在 WoW64 上可靠工作。感谢 @zuypt!
  • 所有依赖均升级到最新版本,其中最令人兴奋的是支持最新 JavaScript 特性的 V8 8.4。
  • 终于发现并修复长期存在的 Duktape 内存泄漏。感谢 @disazoz 提交促成突破的错误报告。
  • Socket.connect() 出错时不再泄漏文件描述符及相关内存(由 GLib 依赖升级修复)。感谢 @1215clf 报告!
  • Kernel.read*() 在 V8 运行时中不再泄漏。
  • UNIX 构建系统迁移到 Meson 0.54。
  • Windows 构建系统迁移到 VS2019。
  • 除 v10 和 v12 外,也提供 Node.js v14 预构建包。
  • 提供 Electron v8 和 v9 预构建包。
  • 提供 Fedora F32 软件包。
  • 提供 Ubuntu 20.04 软件包。
  • Python 绑定不再使用弃用 API。
  • 支持仅使用 leanback 的 Android 应用。感谢 @5murfette!
  • arm64e 支持未越狱 iOS 上无 closure 的 spawn()。感谢 @mrmacete!
  • iOS usbmux 配对记录 plist 解析现也支持二进制 plist,修复 Frida 拒绝有线连接 iOS USB 设备的长期问题。感谢 @pachoo!
  • arm64e 也支持 ObjC.choose()。感谢 @mrmacete!
  • ObjC.protocols 枚举终于能始终正确工作,而非仅第一次有效。感谢 @CodeColorist 报告!
  • 初步支持 Android 11 Developer Preview。感谢 @abdawoud!
  • 兼容 MUSL libc。
  • 支持旧版 glibc,使二进制文件可在更多桌面 Linux 系统上运行。
  • Libc shim 也覆盖 memalign() 并支持较新的 GNU 工具链。
  • Exceptor 的 POSIX 后端现在能在 ARM32 上正确检测 Thumb,避免此前的随机崩溃。
  • Exceptor 不再破坏 i/macOS 上的“rflags”(x86_64)和“cpsr”(ARM64),并提供对原生上下文的写访问。
  • libc shim 新增四个关键 i/macOS 64 位系统调用:read()、write()、mmap()、munmap()。感谢 @mrmacete!
  • 为方便使用,iOS 二进制文件现在使用“skip-library-validation”权限签名。感谢 @elvanderb!
  • frida-core Vala API 绑定不再缺少 frida.Error 类型。
  • 脚本处于 LOADING 状态时,现在允许向其 post() 消息,适用于脚本需在 load() 期间发起同步请求的场景。感谢 @Gbps!
  • Gadget 终于支持在 64 位 ELF 目标上通过 V8 运行时进行早期插桩;此前构造函数会以错误顺序运行。感谢 @tacesrever!
  • Device.open_channel() 支持 TCP 之外的 ADB 通道。感谢 @aemmitt-ns!
  • ArmWriter 和 ThumbWriter API 支持多条新指令。
  • 大幅改进 ARM32 重定位器实现。
  • 通过加载器调用时,Linux 模块枚举可正常工作。
  • 改进 Linux 符号解析。
  • 改进 V8 运行时的参数列表处理,使 undefined 与 Duktape 运行时的行为一致。感谢 @mrmacete!
  • CModule Stalker API 恢复正常。
  • CModule 运行时现公开 Thread.{get,set}_system_error()。
  • CModule 在 Linux/MIPS 上现在提供桩实现,不再因 TinyCC 尚不支持 MIPS 而编译失败。
  • 配置 Capstone 以支持 ARMv8 A32 编码。

12.9.1 的变更

  • Python 绑定的 setup.py 现在能在 macOS 上正确处理 Python 3.x。

12.9.2 的变更

  • Fruity(iOS USB)后端不再向 stdio 输出警告。

12.9.3 的变更

  • 支持 Android 11 Developer Preview 4。感谢 @enovella_ 协助!
  • Linux 文件监控恢复良好状态。
  • ArmRelocator 可正确重定位涉及 PC 寄存器的 ADD 指令。
  • ThumbRelocator 可正确处理包含无条件分支的 IT 块,使 Interceptor 能 Hook 更多棘手情况。感谢 @bet4it!
  • Stalker ARM32 在 Thumb 模式下也支持 clone 系统调用。
  • Stalker ARM32 现在像 ARM64 后端一样抑制独占操作周围的事件。
  • Stalker ARM32 支持信任阈值。
  • 改进 ObjC 和 Java 桥接的错误处理,避免在不受支持的操作系统上导致进程崩溃。

12.9.4 的变更

  • Objective-C 运行时实际不可用时,ObjC.available 不再错误地声称可用。12.9.3 的错误处理重构破坏了这一点,而测试覆盖的盲区使回归未被发现。
  • Electron v9 已发布,因此现在只提供 v9 预构建包。

12.9.5 的变更

  • 最新 unc0ver 支持 iOS 早期插桩,即 spawn()。
  • iOS 崩溃报告器集成已移植到 iOS 13.5。
  • SystemFunction 现在不仅在 V8 运行时,也在 Duktape 运行时实现 call() 和 apply()。
  • Java 桥接终于能处理内嵌 nul 的字符串,修复自 Java 桥接诞生以来就存在的长期问题。感谢 @tacesrever!

12.9.6 的变更

  • 除了正确的 Windows 二进制文件外没有其他变化。上次 Windows CI worker 实际没有构建任何内容,发布了过期二进制文件。

12.9.7 的变更

  • unc0ver 越狱上的 iOS 早期插桩更加可靠:现在会在早期插桩中加载 substrate-inserter.dylib,让它有机会引导进程,并允许 Hook 引导程序已 Hook 的系统 API,无需担心引导程序遇到你的 Hook 时混乱。感谢 @mrmacete!

12.9.8 的变更

  • ApiResolver 实现现在支持在查询字符串后追加“/i”进行不区分大小写的匹配。感谢 @Hexploitable!
  • module ApiResolver 不再泄漏 MatchInfo 实例。
  • CModule 运行时新增 GLib.PatternSpec 和 GLib UTF-8 大小写辅助函数。
  • 新增 DebugSymbol.load(),可显式加载调试符号。目前仅在 Windows 上实现;Windows 还支持“module!symbol”记法,以提升性能和精度。感谢 @ohjeongwook!
  • Java 桥接新增 API:Java.enumerateMethods(query),可高效定位匹配指定查询的方法。
  • ObjC.choose() 不再因仅能在 V8 运行时复现的生命周期问题而崩溃。