0x01 背景
学了几天go,写了一个扫描器来验收一下学习成果。
貌似每次学一门新的语言第一个实例都是写扫描器 :)
0x02 version 1.0
先从固定IP和端口着手,了解原理
在这里,我们先假设你已经对go的基础语法有了一定的了解,如声明变量,变量赋值,fmt包等
说一下扫描器原理,发送socket连接(ip+port)连接成功说明端口开放
其他需要注意的有超时时间,因为若主机不存在,或目标端口是关闭的,往往需要花费数秒才返回错误,大大降低了扫描效率
在go中可以使用net.Dialer结构体设置超时时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package main
import ( "fmt" "net" "time" )
func main(){ //定义扫描目标 host := "127.0.0.1" port := 445 //Dial函数作为socket客户端连接,并设置超时时间 d := net.Dialer{Timeout: time.Second} conn, err := d.Dial("tcp4", fmt.Sprintf("%s:%v",host,port))
if err == nil{ fmt.Printf("%s:%v open",host,port) }else{ fmt.Printf("%s:%v close",host,port) conn.Close() } }
|

0x02 version 2.1
执行后接受用户输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| package main
import ( "fmt" "sync" "net" "time" )
//线程同步 var wg sync.WaitGroup
func main(){ //定义扫描目标,范围 var host string var port_start,port_end int
fmt.Printf("target ip:") fmt.Scan(&host) fmt.Printf("port start:") fmt.Scan(&port_start) fmt.Printf("port end:") fmt.Scan(&port_end) wg.Add(port_end - port_start + 1) scan(host,port_start,port_end) wg.Wait() fmt.Println("scan over.") }
//声明通道 //判断扫描端口范围 var port_list = make(chan int,10) //限制并发数 var connect = make(chan string,10)
func scan(host string , port_start,port_end int){
//以并发的形式调用匿名函数 go func(){ for i:=port_start;i<=port_end;i++{ port_list <- i } }()
go func(){ //写入通道 for port := range port_list{ connect <- fmt.Sprintf("%s:%d",host,port) } }() go Connect() }
func Connect(){ for target := range connect{ //Dial函数作为socket客户端连接,并设置超时时间, d := net.Dialer{Timeout: time.Second} conn, err := d.Dial("tcp4", target) if err == nil{ fmt.Printf("%s open\n",target) conn.Close() }else{ fmt.Printf("%s close\n",target) } wg.Done() } }
|

0x02 version 2.2
参数交互
1 2 3 4 5 6 7 8 9 10 11 12 13
| package main
import ( "fmt" "flag" )
func main(){ port_list:=flag.String("p","80-8080","port") host:=flag.String("h","127.0.0.1","host") flag.Parse() fmt.Printf("%s:%s",*host,*port_list) }
|

xd们,我柜子动了我先不学了