内容
zer-mcp
**MCP服务器封装 [Drozer](https://github.com/WithSecureLabs/drozer) 以支持LLM驱动的Android IPC安全测试。**
允许任何 [](https://modelcontextprotocol.io) 客户端 — Claude Codeaude Desktop、Cursor、LM Studio、自定义代理 — 自动驱动Drozer。LLM枚举已安装应用中导出的活动、服务、广播接收器和内容提供者,然后使用意图、广播和提供者查询来检测IPC漏洞。
专为移动安全-AI领域的空白而设计:虽然有针对 [Frida](https://github.com/dnakov/frida-mcp)、 [JADX](https://github.com/zinoder/jadx-ai-mcp) 和 [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF) 的可靠MCP包装,但Drozer — 规范的Android IPC工具 — 至今没有代理接口。
## 状态
Alpha。工作核心:连接生命周期、包/组件枚举、内容提供者查询、意图启动和最常用的扫描器模块。针对Drozer 3.1.x 控制台进行测试。
## 安装
```bash
pip install drozer-mcp
```
或从源代码安装:
```bash
git clone https://github.com/YOUR-USERNAME/drozer-mcp
cd drozer-mcp
pip install -e .
```
您还需要:
1. **有效的Drozer安装**(`pip install drozer` 加上Java运行时环境)。MCP服务器外壳程序调用 `drozer` 二进制文件。
2Drozer代理APK** 在根设备或模拟器上运行。从 [Drozer发布页面](https://github.com/WithSecureLabs/drozer/releases) 下载。
**ADB端口转发**:
```bash
adb forward tcp:31415 tcp:31415
```
## 配置您的MCP客户端
### Claude Desktop / Claude Code
添加到 `~/.config/claude/claude_desktop_config.json`(Linux)或macOS / Windows等效文件:
```json
{
"mcpServers": {
"drozer": {
"command": "drozer-mcp"
}
}
}
```
重启客户端。Drozer工具将以 `drozer__` 前缀显示。
### 环境变量
| 变量 | 目的 | 默认值 |
|---|---|---|
| `DROZER_BIN` | `drozer` 控制台二进制文件的路径 | `drozer`(PATH) |
| `DROZER_SERVER` | 覆盖代理主机:端口 | Drozer的默认设置 |
| `DROZER_LOG` | 日志级别:`DEBUG`/`INFO`/`WARNING`/`ERROR` | `INFO` |
## 工具
### 连接
| 工具 | 目的 |
|---|---|
| `drozer_connect` | 打开与代理的控制台会话 |
| `drozer_disconnect` | 关闭会话 |
第一个非连接工具调用隐含地连接。如果底层控制台断开(代理崩溃、ADB中断),下一个调用将透明地重新连接。
### 枚举
| 工具 | Drozer命令 | 返回值 |
|---|---|---|
| `list_packages` | `app.package.list` | 包名列表 |
| `package_attack_surface` | `app.package.attacksurface` | 按类型计数 + `debuggable` |
| `list_activities` | `app.activity.info` | 具有所需权限的组件 |
| `list_services` | `app.service.info` | 与活动相同的形状 |
| `list_receivers` | `app.broadcast.info` | 相同形状 |
| `list_providers` | `app.provider.info` | 相同形状 |
| `find_provider_uris` | `app.provider.finduri` | deduplicated `content://...` URI 列表 |
### 攻击
| 工具 | Drozer命令 | 目的 |
|---|---|---|
| `query_provider` | `app.provider.query` | 读取具有完整WHERE/投影/排序参数的提供者 |
| `read_provider` | `app.provider.read` | 读取文件支持的提供者(FileProvider路径遍历) |
| `start_activity` | `app.activity.start` | 使用组件/动作/数据/额外信息| `start_service` | `app.service.start` | 使用意图参数启动或绑定服务 |
| `send_broadcast` |.broadcast.send` | 发送广播意图 |
### 扫描器
| Drozer模块 | 查找 |
|---|---|---|
| `scan_provider_injection` | `scanner.provider.injection` | 内容提供者中的SQL注入 |
| `scan_provider_traversal` | `scanner.provider.traversal` | 文件提供者中的目录遍历 |
| `scan_activity_browsable` | `scanner.activity.browsable` | 深度链接/URL方案入口点 |
### Shell + 出口
| 工具 | 目的 |
|---|---|
| `shell_exec` | 通过 `shell.exec` 在设备上运行shell命令 |
| `drozer_run_raw` | 原样运行任意Drozer命令 — 对于尚未包装的模块 |
## 示例会话(Claude Code)
```
您任何已安装应用中的SQL注入。
Claude:[调用 list_packages,过滤器为 ""]
[为每个 package_attack_surface]
[为导出的提供者调用 scan_provider]
[为每个发现调用 query_provider,带有有效载荷]
在com.example.app的UserProvider中找到1个注入:
URI:content://com.example.app.provider/users
可注入参数:selection
证明:使用选择="1=1 UNION SELECT ..." 进行查询
47行,包括哈希凭证。
```
## 为什么使用长期控制台?zer的 `console connect一个JVM支持的,与代理通过TCP端口通信。冷启动大约需要1-2秒;一旦预热,命令往返时间小于1秒。每次工具调用都重新启动将使LLM驱动的工作流程变得非常缓慢,因此这个MCP服务器运行一个单独的 `pexpect`会话,并将每个工具调用分派到它作为REPL命令。
这带来了一个限制:会话 **不是线程安全的**。MCP运行时序列化每个服务器进程的工具调用,这在实践中是安全的。如果您想对多个设备进行并行扫描,请运行多个MCP服务器实例,并设置不同的 `DROZER_SERVER`。
## 路线图
- 更多扫描器:`scanner.misc.checkparcel`、`scanner.misc.native`、整个 `scanner.misc.*` 系列。
- `query_provider` 的结构化JSON输出模式(当前为原始文本)。
- Drozer模块API集成,以便自定义模块自动显示。
- iOS / Objective-C等效项(可能是一个单独的 `frida-ios-mcp` 而不是在这里凑合)。
## 许可证
Apache-2.0。