Frida动态检测工具集

为Frida 17提供的TypeScript MCP服务,包含62种工具和15种资源,支持进程附加、脚本执行、本地和Java方法钩取、SSL固定和根检测绕过、内存读写、Java堆检查等功能。

  • by yfe404
  • TypeScript
  • 本地部署
  • 25 星标
  • 更新于
在 GitHub 查看 yfe404/frida-mcp

使用说明

弗里达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 → 简历)击败了Android ActivityManagerService 10秒超时。
  • 配方库: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

许可证

麻省理工学院