sniffy

command module
v0.0.0-...-a88849d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 11, 2026 License: Apache-2.0 Imports: 1 Imported by: 0

README

sniffy

跨平台抓包 / 代理工具,核心差异化是可脚本化的插件系统:任何人都能用 JavaScript 写插件,实时改请求/改响应、mock、断点。

架构(分层)

internal/core      抓包引擎:监听 / 协议处理 / TLS MITM / 运行插件管道,发事件总线
internal/flow      统一契约:Flow / Decision / 编解码(引擎↔脚本↔UI↔存储共用)
internal/pipeline  插件管道:按优先级编排、应用 Decision、断点管理
internal/plugin    两层插件:js(goja 脚本)+ native(Go 原生);plugin.json + 脚本
internal/service   唯一真相源:会话/统计/规则/录制/配置/证书/插件/断点
internal/api       headless 传输:HTTP REST + gorilla WebSocket 实时推送
internal/desktop   桌面传输:Wails v3 Service 绑定 + 事件桥(// +build desktop)
internal/app       装配:engine + service + pipeline + plugins
cmd/sniffy         headless 服务器入口
cmd/sniffy-desktop 桌面入口(Wails v3)
web                前端(React + Vite + TS + Tailwind)
capture/ ca/ pkg/process  抓包核心 / CA / 进程检测(沿用)

引擎只管抓包并广播事件;service 是唯一真相源;headless 与桌面两种 transport 都是 service 的薄壳,共享同一套逻辑。

运行

headless 服务器模式
go run ./cmd/sniffy            # 代理 :8080,管理 API+WS :8888
# 浏览器把 HTTP 代理设为 127.0.0.1:8080,前端开发: cd web && npm run dev
桌面模式(Wails v3)

需安装各平台 webview 依赖(Windows: WebView2,纯 Go 无需 CGO;macOS: 自带;Linux: libwebkit2gtk-4.1-dev)。

scripts/build.sh desktop      # 构建前端 + 编译桌面二进制(-tags desktop)
# 或开发:cd web && npm run build && go run -tags desktop .
数据目录

配置与日志均落盘在用户配置目录 <UserConfigDir>/sniffy/(Windows: %AppData%\sniffy,macOS: ~/Library/Application Support/sniffy,Linux: ~/.config/sniffy):

  • config.json / rules.json —— 应用配置(监听地址/端口、上游代理等,启动时读回)与重写规则;
  • certificates/ —— 根 CA 证书与私钥、导入的服务端证书;
  • logs/sniffy-<日期>.log —— 运行日志,按天滚动,保留 7 天;
  • plugins/ —— 用户插件。

headless 模式下命令行显式指定的 -addr/-port 优先于 config.json

构建

scripts/build.sh headless                       # 当前平台
scripts/build.sh headless linux/amd64 darwin/arm64 windows/amd64   # 交叉编译(纯 Go)
scripts/build.sh frontend                        # 仅前端
scripts/build.sh desktop                         # 桌面二进制
# 也可用 Taskfile:task build / task build:all / task desktop / task test

写一个插件

插件放在用户配置目录 <UserConfigDir>/sniffy/plugins/<id>/,含 plugin.json + 脚本:

// index.js — 可用钩子:onRequest / onResponse / onWebSocketMessage
function onResponse(flow) {
  flow.response.headers['X-Sniffy'] = 'hello'        // 改响应头
  flow.response.body = flow.response.body.replace('foo', 'bar')  // 改响应体
}
function onRequest(flow) {
  if (flow.url.includes('/blocked')) abort({ status: 403, reason: 'no' }) // 阻断
  if (flow.url.includes('/mock')) mock({ status: 200, body: 'mocked' })   // mock,不打上游
  if (flow.url.includes('/debug')) setBreakpoint()                         // 断点,UI 手动放行
}

flow 字段:id, method, url, host, path, headers{}, body, response{status,statusText,headers,body}。 宿主 API:console.*store.get/setsettingsnotify。也可在桌面 App 的"插件"页用 Monaco 编辑器在线写、保存即热重载。

License

Licensed under the Apache License 2.0. Copyright 2025 goSniffy authors. See LICENSE.

Documentation

Overview

默认(无 desktop 标签)构建下的占位入口,使 `go build` 在无 webview 依赖的环境中也能通过。真正的桌面程序请用 `-tags desktop` 构建。

Directories

Path Synopsis
cmd
sniffy command
sniffy-desktop command
默认(无 desktop 标签)构建下的占位入口,使 `go build ./...` 在无 webview 依赖的环境中也能通过。
默认(无 desktop 标签)构建下的占位入口,使 `go build ./...` 在无 webview 依赖的环境中也能通过。
examples
native_plugin
Package nativeexample 是一个 Go 原生(编译进二进制)插件的参考实现。
Package nativeexample 是一个 Go 原生(编译进二进制)插件的参考实现。
internal
api
Package api 是 headless(无界面服务器)transport:对外提供 HTTP REST API 与 gorilla/websocket 实时推送,全部委托给 internal/service。
Package api 是 headless(无界面服务器)transport:对外提供 HTTP REST API 与 gorilla/websocket 实时推送,全部委托给 internal/service。
app
Package app 把引擎、服务、插件管道装配在一起,供 headless 与桌面两种入口复用。
Package app 把引擎、服务、插件管道装配在一起,供 headless 与桌面两种入口复用。
bodycache
Package bodycache 管理「大体积响应体」的落盘副本。
Package bodycache 管理「大体积响应体」的落盘副本。
core
Package core 是抓包引擎层:它只负责监听 / 协议处理 / TLS MITM / 运行插件管道, 并通过 EventBus 向上层广播事件。
Package core 是抓包引擎层:它只负责监听 / 协议处理 / TLS MITM / 运行插件管道, 并通过 EventBus 向上层广播事件。
desktop
Package desktop 是桌面(Wails v3)transport:把 internal/service 的领域方法 作为 Wails Service 绑定给前端 JS 调用(Call.ByName),并用 Wails 事件做实时推送。
Package desktop 是桌面(Wails v3)transport:把 internal/service 的领域方法 作为 Wails Service 绑定给前端 JS 调用(Call.ByName),并用 Wails 事件做实时推送。
flow
Package flow 定义贯穿整个系统的统一流量契约 Flow。
Package flow 定义贯穿整个系统的统一流量契约 Flow。
forward
Package forward 提供「无侵入」的 HTTP/1.x 保真转发。
Package forward 提供「无侵入」的 HTTP/1.x 保真转发。
netinfo
Package netinfo 探测本机可用于被同网段设备访问的内网 IPv4 地址。
Package netinfo 探测本机可用于被同网段设备访问的内网 IPv4 地址。
pipeline
Package pipeline 负责在一个 flow.Flow 上编排所有插件,并真正应用其返回的 flow.Decision(continue / mock / abort / breakpoint)。
Package pipeline 负责在一个 flow.Flow 上编排所有插件,并真正应用其返回的 flow.Decision(continue / mock / abort / breakpoint)。
platform
Package platform 收敛与操作系统相关的细节(配置/数据目录、证书安装等)。
Package platform 收敛与操作系统相关的细节(配置/数据目录、证书安装等)。
plugin
Package plugin 实现两层插件系统(项目核心差异化卖点):
Package plugin 实现两层插件系统(项目核心差异化卖点):
plugin/js
Package js 用 goja 实现可由用户编写的 JavaScript 插件层。
Package js 用 goja 实现可由用户编写的 JavaScript 插件层。
plugin/native
Package native 是 Go 原生(编译进二进制)插件的注册表。
Package native 是 Go 原生(编译进二进制)插件的注册表。
procinfo
Package procinfo 把抓到的连接异步解析成进程信息(名/PID/路径/图标), 供 HTTP / WebSocket 处理器在不阻塞热路径的前提下补全 flow 的进程信息。
Package procinfo 把抓到的连接异步解析成进程信息(名/PID/路径/图标), 供 HTTP / WebSocket 处理器在不阻塞热路径的前提下补全 flow 的进程信息。
rules
Package rules 把 service 中持久化的重写规则(InterceptRule)转成 pipeline 钩子, 在请求/响应阶段真正应用到流量上——这是"规则被存下来却不生效"链路的补全。
Package rules 把 service 中持久化的重写规则(InterceptRule)转成 pipeline 钩子, 在请求/响应阶段真正应用到流量上——这是"规则被存下来却不生效"链路的补全。
service
Package service 是整个应用的唯一真相源(single source of truth): 会话存储、统计、拦截规则、录制状态、配置、证书、插件管理与断点。
Package service 是整个应用的唯一真相源(single source of truth): 会话存储、统计、拦截规则、录制状态、配置、证书、插件管理与断点。
sysproxy
Package sysproxy 控制操作系统级的 HTTP/HTTPS 代理设置,使本机其它应用的流量 经 Sniffy 监听端口转发。
Package sysproxy 控制操作系统级的 HTTP/HTTPS 代理设置,使本机其它应用的流量 经 Sniffy 监听端口转发。
truststore
Package truststore 把根证书装入操作系统级信任库,让本机其它应用直接信任 Sniffy MITM 证书。
Package truststore 把根证书装入操作系统级信任库,让本机其它应用直接信任 Sniffy MITM 证书。
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL