前言¶
給智能體接動態分析能力時,常見做法是給它一個 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-runtime、frida-tools 和 frida-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 的程序/應用標識;空數組表示不額外限制目標,生產環境開啓 templates 或 full 時建議顯式列出。設備項支持 alias、kind、id、address、tokenEnv、certificate、origin、keepaliveInterval、timeoutMs 等字段,kind 可選 local、usb、remote、id 四種。
遠程設備與令牌¶
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 流程¶
附加一個已運行目標的完整步驟:
frida_list_devicesfrida_enumeratefrida_attachfrida_load_scriptfrida_call_rpc和/或frida_read_eventsfrida_close
Spawn 流程¶
Spawn 流程爲 frida_spawn → frida_load_script → frida_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 工程構建,也不模擬交互式
fridaREPL。 - 沒有內置 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