ZAFrida UI:Frida的PyCharm/IDEA UI 插件

0 阅读6分钟

适用读者:日常用 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 开源地址

home.png

new_project.png

settings.png

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

run_frida_js_menu.png


痛点 2:常用 Hook 片段靠复制粘贴

ZAFrida UI 在编辑器右键里内置 ZAFrida Frida Snippets(示例):

  • Java.perform 包裹块
  • hook Java method 模板
  • 打印 Java 栈
  • Interceptor.attach
  • backtrace(ACCURATE / FUZZY)
  • enumerate modules等

zafrida_code_menu.png


痛点 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 再建了一层“工作上下文管理”。

project_viewer.png


痛点 4:模板开关难维护——删了找不回,不删又容易忘记启用状态

ZAFrida UI 的“核心创新点”在模板系统:复选框式模板管理

  • 勾选:自动把模板代码注入到主脚本中(插入一个带 marker 的 block)。
  • 取消勾选:不删除,而是自动用块注释 /* ... */ 包起来。
  • 好处很实际:
    1. 可回滚、可审计;
    2. 多模板组合时不容易“删错”;
    3. 团队协作时“为什么没生效”一眼看出来;
    4. 适合长期维护脚本。

内置模板覆盖 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 插件安装

两种方式:

  1. IDE 插件市场搜:ZAFrida
  2. 或者下载本地包后从磁盘安装(适合内网/自编译)
GitHub: https://github.com/yilongmd/zafrida-ui

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 的日常逆向工作从“终端参数驱动”变成“脚本/项目驱动”。

  • 你面对的是脚本文件:右键就跑
  • 你维护的是项目上下文:切换就恢复
  • 你组合的是模板积木:勾选就生效,取消就注释