首页 > 其他分享 >Golang实现TCP端口扫描器

Golang实现TCP端口扫描器

时间:2023-04-23 22:25:52浏览次数:34  
标签:err nil 端口扫描 ip fmt TCP ports Golang port

简易版

package main

func worker(ports,results chan int){
    for p:=range ports{
        address:=fmt.Sprintf("bilibili.com:%d",p)
        conn,err:=net.Dial("tcp",address)
        if err!=nil{
            result<-0
            continue
        }
        conn.Close()
        results<-p
    }
}
func main(){
    ports:=make(chan int,100)
    results:=make(chan int)
    var openports []int
    
    for i:=0;i<=cap(ports);i++{
        go worker(ports,results)
    }
    go func(){
        for i:=1;i<=1024;i++{
            ports<-i
        }
    }()
    for i:=0;i<1024;i++{
        ports:=<-results
        if port!=0{
            openports=append(openports,port)
        }
    }
    close(ports)
    close(results)
    sort.Ints(openports)
    for _,port:=range openports{
        fmt.Prinf("%d open\n",port)
    }
}

能够解析IP 端口字符串的TCP全连接扫描器

/scanner/tcp-scanner.go

package scanner

func Connect(ip string,port int)(net.Conn,err){
    address:=fmt.Sprintf("%v:%v",ip,port)
    conn,err:=net.DialTimeout("tcp",address,1*time.Second)
    defer func(){
        if conn!=nil{
            conn.Close()
        }
    }()
    return conn,err
}

util/util.go

package util

func GetPorts(selection string)([]int,error){
    ports:=make([]int,0)
    if selections==""{
        return ports,nil
    }
    ranges:=strings.Split(selection,",")
    for _,r:=range ranges{
        r=strings.TrimSpace(r)
        if strings.Contains(r,"-"){
            parts:=strings.Split(r,"-")
            if len(parts)!=2{
                return nil,fmt.Errorf("Invalid Port Selection segment :'%s'",r)
            }
            start,err:=strconv.Atio(parts[0])
            if err!=nil{
                return nil,fmt.Errorf("Invalid port number:'%s'",parts[0])
            }
            end,err:=strconv.Atio(parts[1])
            if err!=nil{
                return nil,fmt.Errorf("Invalid port number:'%s'",ports[1])
            }
            if start>end{
                return nil,fmt.Errorf("Invalid port range:%d-%d",start,end)
            }
            for i:=start;i<=end;i++{
                ports=append(ports,i)
            }
        }else{
            if port,err:=strconv.Atio(r);err!=nil{
                return nil,fmt.Errorf("Invalid port number:'%s'",r)
                }else{
                    ports=append(ports,port)
            }
        }
        
    }
    return ports,nil
}
func GetIpList(ips string)([]net.IP,error){
    addressList,err:=iprange.ParseList(ips)
    if err!=nil{
        return nil,err
    }
    list:=addrssList.Expand()
    return list,err
}

main.go

package main

func main(){
    if len(os.Args)==3{
        ipList:=os.Args[1]
        portsList:=os.Args[2]
        ips,_:=util.GetIpList(iplist)
        ports,_:=util.GetPortList(portsList)
        for _,ip :=range ips{
            for_,port:=range ports{
                _,err:=scanner.Connect(ip.String(),port)
                if err!=nil{
                    continue
                }
                fmt.Printf("ip:%v,port:%v is open\n",ip,port)
            }
        }
        
    }else{
        fmt.Printf("%v iplist  port \n",os.Arg[0])
    }
}

标签:err,nil,端口扫描,ip,fmt,TCP,ports,Golang,port
From: https://www.cnblogs.com/Weber-security/p/17347934.html

相关文章

  • GoLang 版本号大小对比
    go版本号大小对比,比如:1.0.0 <1.0.1   思路:按照 .(点符号)分割,分割后将其转成整型,然后再就行对比。//版本号对比使用【版本号=第一位*10000+第二位*100+第三位】//一般版本号是3位,如果大于三位就需要在此进行扩展funcFormatAppVersion(versionNostring)int{......
  • Golang实现代理TCP客户端
    目标网站xxx.com,代理服务器xxxproxy.com,通过代理服务器实现流量转发。packagemainfunchandle(srcnet.Conn){dst,err:=net.Dial("tcp","xxx.com:80")iferr!=nil{log.Fatalln("Unabletoconnectoutunreachablehost")}deferd......
  • TCP 三次握手过程中客户端发送的 SYN 报文的基本结构
    **以下是SYN报文示意图,展示了TCP三次握手过程中客户端发送的SYN报文的基本结构**。```SegmentHeader+----------------+------------------------------+|......
  • netty之TCP粘包拆包问题解决
    TCP粘包拆包问题解决什么TCP粘包和拆包问题假设客户端向服务端连续发送了两个数据包,分别用ABC和DEF来表示,那么服务端收到的数据可以分为以下三种情况:第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象。第二种情况,接收端只收到一个数据包,这一个数据包中包含了发送端发......
  • TCP/IP笔记
    OSI模型:(OpenSystemInterconnect)包含七层:物理层,链路层,网络层,传输层,会话层,表示层,应用层TCP/IP协议简化为4层对应OSPI为:应用层:HTTP/FTP/SMTP/Telnet传输层:TCP/UDP网络层:ICMP,IP,IGMP链路层:ARP,RARP应用层: 链路层:交换机MAC-->MAC网络层:IP-->IPMAC表:交换机中MAC和交换机端口对应......
  • golang实现RPC
      一、RPC工作流程:摘自《goweb编程》二、go支持三个级别的RPC(HTTP,TCP,JSONRPC)三、实现http的RPC实例:3.1GORPC的函数只有符合以下条件才能被远程访问函数必须是首字母是大写必须有两个首字母大写的参数第一个参数是接收的参数,第二个参数是返回给客户端的参数,第二......
  • 在Golang中配置Logrus
    当你开始使用Golang编写应用程序时,记录应用程序的运行状态和错误信息是至关重要的。为了记录这些信息,你需要使用一个强大的日志库。Logrus是一个流行的日志库,它提供了丰富的功能和易于使用的API。在本文中,我们将介绍如何配置Logrus来记录应用程序的日志信息。安装Logrus首先,你......
  • golang net/rpc inject data to service function
    在golang中,net/rpc库比较牛,只需要写函数,然后使用现成的ServerCodec就可以完成rpc服务了。但是有个问题,service函数的参数都是来自客户端的,如果服务器想为某个特殊的函数注入一些配置或状态参数,就不好弄了。解决方案:修改service函数,比如原来的参数是FuncArgs结构体,现在改成t......
  • golang中通过原始socket实现tcp/udp的服务端和客户端示例
    这些天稍微空点,总结下golang中通过tcp/udp实现服务端客户端的编程实现,毕竟长久以来,如果要截单的http服务,我们直接使用net/http包实现服务,或者使用框架如gin/echo/beego等。以下就直接上代码,稍微看看都能懂起。1.TCP的实现serverpackagemainimport( "bufio" "fmt" "net"......
  • golang 中常用的超时控制的方案示例
    在go中,我们很容易就可以实现超时控制,今天分享2种解决方案:1.select+time.After2.select+context其实两种方案中,我们都是通过channel来控制的,在方案1中,对于time.After,通过返回一个只读<-chanTime实现,而context中,则通过context.Done()实现,通过返回<-chans......