红队专题-Golang工具ChYing

在这里插入图片描述

Golang工具ChYing

  • 招募六边形战士队员
  • 原chying工具代码分析
    • 并发访问控制
      • 并发 原子 写入
      • 读取
    • 通道
    • 嵌套映射结构
    • 初始化
    • 启动代理服务器
    • 重启代理服务器

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
在这里插入图片描述

原chying工具代码分析

前有 Chying 后有 Tscanplus
红队专题-Golang工具ChYing_第1张图片

并发访问控制

type SMap struct {
	sync.RWMutex   // 标准读写锁
	Map map[int]*HTTPBody
}

并发 原子 写入

func (l *SMap) WriteMap(key int, value *HTTPBody) {
	l.Lock()
	l.Map[key] = value
	l.Unlock()   //释放写锁
}

读取

//使用读写锁来允许多个 goroutine 同时读取数据,而不会相互阻塞。
func (l *SMap) ReadMap(key int) *HTTPBody {
	l.RLock()   //读锁
	value, _ := l.Map[key]  //若给定的键不存在于 Map 中,返回的值将为 nil。
	l.RUnlock()
	return value
}

通道

// HttpHistory 接受 mitmproxy 代理信息
var HttpHistory chan HTTPHistory

嵌套映射结构

// RepeaterBodyMap Repeater 中回退、前进使用 todo前端还未实现
var RepeaterBodyMap map[string]map[int]*HTTPBody

初始化

func init() {
	HttpHistory = make(chan HTTPHistory, 1)   //创建一个缓冲大小为 1 的通道

	HTTPBodyMap = &SMap{
		Map: make(map[int]*HTTPBody),   //创建一个空的 map[int]*HTTPBody 映射
	}

	IntruderMap = make(map[string]*SMap)

	RepeaterBodyMap = make(map[string]map[int]*HTTPBody)
}

启动代理服务器

func Run(port int) {
	opts := &proxy.Options{   //配置代理服务器的选项
		Debug:             2,
		Addr:              fmt.Sprintf(":%d", port),
		StreamLargeBodies: 1024 * 1024 * 5,  //数据的阈值
		SslInsecure:       false,   //不安全选项
		CaRootPath:        "",   //CA 根证书路径
	}

	var err error
	Proxy, err = proxy.NewProxy(opts)
	if err != nil {
		logging.Logger.Fatal(err)
	}

	// 这种不错,通过添加插件的形式,这样只要实现了接口,p.AddAddon(xxxx), 然后就会自动执行相应的操作
	// 添加一个日志记录插件
	//Proxy.AddAddon(&proxy.LogAddon{})

	Proxy.AddAddon(&Burp{})  //向代理服务器添加一个 Burp 插件

	logging.Logger.Errorln(Proxy.Start())  //程序在该函数调用处阻塞,直到代理服务器停止运行。
}

重启代理服务器

func Restart(port int) string {
	// 先关闭然后再启动
	err := Proxy.Shutdown(context.TODO())   //关闭代理服务器
	if err != nil {
		logging.Logger.Errorln(err)
		return err.Error()
	}
	go Run(port)  //放入一个新的 goroutine 中运行
	//避免阻塞主程序,使其继续执行其他任务。
	return ""
}

你可能感兴趣的:(web)