运行模式

本页为社区译文;如有疑义,请以英文原文为准。 英文原文

Frida 通过其强大的插桩核心 Gum 提供动态插桩能力,Gum 使用 C 编写。由于这类插桩逻辑往往需要频繁修改,通常最好使用脚本语言编写,从而在开发和维护期间获得较短的反馈周期。GumJS 正是为此而生。只需编写几行 C,就能在一个可完整访问 Gum API 的运行时中执行 JavaScript,由此你可以挂钩函数,枚举已加载的库及其导入、导出函数,读写内存,扫描内存中的模式等。

目录

  1. 注入模式
  2. 嵌入模式
  3. 预加载模式

注入模式

但在大多数情况下,你会希望启动一个现有程序、附加到正在运行的程序,或者在程序启动时接管它,然后在其中运行插桩逻辑。由于这是使用 Frida 最常见的方式,我们的大部分文档也都以此为重点。此功能由 frida-core 提供。它充当协调层,将 GumJS 打包到一个共享库中并注入现有软件;如有需要,它还提供一条双向通信通道,用于与你的脚本交互,并可在之后卸载这些脚本。除了这项核心功能外,frida-core 还允许你枚举已安装的应用、正在运行的进程和已连接的设备。连接的设备通常是正在运行 frida-server 的 iOS 或 Android 设备。该组件本质上只是一个通过 TCP 公开 frida-core 的守护进程,默认监听 localhost:27042。

嵌入模式

有时无法以注入模式使用 Frida,例如在受到沙箱限制的 iOS 和 Android 系统上。针对这种情况,我们提供了 frida-gadget:一个需要嵌入到待插桩程序中的共享库。只需加载这个库,你就可以使用 frida-trace 等现有的 Frida 工具与它远程交互。它还支持完全自主的方式,无需任何外部通信,直接运行文件系统中的脚本。

在此处进一步了解 Gadget。

预加载模式

你或许熟悉 LD_PRELOAD 或 DYLD_INSERT_LIBRARIES。如果有一个 JS_PRELOAD,岂不是很酷?上一节介绍的共享库 frida-gadget 正适合这种场景:将它配置为加载文件系统中的脚本,即可自主运行。

在此处进一步了解 Gadget。