ICMP发包代码丢失数据代码差异分析
前言:fscan扫描器中ICMP发包代码丢失数据代码差异分析
数据丢失
func (l *LiveScanner) ICMPFirstListenAndSend(conn *icmp.PacketConn) {
ExistHosts := make(map[string]struct{})
//count := 0
endflag := false
//开启一个协程监听,conn.ReadFrom默认堵塞不需要sleep
go func() {
for {
if endflag == true {
return
}
msg := make([]byte, 100)
_, sourceIP, _ := conn.ReadFrom(msg)
if sourceIP != nil {
ip := sourceIP.String()
// 判断是否存储了存活ip,有的路由会发送外网ip,需要IsContain判断ip是否在扫描ip列表里
if _, ok := ExistHosts[sourceIP.String()]; !ok {
ExistHosts[ip] = struct{}{}
if stringsutil.IsContain(l.Hosts, ip) {
result := structs.AliveResult{
Ip: ip,
IpRange: strings.Join(strings.Split(ip, ".")[0:3], ".") + ".1/24",
Mac: "",
}
l.doDone(result)
} else {
outputter.PrintScreen.WriteResult(fmt.Sprintf("[!] 发现路由返回的外网ip: %-15s", ip))
}
}
}
}
}()
for _, host := range l.Hosts {
dst, _ := net.ResolveIPAddr("ip", host)
IcmpByte := ICMPmakemsg(host)
conn.WriteTo(IcmpByte, dst)
}
endflag = true
conn.Close()
}
func main(){
conn, err := icmp.ListenPacket("ip4:icmp", "0.0.0.0")
}
数据不丢失
func main(){
chanHosts := make(chan string, len(l.Hosts))
go func() {
for ip := range chanHosts {
if _, ok := ExistHosts[ip]; !ok {
ExistHosts[ip] = struct{}{}
if stringsutil.IsContain(l.Hosts, ip) {
result := structs.AliveResult{
Ip: ip,
IpRange: strings.Join(strings.Split(ip, ".")[0:3], ".") + ".1/24",
Mac: "",
}
l.doDone(result)
} else {
outputter.PrintScreen.WriteResult(fmt.Sprintf("[!] 发现路由返回的外网ip: %-15s", ip))
}
}
livewg.Done()
}
}()
RunIcmp1(l.Hosts, conn, chanHosts)
}
func ICMPFirstListenAndSend(hostslist []string, conn *icmp.PacketConn, chanHosts chan string) {
endflag := false
go func() {
for {
if endflag == true {
return
}
msg := make([]byte, 100)
_, sourceIP, _ := conn.ReadFrom(msg)
if sourceIP != nil {
livewg.Add(1)
chanHosts <- sourceIP.String()
}
}
}()
for _, host := range hostslist {
dst, _ := net.ResolveIPAddr("ip", host)
IcmpByte := ICMPmakemsg(host)
conn.WriteTo(IcmpByte, dst)
}
endflag = true
conn.Close()
}

浙公网安备 33010602011771号