前言
常见的抓包工具有Fiddler、Charles等,我自己用Go基于Tcp协议实现一个代理抓包工具shermie-proxy
,支持同时监听多种协议的数据,支持对数据进行自定义修改,代码我都写了注释,如果有对网络编程感兴趣的同学,可以康康。
涉及的知识:
- Ca证书:根证书、中间证书的生成和下发
- 单向认证、双向认证、Tls握手过程
- Ws、Wss协议
- Http、Https协议
- Socket5协议
- 协议转换
支持的协议:
- 支持一个端口同时监听Http、Https、Ws、Wss、Socket5、Tcp几种协议
- 支持注册消息事件,对消息进行修改、裁剪再发送
使用方法
func init() { | |
// 初始化日志 | |
Log.NewLogger().Init() | |
// 初始化根证书 | |
err := Core.NewCertificate().Init() | |
if err != nil { | |
Log.Log.Println("初始化根证书失败:" + err.Error()) | |
return | |
} | |
} | |
func main() { | |
port := flag.String("port", "9090", "listen port") | |
nagle := flag.Bool("nagle", true, "connect remote use nagle algorithm") | |
proxy := flag.String("proxy", "0", "tcp prxoy remote host") | |
flag.Parse() | |
if *port == "0" { | |
Log.Log.Fatal("port required") | |
return | |
} | |
// 启动服务 | |
s := Core.NewProxyServer(*port, *nagle, *proxy) | |
// 注册http客户端请求事件函数 | |
s.OnHttpRequestEvent = func(request *http.Request) { | |
} | |
// 注册http服务器响应事件函数 | |
s.OnHttpResponseEvent = func(response *http.Response) { | |
contentType := response.Header.Get("Content-Type") | |
var reader io.Reader | |
if strings.Contains(contentType, "json") { | |
reader = bufio.NewReader(response.Body) | |
if header := response.Header.Get("Content-Encoding"); header == "gzip" { | |
reader, _ = gzip.NewReader(response.Body) | |
} body, _ := io.ReadAll(reader) | |
Log.Log.Println("HttpResponseEvent:" + string(body)) | |
}} | |
// 注册socket5服务器向客户端推送消息事件函数 | |
s.OnSocket5ResponseEvent = func(message []byte) { | |
Log.Log.Println("Socket5ResponseEvent:" + string(message)) | |
} | |
// 注册socket5客户端向服务器推送消息事件函数 | |
s.OnSocket5RequestEvent = func(message []byte) { | |
Log.Log.Println("Socket5RequestEvent:" + string(message)) | |
} | |
// 注册ws服务器向客户端推送消息事件函数 | |
s.OnWsRequestEvent = func(msgType int, message []byte, clientConn *Websocket.Conn, resolve Core.ResolveWs) error { | |
Log.Log.Println("WsRequestEvent:" + string(message)) | |
return clientConn.WriteMessage(msgType, message) | |
} | |
// 注册ws客户端向服务器推送消息事件函数 | |
s.OnWsResponseEvent = func(msgType int, message []byte, tartgetConn *Websocket.Conn, resolve Core.ResolveWs) error { | |
Log.Log.Println("WsResponseEvent:" + string(message)) | |
return resolve(msgType, message, tartgetConn) | |
} | |
_ = s.Start() | |
} |
效果
动态图片放在github上了,有可能无法显示。
- Https代理
- Wss代理
仓库
地址:github.com/kxg3030/shermie-proxy, 喜欢的话请用你发财的小手点个star