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

前言

常见的抓包工具有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代理

仓库

地址:https://github.com/kxg3030/shermie-proxy, 喜欢的话请用你发财的小手点个star

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值