-
-
[原创]ZAFrida UI:把 Frida 的“参数地狱/脚本散落/模板复制粘贴”收进 PyCharm/IDEA 的右键菜单里
-
发表于: 2小时前 79
-
适用读者:日常用 Frida 做 Android/iOS 逆向、渗透测试、协议分析、Hook 调试的人;习惯在 PyCharm/IntelliJ 里写 Python + JS 的人。
0x00 背景:Frida 好用,但“命令行工作流”不够工程化
Frida 本身没问题,问题通常出在我们的工作流:
- 参数经常拼错:
-U/-D/-H、-f/-p/-N/-F、包名/进程名/脚本路径、extra args……切一次目标就要重来一遍。 - 上下文切换成本高:IDE 写 JS → 终端执行 → 看日志 → 再回 IDE 改脚本;多个设备/多个 App/多个工程时更难受。
- 脚本管理混乱:PoC、长期维护脚本、不同 App 的 agent.js 混在一起,Android/iOS 也混。
- 模板靠复制粘贴:常用 Hook 片段(Java.perform、Interceptor.attach、SSL Pinning Bypass……)一遍遍拷;想临时禁用又怕删掉。
ZAFrida UI 的目标很明确:不替代 Frida,而是把 frida-tools 的能力用 UI/工程化方式包装起来,让“跑脚本”和“管理脚本”更像一个长期可维护项目。
0x01 一句话说明白:它到底干嘛的?
ZAFrida UI 是一个集成在 PyCharm/IntelliJ 的 Frida 图形化插件:你在 JS 编辑区右键就能 Run/Attach 当前脚本,并且会根据脚本所在路径自动切换到对应的 Frida 项目(设备/包名/连接方式/参数);同时提供右键 Snippets 和复选框式模板系统,把 Hook 脚本当“积木”拼。
0x02 效果先看图
开源地址:
zafrida-ui github 开源地址




0x03 解决的核心痛点
痛点 1:编辑器里写着 agent.js,但运行得去终端,且经常跑错设备/包名/工程
ZAFrida UI 的关键操作:编辑区右键 “Run Frida JS / Attach Frida JS”。
- Run Frida JS:以当前 JS 文件作为主脚本执行(默认 Spawn)。
- Attach Frida JS:把当前 JS 文件注入到已运行目标(Attach)。
- 运行前自动保存文件。
- 最关键:根据当前 JS 所在路径,自动定位/切换到脚本所属的 Frida Project
这一步的“爽点”在于:你不再从“终端参数”出发,而是从“脚本文件”出发。
PoC 时尤其明显:打开脚本 → 右键 Run → 看输出 → 改脚本。
快捷键(默认):
- Windows / Linux:
Ctrl + Alt + S - macOS:
⌘ + ⌥ + S

痛点 2:常用 Hook 片段靠复制粘贴
ZAFrida UI 在编辑器右键里内置 ZAFrida Frida Snippets(示例):
Java.perform包裹块- hook Java method 模板
- 打印 Java 栈
Interceptor.attach- backtrace(ACCURATE / FUZZY)
- enumerate modules等

痛点 3:一个 IDE 工程里多个目标 App,Android/iOS 脚本混着放,配置散落
ZAFrida UI 引入了轻量级“Frida 项目制”,核心是两类 XML:
- 工作区注册表(IDE 项目根目录):
zafrida-workspace.xml
记录当前 IDE 工程下有哪些 ZAFrida 子项目 + 上次选中的项目。 - 每个子项目配置(子项目目录内):
zafrida-project.xml
记录包名/脚本/设备/连接方式/extra args/上次目标等。
并且创建项目时自动区分目录:
- Android 项目默认放在:
android/<projectName>/ - iOS 项目默认放在:
ios/<projectName>/
你可以把它理解为:在一个 PyCharm/IDEA 工程里,专门为 Frida 再建了一层“工作上下文管理”。

