使用说明
弗里达mcp
用于Frida 17动态插装的TypeScript MCP服务器。提供约62种工具和15种资源,用于连接进程、执行脚本、挂钩本机和Java方法、绕过SSL钉扎和根检测、读取/写入内存、检查Java堆、将大型捕获导出到磁盘、提取APK并使用jadx反编译,以及搜索Frida 17 API文档-所有这些都通过模型上下文协议。
1.1.0的新增功能
- 独自创立:一个电话
ensure_frida_server(拱形检测+下载+推送+启动)和spawn_and_instrument(原子产卵→ 附加→ load → 简历)击败了AndroidActivityManagerService10秒超时。 - 配方库:OkHttp、Java方法、本机导出、类跟踪的参数化挂钩模板,
Mac.doFinalSSL锁定旁路和根检测旁路。食谱异步安装,因此script.load()返回时间<100ms;订阅recipe.installed通过subscribe_messages. - 源侧滤波器:每个食谱都接受一个
where在代理中评估谓词(主机端针对循环的块列表/eval/Function+50ms代理监视器),加上全局set_session_filter. - 静力分析桥:
apk_pull,apk_manifest,decompile_class,decompile_method,list_native_exports,process_inventory,source_jump关闭捕获的运行时堆栈帧和反编译的堆栈帧之间的循环.java. - 反检测助手:
check_frida_detection列举RootBeer/SafetyNet/Play Integrity/Xposed;bypass_root_detection是选择加入。 - 真正的修复 现有工具:
list_classes和dump_class现在返回Frida 17.9.x上的数据(对象回调Java.enumerateLoadedClasses+感知Promise的执行包装器);trace_class_methods不再无限递归(闭包捕获的重载模式);会话分离现在卸载脚本;subscribe_messages长时间的民意调查不会泄露听众。
看 更改日志.md 查看完整列表。
设置
快速安装(克劳德代码)
claude mcp add frida-mcp -- npx -y frida-mcp@latest
通过stdio将frida mcp安装为mcp服务器。每次重新启动Claude Code时自动更新。
范围:
# Per-user (available in all projects)
claude mcp add --scope user frida-mcp -- npx -y frida-mcp@latest
# Per-project (shared via .mcp.json, commit to repo)
claude mcp add --scope project frida-mcp -- npx -y frida-mcp@latest
手册 .mcp.json 配置
{
"mcpServers": {
"frida": {
"command": "npx",
"args": ["-y", "frida-mcp@latest"]
}
}
}
来源(开发)
npm install
npm run fetch-docs # build docs index (optional but recommended)
npm run build
npm start
然后点 .mcp.json 在当地建设:
{
"mcpServers": {
"frida": {
"command": "node",
"args": ["/path/to/frida-mcp/dist/index.js"]
}
}
}
重新启动Claude Code以获取新服务器。
先决条件
- Node.js 20+
- 弗里达17(
npm install frida@17) - 用于设备上操作的USB连接设备(Android手机)
frida-server在目标设备上运行
工具参考
设备工具(4)
| 工具 | 描述 | 关键参数 |
|---|---|---|
enumerate_devices |
列出所有Frida可见设备(本地、USB、远程) | -- |
get_device |
按ID获取特定设备 | device_id |
get_usb_device |
获取USB连接设备 | -- |
get_local_device |
获取本地(主机)设备 | -- |
工艺工具(6)
| 工具 | 描述 | 关键参数 |
|---|---|---|
enumerate_processes |
列出所有正在运行的进程 | device_id? |
get_process_by_name |
按名称查找进程(不区分大小写的子字符串) | name, device_id? |
attach_to_process |
轻质连接检查 | pid, device_id? |
spawn_process |
生成新流程 | program, args?, device_id? |
resume_process |
恢复已生成/已暂停的进程 | pid, device_id? |
kill_process |
终止一个进程 | pid, device_id? |
会话工具(5)
| 工具 | 描述 | 关键参数 |
|---|---|---|
create_interactive_session |
附加并创建托管会话(生成回退是选择加入) | process_id, device_id?, spawn_fallback?, app_identifier?, auto_resume_spawned? |
execute_in_session |
在会话中执行JS(临时或持久) | session_id, javascript_code, keep_alive? |
get_session_messages |
使用分页检索排队的消息(预览;大字段的blob) | session_id, limit?, offset?, clear_mode? |
read_session_message_blob |
在有界块中读取卸载的消息blob(有效载荷/数据) | session_id, blob_id, offset?, limit?, encoding? |
get_archived_session_messages |
列出已从内存中清除/删除的存档邮件 | session_id, limit?, offset? |
脚本管理工具(4)
| 工具 | 描述 | 关键参数 |
|---|---|---|
load_script |
从磁盘加载JS文件,自动检测RPC导出 | session_id, file_path, script_id? |
list_scripts |
列出加载的脚本及其元数据 | session_id |
unload_script |
卸载脚本 | session_id, script_id |
call_rpc_export |
调用RPC导出方法 | session_id, script_id, method, args? |
初学者: load_script 对比 call_rpc_export
如果你是Frida的新手,请从两个层面考虑这一点:
load_script:将您的代理代码放入目标应用程序中并保持其运行。call_rpc_export:从已加载的代理中调用一个函数。
简单规则:
- 你通常会打电话
load_script一次。 - 你可以打电话
call_rpc_export在那之后的许多次。 - 完成后,致电
unload_script. - 使用
export_capture_bundle相反,当结果大小未知或您需要一个主机端文件以供以后分析时。
最小流量:
1) create_interactive_session(...) -> session_id
2) load_script(session_id, "agent.js") -> script_id
3) call_rpc_export(session_id, script_id, "methodName", [...args]) -> result
4) unload_script(session_id, script_id)
导出工具(1)
| 工具 | 描述 | 关键参数 |
|---|---|---|
export_capture_bundle |
将RPC输出和捕获的消息导出到磁盘JSONL包(令牌安全摘要响应) | session_id, rpc?, include_messages?, include_archived_messages?, clear_mode?, output_path?, format?, response_detail? |
export_capture_bundle 是大输出或无界输出的首选路径。默认情况下,它返回一个slim path_only 响应并将完整捕获写入主机上的磁盘。
记忆工具(6)
| 工具 | 描述 | 关键参数 |
|---|---|---|
list_modules |
列出加载的本机模块 | session_id |
find_module |
按名称查找模块 | session_id, name |
list_exports |
列出从模块导出的符号 | session_id, module_name |
read_memory |
地址处的十六进制转储(支持 module+0xoffset) |
session_id, address, size? |
write_memory |
将字节写入地址(自动内存保护) | session_id, address, hex_bytes |
search_memory |
在可读内存中搜索十六进制/字符串模式 | session_id, pattern, pattern_type?, max_results? |
Java工具(6)
| 工具 | 描述 | 关键参数 |
|---|---|---|
list_classes |
枚举已加载的Java类(最多500个) | session_id, filter? |
find_instances |
通过以下方式查找实时堆实例 Java.choose() |
session_id, class_name, max_instances? |
list_methods |
列出带有类型/修饰符的Java类的所有方法 | session_id, class_name |
dump_class |
全类自省(方法、字段、构造函数、接口、超类) | session_id, class_name |
run_java |
在内部执行任意代码 Java.perform() |
session_id, code |
android_hook_method |
钩子一个Java方法(所有重载),记录args/retval/回溯 | session_id, class_name, method_name, log_args?, log_retval?, log_backtrace? |
原生挂钩工具(2)
| 工具 | 描述 | 关键参数 |
|---|---|---|
hook_function |
安装持久 Interceptor.attach 钩子 |
session_id, address, log_args?, log_retval?, num_args? |
get_backtrace |
单次回溯捕捉(自行分离) | session_id, address, style? |
安卓工具(6)
| 工具 | 描述 | 关键参数 |
|---|---|---|
android_ssl_pinning_disable |
绕过SSL固定(TrustManager、SSLContext、OkHttp、TrustManagerImpl) | session_id, script_id? |
android_get_current_activity |
通过ActivityThread反射获取前台活动 | session_id |
list_apps |
列出已安装的应用程序(标识符、名称、PID) | device_id? |
android_check_frida_server |
检查Android frida服务器运行状况(运行实例、版本不匹配警告) | device_id?, adb_serial? |
file_ls |
列出目标设备上的目录内容(Java文件API) | session_id, path |
file_read |
从目标设备读取文本文件 | session_id, path, max_size? |
文档工具(1)
| 工具 | 描述 | 关键参数 |
|---|---|---|
search_frida_docs |
全文搜索Frida 17 API文档(带页码的大小片段) | query, limit?, offset?, snippet_chars? |
引导工具(2)
| 工具 | 描述 | 关键参数 |
|---|---|---|
ensure_frida_server |
检测设备拱形,下载(选择加入)匹配 frida-server 从GitHub发布,推送到设备,杀死旧实例,启动分离,验证可达性。替代6命令手动安装。 |
device_id?, target_version?, binary_path?, allow_network? (默认为false), force_redownload?, verify_timeout_ms? |
spawn_and_instrument |
原子 device.spawn → device.attach → 可选的 script.load → device.resume 在单个MCP呼叫内,AMS的~10s“无法连接”窗口无法在步骤之间触发。 |
package, device_id?, script_path?, argv?, resume? |
配方工具(8)
经过审查和参数化的钩子模板,因此您不必为每个常见任务编写100多行Frida JS。所有食谱都通过以下方式推迟了钩子的安装 Script.nextTick 所以 script.load() 立即返回;长期民意调查 subscribe_messages 在 recipe.installed 事件等待钩子上线。所有食谱都接受 where 断言盖茨 send() 在代理。
| 工具 | 描述 | 关键参数 |
|---|---|---|
hook_okhttp_requests |
Snoop每一个完成 okhttp3.Request$Builder.build 跨所有OkHttp客户端。 |
session_id, url_includes?, include_stack?, include_body?, max_body_bytes?, where? |
hook_java_method_recipe |
将Java方法的所有重载与源端挂钩 where, max_emits 上限和每字符串截断。 |
session_id, class_name, method_name, log_args?, log_retval?, log_backtrace?, max_emits?, truncate_at?, where? |
hook_native_export |
Interceptor.attach 通过以下方式导出单个符号 Process.getModuleByName().getExportByName(). |
session_id, module, symbol, num_args?, decode_ret_as_cstring?, where? |
trace_class_methods |
frida-trace -j 'pkg.*!*' 等效:枚举匹配的类,安装轻量级调用跟踪器。跳过天然/合成/ $$Lambda 以避免代理崩溃。 |
session_id, class_filter, method_filter?, max_methods?, where? |
dump_mac_doFinal |
钩住两个过载 javax.crypto.Mac.doFinal通用加密观察器——在几秒钟内破解HMAC算法。 |
session_id, include_input?, where? |
bypass_ssl_pinning |
TrustAllCerts+空主机名验证器+OkHttp3 CertificatePinner +密码 TrustManagerImpl. |
session_id |
search_recipes |
自由文本搜索本地配方注册表。 | query |
describe_recipe |
按slug返回配方的参数模式+发出的事件类型。 | slug |
另外还有两个助手通过同一台机器连接:
| 工具 | 描述 | 关键参数 |
|---|---|---|
set_session_filter |
安装/清除一个全局JS谓词,该谓词对每个配方进行门控 send() 在按照食谱之前 where 跑。 |
session_id, predicate_js |
subscribe_messages |
新会话消息的长轮询。一旦存在N条匹配消息或之后立即解决 timeout_ms.可选 where 是存储消息上的JS谓词; consume=true 从队列中删除返回的消息。 |
session_id, where?, min_count?, timeout_ms?, consume?, since_seq? |
静态分析工具(7)
Frida运行时视图和APK静态源之间的桥梁。壳牌出来 adb, aapt2, jadx, nm / readelf.
| 工具 | 描述 | 关键参数 |
|---|---|---|
apk_pull |
pm path + adb pull 已安装的APK ~/.cache/frida-mcp/apks/。已缓存。 |
package, device_id?, force? |
apk_manifest |
aapt2 dump xmltree → JSON(包、版本、权限、导出组件)。 |
apk_path |
decompile_class |
jadx全类反编译(按APK指纹缓存)。内部类通过外部文件。 | apk_path, fqcn |
decompile_method |
从反编译的类中删除一个方法。跳绳 @kotlin.Metadata 阻断;回落到 full_class 如果名称是内联的。 |
apk_path, fqcn, method |
list_native_exports |
nm -D --demangle (或 readelf -sDW)解析器 .so的导出符号。 |
so_path, tool?, filter? |
process_inventory |
一种方法:加载本机模块+用户命名空间Java类+检测到的网络堆栈+反检测库命中。 | session_id |
source_jump |
解析Java堆栈跟踪并返回 ±context_lines 反编译源代码中每个用户帧周围的代码片段。回落到 class <Name> 找不到方法名时的声明。 |
stack_trace, apk_path, context_lines?, include_framework_frames?, max_frames? |
反检测工具(2)
| 工具 | 描述 | 关键参数 |
|---|---|---|
check_frida_detection |
根据已知的检测库模式枚举加载的类(RootBeer、SafetyNet、Play Integrity、Xposed和关键字 Frida/Magisk/Substrate).建议匹配旁路配方蛞蝓。 |
session_id |
bypass_root_detection |
选择加入:补丁 File.exists 对于su路径, Runtime.exec("su"), Build.TAGS 测试密钥。导数 @dzonerzy/fridantiroot +异议的根旁路代理。 |
session_id, where? |
资源
| URI | 描述 |
|---|---|
frida://version |
已安装Frida版本 |
frida://processes |
USB设备进程列表 |
frida://devices |
所有可用设备 |
frida://docs/index |
文档部分列表 |
frida://docs/{section_id} |
个人文档部分(11个部分) |
建筑
src/
├── index.ts # Entry point — McpServer + StdioServerTransport
├── state.ts # SessionManager singleton (sessions, scripts, messages)
├── utils.ts # resolveDevice, resolveAddressJS, wrapForExecution,
│ # executeTransientScript, truncateResult
├── resources.ts # MCP resources (runtime + docs)
├── docs/
│ ├── index.ts # DocStore — search/scoring over frida-api.json
│ └── frida-api.json # Pre-parsed Frida 17 API documentation
├── injected/
│ ├── helpers.ts # Frida 17-safe JS generators (modules, memory read/write/search)
│ ├── java-helpers.ts # Java introspection, hooking, SSL bypass, file ops JS generators
│ └── hook-templates.ts # Native hook JS generators
└── tools/
├── device.ts # Device enumeration (4 tools)
├── process.ts # Process management (6 tools)
├── session.ts # Session management (5 tools)
├── script-mgmt.ts # Script loading/RPC (4 tools)
├── export.ts # One-shot RPC + capture export (1 tool)
├── memory.ts # Module/memory operations (6 tools)
├── java.ts # Java introspection & hooking (6 tools)
├── native-hooks.ts # Native hooking (2 tools)
├── android.ts # Android pentesting & file ops (5 tools)
└── docs.ts # Doc search (1 tool)
关键模式
会话管理器 --所有会话、脚本和消息的统一状态。替换Python服务器的4个单独的全局字典。消息队列的上限为1000,以防止内存无限增长;清除/驱逐的消息作为轻量级摘要存档到磁盘,大型有效载荷/数据字段通过blob引用卸载到磁盘,以确保工具输出令牌的安全。
注入JS生成器 --生成兼容Frida 17的JavaScript的模板函数。规则: var (不是 const/let),没有箭头函数,实例方法打开 NativePointer (不是 Memory.readX), Process.getModuleByName (不是 Module.*).
基于Promise的执行 — executeTransientScript 使用基于Promise的消息收集,而不是 time.sleep()脚本发送 execution_receipt 消息和之后自动卸载。
输出截断 — truncateResult() 在MCP的令牌限制下,对24KB内的最大数组项进行二进制搜索。应用于 enumerate_processes, list_modules, list_exports, list_classes, get_session_messages,以及 read_session_message_blob.
使用示例
附加并执行代码
1. enumerate_processes → find target PID
2. create_interactive_session(pid) → get session_id
3. execute_in_session(session_id, "Process.arch") → "arm64"
加载脚本并调用RPC
1. create_interactive_session(pid) → session_id
2. load_script(session_id, "my_script.js") → detects rpc.exports: ["doStuff"]
3. call_rpc_export(session_id, script_id, "doStuff", [arg1, arg2]) → result
挂钩一个本机函数
1. create_interactive_session(pid) → session_id
2. hook_function(session_id, "libnative.so+0x1234", log_args=true, num_args=4) → hook_id
3. (trigger the function on device)
4. get_session_messages(session_id) → hook arg/retval logs
一步RPC+捕获导出到磁盘
1. create_interactive_session(pid) → session_id
2. load_script(session_id, "/path/hook.js") → script_id
3. export_capture_bundle(
session_id,
rpc={script_id, method:"getSignings"},
include_messages=true,
clear_mode="returned",
response_detail="path_only"
) → output_path + slim summaries
挂钩Java方法
1. create_interactive_session(pid) → session_id
2. list_classes(session_id, filter="com.example") → find target class
3. list_methods(session_id, "com.example.ApiClient") → find target method
4. android_hook_method(session_id, "com.example.ApiClient", "sendRequest") → hook_id
5. (trigger the method on device)
6. get_session_messages(session_id) → method args/retval logs
绕过SSL固定
1. create_interactive_session(pid) → session_id
2. android_ssl_pinning_disable(session_id) → script_id
3. get_session_messages(session_id) → list of bypassed targets
搜索和修补内存
1. create_interactive_session(pid) → session_id
2. search_memory(session_id, pattern="secret_key", pattern_type="string") → addresses
3. read_memory(session_id, "0x7f1234") → hex dump
4. write_memory(session_id, "0x7f1234", "00 00 00 00") → bytes written
浏览目标设备上的文件
1. create_interactive_session(pid) → session_id
2. file_ls(session_id, "/data/data/com.example.app") → directory listing
3. file_read(session_id, "/data/data/com.example.app/shared_prefs/config.xml") → file content
搜索Frida 17文档
1. search_frida_docs("Module.findExportByName") → migration guide ranked first
2. search_frida_docs("Interceptor.attach") → instrumentation section with examples
3. search_frida_docs("Java.perform", limit=3, offset=3) → next page of snippet results
弗里达17笔记
此服务器是为兼容Frida 17而构建的。与旧版Frida的主要区别:
- 不
Module.findExportByName()--使用Process.getModuleByName(name).findExportByName(sym)反而 - 不
Memory.readX()静态方法 --使用NativePointer实例方法:ptr(addr).readU32() - 不
enumerateXSync()方法 --使用Process.enumerateModules(),module.enumerateExports() var而不是const/let在注入脚本中——避免了Frida的V8运行时在某些情况下出现的问题- Java桥在Frida 17搬迁 --支持Java的工具编译脚本
frida-java-bridge并注射globalThis.Java在运行用户代码之前
这 search_frida_docs 当您查询不推荐使用的API名称时,该工具会自动增强迁移指南。
操作技能(推荐)
对于可靠的Frida MCP操作(Frida 17),请使用配套技能库: https://github.com/yfe404/frida-mcp-skills.
这 frida-mcp-workflow 技能强制执行严格的工作流程: Idea -> Scripting -> Execution -> Notes它还强制执行文档优先使用、基于文件的脚本在大型内联有效负载上的使用以及脚本生命周期卫生(跟踪/卸载脚本以避免在同一目标上重复挂钩)。
发展
# Build
npm run build
# Run all tests (unit + integration)
npm test
# Run only unit tests
npm run test:unit
# Run only integration tests
npm run test:integration
# Run device tests (requires USB device with frida-server)
npm run test:device
# Fetch/update Frida API docs
npm run fetch-docs
测试结构
test/
├── unit/ # 137 tests — pure logic, no device needed
│ ├── utils.test.ts
│ ├── injected-helpers.test.ts
│ ├── injected-java.test.ts
│ ├── injected-hooks.test.ts
│ ├── session-manager.test.ts
│ └── doc-store.test.ts
├── integration/ # 12 tests — MCP server via InMemoryTransport + stdio
│ ├── mcp-server.test.ts
│ └── stdio-smoke.test.ts
├── device/ # 5 tests — auto-skip when no USB device
│ └── device-smoke.test.ts
└── fixtures/
└── frida-api-fixture.json
许可证
麻省理工学院
