//Start all the workers for i := 0; i < workers; i++ { gofunc(i int) { for _, scannerName := range orderedScanners { // 在orderedScanners里保存扫描模块名称, main()里注册 scanner := *scanners[scannerName] scanner.InitPerSender(i) // 每个扫描模块的初始化,一般没有操作 } for obj := range processQueue { for run := uint(0); run < uint(config.ConnectionsPerHost); run++ { result := grabTarget(obj, mon) outputQueue <- result } } workerDone.Done() }(i) }
funcgrabTarget(input ScanTarget, m *Monitor) []byte { moduleResult := make(map[string]ScanResponse)
for _, scannerName := range orderedScanners { // scannerName就是模块名称,比如modbus,siemens,crimson等 scanner := scanners[scannerName] trigger := (*scanner).GetTrigger() if input.Tag != trigger { continue } deferfunc(name string) { if e := recover(); e != nil { log.Errorf("Panic on scanner %s when scanning target %s: %#v", scannerName, input.String(), e) // Bubble out original error (with original stack) in lieu of explicitly logging the stack / error panic(e) } }(scannerName) name, res := RunScanner(*scanner, m, input) moduleResult[name] = res if res.Error != nil && !config.Multiple.ContinueOnError { break } } raw := Grab{IP: ipstr, Domain: input.Domain, Data: moduleResult} result, err := json.Marshal(outputData) // 序列化结果 if err != nil { log.Fatalf("unable to marshal data: %s", err) }
var ip net.IP if ipnet != nil { if ipnet.Mask != nil { // expand CIDR block into one target for each IP for ip = ipnet.IP.Mask(ipnet.Mask); ipnet.Contains(ip); incrementIP(ip) { ch <- ScanTarget{IP: duplicateIP(ip), Domain: domain, Tag: tag} } continue } else { ip = ipnet.IP } } ch <- ScanTarget{IP: ip, Domain: domain, Tag: tag}