#### 前言
常见的抓包工具有 Fiddler、Charles 等,我自己用 Go 基于 Tcp 协议实现一个代理抓包工具 shermie-proxy,支持同时监听多种协议的数据,支持对数据进行自定义修改,代码我都写了注释,如果有对网络编程感兴趣的同学,可以康康,地址在文章最后。
#### 特点
- 支持一个端口同时监听 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()
}
```
#### 效果
- Http
![yKJ9YYwP0O.gif](https://static.golangjob.cn/230201/815abd9a19a297da5c67267ab2eef801.gif)
- Websocket
![image](https://cdn.learnku.com/uploads/images/202207/21/59976/UKyoi8LgDv.gif)
- [仓库地址](github.com/kxg3030/shermie-proxy):github.com/kxg3030/shermie-proxy, 喜欢的话请用你发财的小手点个 star!
有疑问加站长微信联系(非本文作者)