痛点 4:模板开关难维护——删了找不回,不删又容易忘记启用状态
ZAFrida UI 的“核心创新点”在模板系统:复选框式模板管理。
- 勾选:自动把模板代码注入到主脚本中(插入一个带 marker 的 block)。
- 取消勾选:不删除,而是自动用块注释
/* ... */包起来。 - 好处很实际:
- 可回滚、可审计;
- 多模板组合时不容易“删错”;
- 团队协作时“为什么没生效”一眼看出来;
- 适合长期维护脚本。
内置模板覆盖 Android/iOS 常见场景(例如 SSL Pinning Bypass、Method Hook、Native Hook、FS 监控等)。
说明:具体模板效果与目标实现有关,仍需按场景调整;工具侧提供的是工程化的“装配/管理”。
0x04 安装与环境
4.1 环境要求
- PyCharm 或 JetBrains 系列 IDE(建议 2024.3+)
- 本地 Python3 + 已安装
frida-tools - 设备侧按你平时的 Frida 工作流准备:USB/Remote/Gadget 均可
4.2 插件安装
两种方式:
- IDE 插件市场搜:
ZAFrida - 或者下载本地包后从磁盘安装(适合内网/自编译)
1 | GitHub: ae1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6&6K9h3I4G2L8X3N6E0k6q4)9J5c8Y4A6S2k6Y4u0A6k6r3q4Q4x3X3c8#2K9b7`.`. |
4.3 Frida 可执行文件路径
进入:Settings -> Tools -> ZAFrida
如果插件没自动识别到 frida / frida-ps / frida-ls-devices,在这里手动配置即可。
0x05 快速上手(3 分钟跑起来)
1)在 Project View 右键:
New Frida Project- 选择平台 Android / iOS,输入项目名
2)进入 ZAFrida ToolWindow(右侧),选择:
- Device(USB / Remote / Gadget)
- Run Script(通常 agent.js)
- Target(包名/进程)
- 需要的话填 Extra args
3)点击:
- Run:Spawn 模式启动目标并注入
- Attach:附加到已运行进程注入
4)更快的方式(推荐):直接打开脚本文件,在编辑区右键:
- Run Frida JS / Attach Frida JS
0x06 四个核心功能的“专业拆解”
6.1 “右键 Run Frida JS”为什么能自动切项目?
它的逻辑不是玄学,本质是一个可预测的目录标记扫描:
- 每个 ZAFrida 项目目录下有
zafrida-project.xml - 当你在编辑器里对某个
xxx.js右键 Run:- 从该脚本所在目录向上回溯
- 在 IDE 根目录范围内寻找最近的
zafrida-project.xml - 找到即认为这个脚本属于该项目
- 自动激活该项目,并在 Run 面板里把当前脚本设为 Run Script,然后执行
这类设计对逆向工作非常关键:“脚本在哪里,就在哪个上下文里跑”,减少“跑错设备/跑错包/跑错参数”的低级事故。
6.2 Snippets 为什么不是“鸡肋功能”?
逆向时常见节奏是:试探 → 验证 → 改脚本 → 再试探。
这类节奏最怕被“样板代码”打断。
右键 Snippets 做到的是:
- 快速插入常用结构
- 支持撤销/重做(符合 IDE 编辑器一致性)
这不是“多几个模板”的问题,而是把“写 Hook 的体力活”从工作流里剥离。
6.3 项目制管理对“多目标”更重要
在真实工作里,你很少只搞一个 App。项目制让你做到:
- 每个 App 一套上下文:脚本、目标、连接方式、extra args、日志都能留在项目里
- Android/iOS 物理隔离目录,避免混淆
- 切项目即恢复状态,减少重复配置
团队协作也有价值:
把 android/<app>/ 或 ios/<app>/ 整个目录(git)交给同事, 可以同时维护
6.4 “取消勾选=注释而非删除”的意义
看起来是小细节,实际是工程化差异:
- 删除:短期爽,长期痛(找回困难、对比困难、误删概率高)
- 注释:可追溯、可复用、可对比、可组合
尤其当你维护“长期 hook 脚本库”时,模板的启用/禁用应该像开关,而不是“手工删改源代码”。
0x07 其它实用点
- 支持 USB / Remote / Gadget 多模式连接,不用手拼
-U/-H/... - Run/Attach 分离:启动期 Hook 与运行期注入逻辑可以拆开
- 控制台输出 + 项目内日志落盘(便于复盘/留证)
0x08 写在最后:这个项目最想解决什么?
一句话:让 Frida 的日常逆向工作从“终端参数驱动”变成“脚本/项目驱动”。
- 你面对的是脚本文件:右键就跑
- 你维护的是项目上下文:切换就恢复
- 你组合的是模板积木:勾选就生效,取消就注释