前言:fscan扫描器中ICMP发包代码丢失数据代码差异分析
数据丢失
| func (l *LiveScanner) ICMPFirstListenAndSend(conn *icmp.PacketConn) { |
| ExistHosts := make(map[string]struct{}) |
| |
| |
| endflag := false |
| |
| go func() { |
| for { |
| if endflag == true { |
| return |
| } |
| msg := make([]byte, 100) |
| _, sourceIP, _ := conn.ReadFrom(msg) |
| if sourceIP != nil { |
| ip := sourceIP.String() |
| |
| 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() |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2021-06-26 关于单向认证与双向认证