用Go实现支持多种协议的抓包工具——Shermie-Proxy

kxg3030 · · 2031 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

#### 前言 常见的抓包工具有 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!

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2031 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传