基于 burpheart/cursor-tap(Go + Next.js)重写的 Flutter 原生 macOS 桌面版,用于拦截和分析 Cursor IDE 的 gRPC 通信流量。
Cursor IDE ──HTTPS──▶ HTTP CONNECT Proxy (:1080)
│
detachSocket()
│
本地 SecureServerSocket (伪造证书)
│ TLS 解密
┌─────┴─────┐
│ HTTP 解析器 │ ← 解析请求/响应/gRPC帧/SSE
└─────┬─────┘
│ TLS 加密
SecureSocket.connect
│
api2.cursor.sh (真实服务器)
核心技术点:本地回环 TLS 终止 — 通过 HttpServer 处理 CONNECT 请求,detachSocket() 获取原始 socket,透传 TLS 字节到本地 SecureServerSocket,得到全新的 SecureSocket 用于解密,绕过了 Dart 单订阅 stream 的限制。
lib/
├── main.dart # 入口,初始化 CA/RecordStore/ProxyService,Provider 注入
├── models/
│ ├── record.dart # TrafficRecord 模型 (request/response/grpc/sse/body/error)
│ └── session.dart # ProxySession 会话聚合
├── services/
│ ├── ca_service.dart # CA 证书管理 (openssl 生成 ECDSA P-256,per-host 签发,Completer 并发锁)
│ ├── proxy_service.dart # MITM 代理核心 (HttpServer CONNECT + SOCKS5 状态机 + 本地回环 TLS)
│ ├── http_parser.dart # HTTP/1.1 流解析 (单次 header 解析 + 流式 body,防二进制误匹配)
│ ├── grpc_parser.dart # gRPC/Connect 协议帧解析 (5字节帧头,gzip 解压,unary/streaming)
│ ├── protobuf_decoder.dart # 通用 protobuf wire format 解码 (无需 .proto 文件)
│ └── record_store.dart # 记录存储 + JSONL 持久化 + 服务/方法聚合
├── ui/
│ ├── home_page.dart # 主界面:深色标题栏 + 4面板可拖拽布局
│ ├── filter_panel.dart # Services 侧栏:可折叠服务树,点击过滤,计数 badge
│ ├── session_list.dart # RPC Calls 列表:方法名/服务/帧数/字节/时间/gRPC预览
│ ├── record_list.dart # Records 列表:搜索过滤,↑↓键切换选中,类型/方向 badge
│ ├── detail_panel.dart # 详情面板:badges + gRPC信息 + 请求头表格 + 复制按钮
│ ├── json_viewer.dart # VS Code 暗色主题 JSON 语法高亮
│ └── settings_dialog.dart # 设置:CA 证书安装/导出/重生成,Cursor 配置说明
macos/
├── Runner/
│ ├── MainFlutterWindow.swift # 启动最大化 + 空标题 + 不可调整大小
│ ├── DebugProfile.entitlements # 关闭沙盒 + 网络权限
│ └── Release.entitlements # 同上
start.sh # 带环境变量启动 Cursor
test_proxy.sh # curl 测试代理
| 功能 | 状态 |
|---|---|
| HTTP CONNECT 代理 (:1080) | ✅ |
| SOCKS5 代理 (:1081) | ✅ |
| TLS MITM (ECDSA P-256 动态证书) | ✅ |
| CA 证书一键安装到系统钥匙串 | ✅ |
| HTTP/1.1 请求/响应解析 | ✅ |
| gRPC/Connect Protocol 帧解析 | ✅ |
| gRPC-over-SSE 识别 | ✅ |
| Protobuf 通用二进制解码 | ✅ |
| 4面板拖拽布局 (Services / RPC Calls / Records / Detail) | ✅ |
| 服务树过滤 + 方法计数 | ✅ |
| 记录搜索 + ↑↓键盘导航 | ✅ |
| JSON 语法高亮 (VS Code 暗色主题) | ✅ |
| JSONL 日志持久化 (~/.cursor-tap/data/) | ✅ |
| 中文界面 | ✅ |
# 1. 启动应用
flutter run -d macos
# 2. 在应用界面点击「启动」按钮
# 3. 启动 Cursor(带环境变量)
./start.sh
# 或手动:
NODE_EXTRA_CA_CERTS=$HOME/.cursor-tap/ca/ca.crt \
HTTP_PROXY=http://127.0.0.1:1080 \
HTTPS_PROXY=http://127.0.0.1:1080 \
/Applications/Cursor.app/Contents/MacOS/Cursor &- 无上游代理支持 — Go 版本的
--upstream参数未实现,有其他代理时需手动配置 - Protobuf 解码为通用字段 — 显示为
field_1/field_2,未集成 Cursor 的 .proto 定义做类型化反序列化 - 流式响应增量解析 — 长连接 SSE/gRPC streaming 的增量帧解析还不够完善
- 原项目:burpheart/cursor-tap
- 逆向笔记:Cursor 逆向笔记 1