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 ""
}