
一款无头、可脚本化、基于命令行的 MITM 代理,专为 Windows 系统上的网络流量拦截、分析与修改而设计。它的工作方式类似于业界标准的图形界面代理,但针对自动化环境、无头运行以及与开发工作流的集成进行了优化。
注意:这是一个使用 Node.js 实现的独立、零依赖工具。
PacketPirate 是一款系统级网络拦截工具。通过利用 Windows HTTP 代理设置,它可以捕获你机器上任何应用程序的流量——包括 Web 浏览器(Chrome、Edge)、CLI 工具(curl、git)以及桌面应用(Spotify、VS Code、Discord)。
全局系统拦截:捕获来自任何遵循系统代理的进程的 HTTP/HTTPS 流量。
进程感知:精确定位是哪个应用在产生流量。
动态规则引擎:可通过 JSON 配置,对匹配的流量执行特定操作(例如,令牌提取、请求日志记录)。
完整流量日志:能够导出完整的请求与响应体(HTML、JSON、二进制)以供分析。
无头架构:完全通过 CLI 运行,适用于后台服务和自动化测试流水线。
自定义证书管理:包含用于生成并信任自签名根 CA 以进行 HTTPS 解密的实用程序。
克隆仓库并初始化环境:
# 1. Generate local SSL certificates
npm run setup
# 2. Trust the generated Root CA
npm run trust
# Note: Requires administrative approval to add the certificate to the Trusted Root Store.
启动代理服务器:
npm start
这将启动标准 CLI 界面。
交互式菜单提供以下控制选项:
code.exe)。Authorization 头中的 Bearer 令牌。jsonl 日志文件中。拦截逻辑在 config/rules.json 中定义。该文件允许对流量处理进行持久化配置。
Schema(结构说明):
{
"rules": [
{
"name": "Description of rule",
"host": "hostname.match",
"urlPattern": "regex_pattern",
"action": "log | save_token",
"outputFile": "path/to/output.txt",
"tokenFilter": "regex_filter"
}
]
}
示例:
{
"rules": [
{
"name": "Test API",
"host": "jsonplaceholder.typicode.com",
"action": "save_token",
"outputFile": "test_tokens.txt"
}
]
}
该工具采用双服务器架构:
CONNECT 隧道请求,并执行主机过滤。EADDRINUSE 错误并递增端口号,直到找到空闲端口。SIGINT/SIGTERM 处理程序,确保退出时还原代理设置,避免网络连接问题。该工具依赖双证书模型进行 HTTPS 拦截:
npm run setup 创建自签名根 CA(PacketPirateRoot)。
New-SelfSignedCertificate 生成有效期为 5 年的密钥对。src/certs/server.pfx(PKCS#12 格式)。npm run trust 将此根 CA 注入 Windows 的 CurrentUser\Root 存储中。
CurrentUser 而非 LocalMachine,我们将信任范围限制在当前用户配置文件内,从而降低系统级风险。security.enterprise_roots.enabled 选项才会遵循 Windows 信任存储。npm run untrust 提供干净的清理拆除。
FriendlyName("PacketPirateRoot")定位证书,确保不会触碰其他用户证书。本项目是使用 Node.js 进行系统编程的一个实际示例。它超越了典型的 Web 服务器,在更底层与操作系统和网络协议栈进行交互。
participant App as Application (VS Code)
participant OS as Windows OS
participant Proxy as Proxy Server
participant MITM as MITM Server
participant Web as Internet
Note over App,Proxy: 1. Plain HTTP Tunneling
App->>Proxy: CONNECT google.com:443
Proxy-->>App: 200 Connection Established
Note over Proxy,MITM: 2. The "Hand-Off" Trick
Proxy->>MITM: Pipe socket data (raw encrypted bytes)
Note over App,MITM: 3. TLS Handshake and Decryption
MITM-->>App: ServerHello (signed by local root CA)
App->>MITM: Encrypted request (GET /)
Note over MITM: 4. Interception Logic
MITM->>MITM: Decrypt → Inspect headers → Log
Note over MITM,Web: 5. Upstream Forwarding
MITM->>Web: New HTTPS request (GET /)
Web-->>MITM: Response
MITM-->>App: Response

Node.js 自带的标准 http 模块很难在同一服务器实例上同时处理 CONNECT 方法(用于 HTTPS 隧道)和普通 HTTPS 流量。
CONNECT 请求,并充当一个哑 TCP 管道。netstat 技巧)我们如何知道哪个应用在发送流量?TCP 数据包本身并没有携带"进程 ID"标签。
netstat -ano 来查找端口 54321 对应的 PID。我们使用 Node.js Streams 来高效处理数据。我们不会等待完整的 10MB 响应下载完成后再显示它,而是对流进行"分叉":
PassThrough 流实现的,能够以极低的额外延迟进行实时监控。GNU GPL v3.0