资源占用

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

我们投入了大量精力,确保 Frida 能够从桌面系统一路扩展到嵌入式系统。

预构建的二进制文件会启用全部功能,而自行构建 Frida 则可以按需定制,并生成小得多的 二进制文件。具体做法是调整 config.mk 中的可用选项:

# Features ordered by binary footprint, from largest to smallest
FRIDA_V8 ?= enabled
FRIDA_CONNECTIVITY ?= enabled
FRIDA_DATABASE ?= enabled
FRIDA_JAVA_BRIDGE ?= auto
FRIDA_OBJC_BRIDGE ?= auto
FRIDA_SWIFT_BRIDGE ?= auto

如果面向嵌入式系统,上述功能都可以禁用。

具体来说,只有在以下情况下才需要它们:

  • FRIDA_V8:默认 JavaScript 运行时是 QuickJS,因此不使用 V8 时可以安全禁用。 如果需要 V8 运行时,则必须启用,例如通过 API 明确请求 create_script(..., runtime='v8'),或在 frida-tools CLI 中使用 --runtime=v8。
  • FRIDA_CONNECTIVITY:使用证书启用 TLS,或使用 setup_peer_connection() (API)或 --p2p(CLI)时必须启用。请注意,普通网络连接并不需要它。例如, 以这种方式使用 frida-server 时无需启用:frida-server -l 0.0.0.0。
  • FRIDA_DATABASE:使用 SqliteDatabase 及相关 API 时必须启用,否则可以安全禁用。
  • FRIDA_JAVA_BRIDGE:希望在带有 Java 虚拟机或 Android Runtime 环境的进程中 调用或插桩 Java API 时必须启用。请注意,除 Java 外,还有 Kotlin、Scala 等 语言也运行在 JVM 或 Android Runtime 上。
  • FRIDA_OBJC_BRIDGE 和 FRIDA_SWIFT_BRIDGE:希望调用或插桩 Objective-C 或 Swift 代码时必须启用。它们在 i/macOS 等 Apple 操作系统上很有用,在 Apple 生态系统之外则可以安全禁用。

下面逐项查看不同选项对 Linux/armhf(32 位 ARM)上占用空间的影响。

为了让下面的内容更清晰,我们在 frida-core 的 Meson 选项中加入了 -Dassets=installed。这意味着 frida-agent.so 不会嵌入 frida-server/frida-inject 二进制文件,而是从文件系统加载。

这通常也是嵌入式系统所需要的方式,因为无论 /tmp 位于闪存还是 tmpfs,将 agent 写入其中都会造成一定浪费。

在 linux-armhf 上启用 config.mk 的全部功能

3.8M frida-inject
3.2M frida-server
 15M frida-agent.so
 15M frida-gadget.so

第 1 步:禁用 V8

3.8M frida-inject
3.2M frida-server
5.2M frida-agent.so
5.3M frida-gadget.so

Agent 减少了 9.8M。

第 2 步:禁用连接功能(TLS 和 ICE),从而去除 OpenSSL

2.6M frida-inject
2.0M frida-server
3.6M frida-agent.so
3.7M frida-gadget.so

Agent 减少了 1.6M。

第 3 步:禁用 GumJS Database API,从而去除 SQLite

2.6M frida-inject
2.0M frida-server
3.2M frida-agent.so
3.3M frida-gadget.so

Agent 减少了 0.4M。

第 4 步:禁用 GumJS 桥接:ObjC、Swift、Java

2.6M frida-inject
2.0M frida-server
2.8M frida-agent.so
2.9M frida-gadget.so

Agent 减少了 0.4M。

来看看最后保留了哪些内容:

frida-agent.so 占用空间

为了满足好奇心,再仔细看看其中三个较为突出的组件:

libcapstone.a 占用空间

libglib-2.0.a 占用空间

libgio-2.0.a 占用空间