go学习日记(1)

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()
}
}

1

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()
}
}

2

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)
}

3

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