Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Cursor Tap (Flutter)

基于 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 的增量帧解析还不够完善

致谢

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages