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()
}
posted @ 2024-06-26 16:58  zpchcbd  阅读(46)  评论(0)    收藏  举报