frida-dsh-plugin:将 Frida 作为受策略约束的工具接入 DeepSeek Harness

前言

给智能体接动态分析能力时,常见做法是给它一个 shell,让它自己调用 frida 命令或临时写脚本。这条路的麻烦在于:Session、脚本句柄散落在多次命令之间,很难保证正确释放;注入类操作也没有策略边界,目标范围和审批时机只能靠提示词约束。

DeepSeek Harness(DSH)的思路是「一切皆插件」,能力以结构化工具加策略配置的方式交给模型。frida-dsh-plugin 按这个思路把 Frida 拆成 9 个工具:默认档位只读,注入操作走 Harness 审批链,会话结束时自动清理资源。下面介绍它的功能、安装和典型用法。

这是什么

frida-dsh-plugin 由 mang0cola 维护,MIT 许可证。一句话定位:将 Frida 作为一组受策略约束的工具接入 DeepSeek Harness。安装后,大模型可以发现已配置设备、分页枚举进程或应用、附加(Attach)或拉起(Spawn)目标、加载 Frida Agent、调用 RPC、读取异步消息,并在会话结束时自动释放资源。

整体链路是:模型调用 9 个工具,请求经过能力档位与审批策略,由 FridaRuntime 执行,底层使用官方 frida-node 连接 local / USB / remote 设备。几个关键约束:

  • 模型只看到部署方配置的设备别名,不能自行提交远程地址或认证信息。
  • Session 和 Script 使用不透明句柄,绑定到创建它们的 Agent,其他 Agent 无法复用。
  • 默认 discovery 档只允许发现设备、进程和应用,不允许注入。
  • 注入操作默认进入 Harness 审批链;无审批服务时,ask 会失败关闭。
  • Agent 销毁、插件热替换或 Harness 退出时,会清理 Script、Session 和未恢复的暂停进程。

核心功能

九个模型工具

工具 用途
frida_list_devices 返回配置过的设备别名及可用状态
frida_enumerate 分页枚举进程或应用
frida_attach 按 PID 或精确进程名附加,返回 sessionId
frida_spawn 暂停启动并立即附加,返回 sessionId
frida_load_script 加载内置模板或原始 JavaScript,返回 scriptId
frida_call_rpc 调用脚本的 rpc.exports 方法
frida_read_events 用游标读取 send()、错误和 console 日志
frida_process_control 恢复插件 Spawn 的暂停进程,或在允许时终止它
frida_close 卸载 Script 或关闭 Session

frida_enumerate 和内置枚举模板都做分页,limit 默认 100、最大 500。事件使用游标式环形缓冲;若缓冲区发生覆盖,droppedCount 会明确报告丢失数量。

内置模板

模板 templateArgs RPC
enumerate-modules run(offset?, limit?)
enumerate-exports { "moduleName": "..." } run(offset?, limit?)
java-classes run(offset?, limit?)
objc-classes run(offset?, limit?)
hook-native-export { "moduleName": "...", "exportName": "..." } 通过事件返回 enter/leave

四个枚举模板返回 { items, total, offset, limit, truncated },模型可以直接读取总数并按游标分页,不需要借助 Shell 处理大型 RPC 结果。

能力档位与审批

档位 发现设备/目标 Attach 内置模板 原始 JS Spawn/Resume/Kill
discovery
templates
full 是;Kill 还需 allowKill: true

approvalMode 有三档:ask 让 Attach、加载脚本、RPC、Spawn 和进程控制进入 Harness 审批流程;allow 在策略层直接放行档位内操作,适合隔离且已有外部授权控制的自动化环境;deny 保留发现工具但拒绝所有注入和控制操作。Kill 是单独开关,必须显式配置 allowKill: true

安装与启用

环境要求

  • Node.js 20 或更高版本。
  • DeepSeek Harness 0.1.0-rc.6 兼容版本。
  • 与目标端兼容的 Frida 环境;Android USB 场景通常需要目标设备上运行版本匹配的 frida-server

构建与安装

在仓库中依次执行:安装依赖、构建、跑测试、把插件加入 demo profile、导出配置确认、启动。

npm install
npm run build
npm test
dsh plugin --profile demo add .
dsh --profile demo --dump-config
dsh --profile demo

组合包安装后会插入三行:frida-runtimefrida-toolsfrida-policy。默认配置是只读的 discovery 档。

通过 cordis.patch.yml 开启注入

要开启注入能力,需要在目标 profile 的 cordis.patch.yml 中以 id 覆盖方式配置 frida-runtime。Harness 的后置 patch 会按 id 覆盖前面的行,并整体替换该行的 config。下面是「只允许审计过的模板」这一档的完整配置,仓库 examples 目录也提供可复制的版本:

