红队专题-Golang工具ChYing

在这里插入图片描述

Golang工具ChYing

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

招募六边形战士队员

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

原chying工具代码分析

前有 Chying 后有 Tscanplus
在这里插入图片描述

并发访问控制

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

并发 原子 写入

func (l *SMap) WriteMap(key int, value *HTTPBody) {l.Lock()l.Map[key] = valuel.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 errorProxy, 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 ""
}