std-microblock/fripack

GitHub: std-microblock/fripack

将 Frida 脚本打包为多种格式的可执行文件,解决 Frida 分发难、依赖重的问题

Stars: 205 | Forks: 45

# Fripack ### 将你的 Frida 脚本打包为可执行文件。 [中文](./README_zh.md) image Frida 是一个强大的工具,但其庞大的体积以及对 root 权限的需求,使得向最终用户分发脚本变得具有挑战性。这通常限制了 Frida 在为更广泛受众开发插件方面的应用。 Fripack 解决了这个问题,它将你的 Frida 脚本打包成各种可执行格式——例如 Xposed Modules、修补过的 apk、用于 `LD_PRELOAD` 的共享对象或可注入的 DLL——从而实现了基于 Frida 的插件的轻松分发和使用。 ### 二进制文件大小很重要 最初的 Frida 项目体积相当大。Fripack 对 Frida 进行了精简和压缩,使得在所有平台(Linux 除外)上的二进制输出文件都小于 10 MB。 image ### 一键构建 跨平台 Frida 脚本往往使得为不同目标构建交付物变得繁琐——即使使用 Frida Gadget 也是如此。Fripack 通过支持一次性为多个平台进行构建,简化了开发流程。 ## 安装 从 [releases 页面](https://github.com/std-microblock/fripack/releases/latest) 下载最新的二进制文件,并根据需要进行安装。 如果你的电脑上已经安装了 Rust,你也可以使用 cargo 进行安装: ``` cargo install --git https://github.com/std-microblock/fripack/ ``` ## 快速入门 ### 基本配置 Fripack 使用名为 `fripack.json` 的配置文件,该文件支持 JSON5 语法。以下是一个基本示例: ``` { "xposed": { "type": "xposed", "version": "1.0.0", "fridaVersion": "17.5.1", "entry": "main.js", "platform": "android-arm64", "xposed": { "packageName": "com.example.myxposedmodule", "name": "My Xposed Module" }, "sign": { "keystore": "./.android/debug.keystore", "keystorePass": "android", "keystoreAlias": "androiddebugkey" } } } ``` 配置中的每个键代表一个构建目标。你可以使用以下命令构建所有目标: ``` fripack build ``` 或者构建特定目标(例如 `xposed`): ``` fripack build xposed ``` 或者监视特定目标的更改: ``` fripack watch xposed ``` ### 通用配置选项 以下选项适用于所有目标类型: - `xz` (默认值: `false`): 使用 LZMA 压缩脚本。 - `entry` (必填): 要打包的入口点脚本。 - `fridaVersion` (必填): 要使用的 Frida 版本(必须为 17.5.1 或更高版本)。 - `outputDir` (默认值: `./fripack`): 构建产物的输出目录。 - `platform`: 目标平台 (例如 `android-arm64`, `windows-x86_64`)。 - 有效值: `android-arm32`, `android-arm64`, `android-x86`, `android-x64`, `windows-x64`, `linux-x64` - `version`: 插件的版本。 - `type`: 目标的类型 (定义输出格式)。 - `inherit`: 要继承配置的另一个目标的键。 - `targetBaseName` (可选): 输出文件的基本名称 (默认为目标键)。 - `beforeBuild` (可选): 在构建目标之前执行的命令。 - `afterBuild` (可选): 在成功构建目标之后执行的命令。 - `watchPath` 监视文件更改的附加目录。 - `pushPath` : 在 `watch` 模式下将 JavaScript 文件推送到设备的目标路径。默认为 `/data/local/tmp/fripack_dev.js`。 使用继承来避免重复的示例: ``` { "base": { "version": "1.0.0", "fridaVersion": "17.5.1", "entry": "main.js", "xz": true, "outputDir": "./fripack", "platform": "android-arm64" }, "xposed": { "inherit": "base", "type": "xposed", "xposed": { "packageName": "com.example.myxposedmodule", "name": "My Xposed Module" }, "sign": { "keystore": "./.android/debug.keystore", "keystorePass": "android", "keystoreAlias": "androiddebugkey" } }, "raw-so": { "inherit": "base", "type": "shared" } } ``` 只有包含 `type` 字段的目标才会被构建。 ### 支持的目标类型 #### `xposed` 将你的 Frida 脚本构建为 Xposed Module。仅支持 `Android` 平台。 **需要:** 系统中已安装 [`apktool`](https://apktool.org/)。 **附加选项:** - `xposed` (必填): Xposed 配置对象。 - `packageName` (必填): Xposed 模块的包名。 - `name` (必填): 模块的显示名称。 - `icon` (可选): 模块图标的路径 (期望在同一目录下包含 `ic_launcher.webp` 和 `ic_launcher_round.webp`)。 - `scope` (可选): 模块的建议目标作用域。 - `description` (可选): 模块的描述。 - `sign` (可选): 签名配置。如果作为对象提供,APK 将被签名。 - `keystore`: keystore 的路径。 - `keystorePass`: keystore 密码。 - `keystoreAlias`: keystore 中的别名。 - `keyPass` (可选): 签名者私钥的密码。 #### `shared` 将你的 Frida 脚本构建为共享库 (`.so` / `.dll`),可以通过各种方法加载 (例如 `LD_PRELOAD`)。 #### `inject-apk` 通过修改现有 APK 的一个原生库,将你的 Frida 脚本注入其中。仅支持 `Android` 平台。 **需要:** 系统中已安装 [`apktool`](https://apktool.org/)。 同时也建议在你的路径中包含 [`zipalign`](https://developer.android.com/tools/zipalign)。 **附加选项:** - `injectApk` (必填): 注入配置对象。 - `sourceApkPath` (可选): 要注入的源 APK 文件路径。 - `sourceApkPackageName` (可选): 要从已连接设备中提取的 APK 包名。 - 必须提供 `sourceApkPath` 或 `sourceApkPackageName` 中的任意一个。 - 当使用 `sourceApkPackageName` 时,APK 将从已连接的设备中提取并缓存以供将来构建。这需要系统中安装 [`adb`](https://developer.android.com/studio/command-line/adb)。 - `injectMode` (可选): 注入模式。目前仅支持 `"NativeAddNeeded"`。 - `targetLib` (可选): 注入目标的特定原生库 (例如 `"libnative-lib.so"`)。 - 如果未指定,将按以下优先顺序搜索库: 1. `libCrashSight.so`, `libBugly.so`, `libmmkv.so` (白名单) 2. lib 目录中最小的 `.so` 文件 (会有警告) - `sign` (可选): 最终 APK 的签名配置 (格式与 Xposed 相同)。 - `keystore`: keystore 的路径。 - `keystorePass`: keystore 密码。 - `keystoreAlias`: keystore 中的别名。 - `keyPass` (可选): 签名者私钥的密码。 **配置示例:** ``` { "inject-apk": { "type": "inject-apk", "platform": "android-arm64", "fridaVersion": "17.5.1", "entry": "main.js", "injectApk": { "sourceApkPackageName": "com.example.app", "injectMode": "NativeAddNeeded", "targetLib": "libnative-lib.so", }, "sign": { "keystore": "./.android/debug.keystore", "keystorePass": "android", "keystoreAlias": "androiddebugkey" } } } ``` #### `zygisk` 将你的 Frida 脚本构建为 Magisk 的 Zygisk 模块。仅支持 `Android` 平台。 **附加选项:** - `zygisk` (必填): Zygisk 配置对象。 - `id` (必填): 模块 ID - `name` (必填): 模块显示名称 - `version` (可选): 模块版本 (默认为 "1.0")。 - `versionCode` (可选): 模块版本代码 (默认为 1)。 - `author` (可选): 模块作者 (默认为 "FriPack")。 - `description` (可选): 模块描述。 - `scope` (必填): 注入的目标应用程序,用分号分隔。 **配置示例:** ``` { "zygisk": { "type": "zygisk", "platform": "android-arm64", "fridaVersion": "17.5.1", "entry": "main.js", "zygisk": { "id": "com.example.myzygiskmodule", "name": "My Zygisk Module", "version": "1.0.0", "versionCode": 1, "author": "Your Name", "description": "A Zygisk module that injects Frida scripts", "scope": "com.example.app1;com.example.app2" } } } ``` ### 使用 Fripack 开发 Frida 脚本 Fripack 支持用于开发的监视模式 (watch mode),该模式无需重新构建整个包即可实现 JavaScript 文件的热重载。 #### 用法 开始监视一个目标: ``` fripack watch my-watch-target ``` 监视进程将会: 1. 首先构建并安装目标。请注意,对于非 `xposed` 类型的目标,你需要手动安装目标。 2. 监视文件更改 3. 检测到更改时自动更新 4. 持续运行直到你按下 Ctrl+C **注意**:监视模式需要安装 `adb` 并可在你的 PATH 中访问,以便将文件推送到 Android 设备并安装软件包。 #### 这是如何工作的? 在监视模式下,注入的 payload 会监视指定的路径,并在文件更改时触发重载。该路径通过 `pushPath` 设置,默认为 `/data/local/tmp/fripack_dev.js`。在 Android 平台上,fripack 还会监视 `entry` 文件,并在其被修改时自动将其推送到 `pushPath` 位置。在其他平台上,你可以设置自己的 `pushPath` 并在更改时手动复制文件,或者继续使用 `frida-server` 直接进行开发工作流。 ## 备注 ### 如何查看日志? 在 Android 上,日志通过 Android 日志系统输出,标签为 `FriPackInject`。你可以使用 adb 查看它们: ``` adb logcat FriPackInject:D *:S ``` 在 Windows 上,日志会同时写入 `stdout` 和 Windows Debug Log。要查看它们,你可以: - 将调试器附加到目标应用程序 - 在你的 Frida 脚本中使用 `AllocConsole` 和 `freopen` - 在控制台中启动目标应用程序 - 使用 [DebugView](https://learn.microsoft.com/en-us/sysinternals/downloads/debugview) 监视全局系统日志 在其他平台上,日志会直接输出到 `stdout`。 ### ReferenceError: 'Java' is not defined 从 Frida 17.0.0 开始,bridges 不再与 Frida 的 GumJS runtime 捆绑在一起。这意味着用户现在必须显式引入他们想要使用的 bridges。 你必须安装 bridge 并在打包前通过 `frida-compile` 构建你的脚本。查看 https://frida.re/docs/bridges/ 了解更多详情。 ## 致谢 - [Frida](https://github.com/frida/frida) - [Florida](https://github.com/Ylarod/Florida) - [xmake](https://xmake.io/)
标签:Android安全, API接口, DLL注入, Docker支持, Frida, Gadget, iOS安全, LD_PRELOAD, Linux安全, Rust, XML 请求, Xposed模块, 二进制分析, 云安全运维, 云资产清单, 免Root, 动态二进制插桩, 可执行文件, 可视化界面, 安全开发, 打包工具, 流量审计, 灰色软件工具, 目录枚举, 移动安全, 网络安全, 网络流量审计, 脚本封装, 逆向工程, 通知系统, 隐私保护