- id: frida-runtime
  config:
    backend: node
    pythonExecutable: python3
    capabilityProfile: templates
    approvalMode: ask
    devices:
      - alias: usb
        kind: usb
        timeoutMs: 10000
    defaultDevice: usb
    targetAllowlist:
      - 'com.example.*'
      - 'Example App'
    allowKill: false
    operationTimeoutMs: 30000
    maxSessions: 4
    maxScriptsPerSession: 4
    maxScriptBytes: 262144
    eventBufferSize: 1000
    maxEventDataBytes: 65536

targetAllowlist 使用区分大小写的 * 通配符,匹配运行进程名或 Spawn 的程序/应用标识;空数组表示不额外限制目标,生产环境开启 templatesfull 时建议显式列出。设备项支持 aliaskindidaddresstokenEnvcertificateoriginkeepaliveIntervaltimeoutMs 等字段,kind 可选 localusbremoteid 四种。

远程设备与令牌

remote 设备在 devices 里写法如下(配合 capabilityProfile: full 使用,完整示例见仓库 examples):

devices:
  - alias: lab-android
    kind: remote
    address: '10.20.0.15:27042'
    tokenEnv: FRIDA_LAB_TOKEN
    keepaliveInterval: 30

远程认证令牌只从 tokenEnv 指定的宿主进程环境变量读取,不写入 Harness 配置或模型上下文。

可选 Python 后端

默认后端是当前 Node 进程中的 frida-node。如果设备端必须保留旧版 Frida,而旧版 frida-node 不支持宿主 Node 版本,可以把 backend 设为 python,并将 pythonExecutable 指向版本匹配的 Python 虚拟环境(该环境需已安装兼容的 frida 包)。插件会通过一个持久、可取消的 JSON-lines worker 复用它,模型工具和安全策略保持不变;pythonExecutable 是部署方信任边界内的本机路径,不会暴露为模型参数。

典型用法

Attach 流程

附加一个已运行目标的完整步骤:

  1. frida_list_devices
  2. frida_enumerate
  3. frida_attach
  4. frida_load_script
  5. frida_call_rpc 和/或 frida_read_events
  6. frida_close

Spawn 流程

Spawn 流程为 frida_spawnfrida_load_scriptfrida_process_control(action: resume)。如果在 Resume 前关闭 Session 或 Agent 被销毁,插件会尽力终止它创建的暂停进程,避免设备上遗留挂起目标。

模板调用示例

以枚举目标模块为例,先加载模板:

{"sessionId":"frida-session-1","template":"enumerate-modules"}

再调用模板暴露的 run 方法:

{"scriptId":"frida-script-1","exportName":"run","args":[0,3]}

frida_load_script 返回的 nextCursor 是模板加载完成后的游标。读取后续 hook 消息时把它传给 frida_read_events,下一次读取继续使用新返回的 nextCursor

设备端冒烟测试

对已经运行的授权测试目标,可以执行端到端冒烟测试:

FRIDA_PYTHON=/absolute/path/to/frida-16/bin/python \
FRIDA_TARGET=com.example.app \
npm run test:device

该命令只 Attach 已运行目标,不负责启动或终止应用;流程覆盖设备/应用/进程枚举、原始脚本 RPC、事件回读、内置模块模板分页和 Session 清理。

适用场景与注意事项

适合的场景:在授权测试设备上让 DSH 智能体执行动态分析,同时需要部署方在策略层控制目标范围、注入能力和审批时机。

使用前请注意:

  • 只应用于你拥有或已明确获准测试的设备和程序。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证(MIT)。
  • 插件不替用户绕过设备授权、代码签名、越狱、root 或系统调试限制。先确认宿主机能正常使用 Frida 连接目标,再让 Harness 接管调用。
  • 句柄和事件缓冲只存在于当前 Harness 进程,不跨重启恢复。
  • 原始 Agent 只接受 JavaScript,插件不负责 TypeScript 编译或 Frida Compiler 工程构建,也不模拟交互式 frida REPL。
  • 没有内置 Stalker、内存任意读写等高风险模板;full 档中可通过经过审批的原始脚本显式实现。

小结

frida-dsh-plugin 把一次动态分析会话拆成可枚举、可审批、可释放的结构化步骤:默认只读,注入走审批链,句柄绑定 Agent 并在退出时自动清理。如果你需要在 DSH 上以受控方式使用 Frida,建议从仓库 examples 目录挑一份与场景匹配的配置开始,先跑通 discovery 档,再按需放开能力。

  • 插件目录页(社区维护):https://www.skillhub.cn/plugins/mang0cola/frida_dsh_plugin
  • GitHub 仓库:https://github.com/mang0cola/frida_dsh_plugin
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