go-mitmproxy插件开发指南:从零开始编写自定义流量处理插件

【免费下载链接】go-mitmproxy mitmproxy implemented with golang. 用 Golang 实现的中间人攻击(Man-in-the-middle),解析、监测、篡改 HTTP/HTTPS 流量。 【免费下载链接】go-mitmproxy 项目地址: https://gitcode.com/gh_mirrors/go/go-mitmproxy

go-mitmproxy是一个用Golang实现的中间人攻击工具,能够解析、监测和篡改HTTP/HTTPS流量。本指南将带你从零开始,掌握如何开发自定义插件来扩展其流量处理能力,让你轻松实现个性化的网络请求拦截与修改功能。

插件开发基础:了解Addon接口

go-mitmproxy的插件系统基于Addon接口实现,所有自定义插件都需要实现这个接口定义的方法。核心接口定义在proxy/addon.go文件中,包含多个生命周期钩子函数:

  • ClientConnected/ClientDisconnected: 客户端连接建立/断开时触发
  • ServerConnected/ServerDisconnected: 服务端连接建立/断开时触发
  • Requestheaders/Request: HTTP请求头/完整请求到达时触发
  • Responseheaders/Response: HTTP响应头/完整响应到达时触发
  • StreamRequestModifier/StreamResponseModifier: 流模式下修改请求/响应体

最简单的插件结构

所有插件都应该继承BaseAddon结构体,它提供了所有接口方法的空实现,让你只需重写需要的方法:

type MyFirstAddon struct {
    proxy.BaseAddon  // 嵌入基础Addon
}

// 重写需要的方法
func (addon *MyFirstAddon) Request(f *proxy.Flow) {
    // 处理请求的逻辑
}

开发实战:创建你的第一个插件

让我们通过一个实际例子来学习如何开发插件。我们将创建一个简单的请求头修改插件,在所有HTTP请求中添加一个自定义头信息。

1. 设置开发环境

首先克隆项目代码库:

git clone https://gitcode.com/gh_mirrors/go/go-mitmproxy
cd go-mitmproxy

2. 创建插件文件

在项目中创建一个新的插件文件,例如addon/myheader.go

package addon

import (
    "github.com/gh_mirrors/go/go-mitmproxy/proxy"
)

// MyHeaderAddon 用于添加自定义请求头的插件
type MyHeaderAddon struct {
    proxy.BaseAddon
}

// Request 处理完整请求
func (addon *MyHeaderAddon) Request(f *proxy.Flow) {
    // 添加自定义请求头
    f.Request.Header.Set("X-My-Plugin", "Hello go-mitmproxy")
}

3. 注册插件

要让插件生效,需要在主程序中注册它。修改cmd/go-mitmproxy/main.go文件,添加插件注册代码:

// 导入自定义插件包
import (
    "github.com/gh_mirrors/go/go-mitmproxy/addon"
)

func main() {
    // ... 现有代码 ...
    
    // 创建并添加自定义插件
    myHeaderAddon := &addon.MyHeaderAddon{}
    p.AddAddon(myHeaderAddon)
    
    // ... 启动代理 ...
}

插件调试与测试

开发插件时,你可以使用go-mitmproxy的Web界面来观察和测试插件效果。启动代理后访问Web界面,你可以看到所有经过代理的HTTP请求和响应。

go-mitmproxy Web界面流量列表 图1:go-mitmproxy Web界面展示的流量列表,可用于观察插件效果

点击任意请求,可以查看详细信息,包括我们插件添加的自定义头:

请求详情查看 图2:在Web界面中查看请求详情,验证自定义头是否添加成功

高级功能:响应内容修改

除了修改请求头,我们还可以修改响应内容。下面是一个简单的响应修改示例,将所有HTML响应中的"example"替换为"go-mitmproxy":

func (addon *MyHeaderAddon) StreamResponseModifier(f *proxy.Flow, in io.Reader) io.Reader {
    // 检查响应是否为HTML
    if strings.Contains(f.Response.Header.Get("Content-Type"), "text/html") {
        return &ReplaceReader{in, []byte("example"), []byte("go-mitmproxy")}
    }
    return in
}

// ReplaceReader 用于替换流中的内容
type ReplaceReader struct {
    r      io.Reader
    oldVal []byte
    newVal []byte
}

// Read 实现io.Reader接口
func (r *ReplaceReader) Read(p []byte) (int, error) {
    // 实现替换逻辑...
}

修改后的响应可以在Web界面的"Preview"标签页中查看:

响应内容预览 图3:在Web界面中预览修改后的响应内容

插件示例与最佳实践

go-mitmproxy项目中提供了多个插件示例,位于examples/目录下,包括:

开发插件时的最佳实践:

  1. 始终继承BaseAddon,只实现需要的方法
  2. 避免在钩子函数中执行耗时操作,以免影响代理性能
  3. 对于大型修改,考虑使用流模式(StreamModifier)处理
  4. 充分利用Web界面进行调试和验证

通过本文的指南,你已经掌握了go-mitmproxy插件开发的基础知识。现在你可以开始创建自己的插件,实现更复杂的流量处理逻辑,如请求重定向、数据提取、安全扫描等功能。发挥你的想象力,扩展go-mitmproxy的能力吧!

【免费下载链接】go-mitmproxy mitmproxy implemented with golang. 用 Golang 实现的中间人攻击(Man-in-the-middle),解析、监测、篡改 HTTP/HTTPS 流量。 【免费下载链接】go-mitmproxy 项目地址: https://gitcode.com/gh_mirrors/go/go-mitmproxy

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