7
7
"strings"
8
8
"sync"
9
9
"syscall"
10
+ //"time"
11
+ "net"
10
12
"unsafe"
11
13
)
12
14
@@ -23,8 +25,9 @@ type Worker struct {
23
25
EndPort uint16
24
26
notify chan int
25
27
26
- nowDestAddr string
27
- nowDestPort uint16
28
+ nowDestAddr string
29
+ nowDestPort uint16
30
+ IsRandomSrcPort bool
28
31
}
29
32
30
33
func (w * Worker ) createRawSocket () (fd int ) {
@@ -43,7 +46,7 @@ func (w *Worker) createRawSocket() (fd int) {
43
46
}
44
47
45
48
timeVal := new (syscall.Timeval )
46
- timeVal .Sec = 5
49
+ timeVal .Sec = 6
47
50
err = syscall .SetsockoptTimeval (socket , syscall .SOL_SOCKET , syscall .SO_SNDTIMEO , timeVal )
48
51
if err != nil {
49
52
fmt .Fprintf (os .Stderr , "SetsockoptTimeval error :%s" , err .Error ())
@@ -64,26 +67,62 @@ func (w *Worker) sendPacket(buf []byte, RemoteAddr *syscall.SockaddrInet4, socke
64
67
65
68
}
66
69
67
- func (w * Worker ) recvPacket (socket int ) []byte {
70
+ func (w * Worker ) recvPacket (socket int ) ( []byte , int ) {
68
71
72
+ //time.Sleep(time.Duration(time.Millisecond * 100))
69
73
RecvBuf := make ([]byte , 52 )
70
- _ , _ , RecvErr := syscall .Recvfrom (socket , RecvBuf , 0 )
74
+ var RecvLen int
75
+ //var from net.TCPAddr
76
+ var RecvErr error
77
+ RecvLen , _ , RecvErr = syscall .Recvfrom (socket , RecvBuf , 0 )
71
78
if RecvErr != nil {
72
79
fmt .Printf ("%s" , RecvErr .Error ())
73
80
}
74
- return RecvBuf
81
+ return RecvBuf , RecvLen
75
82
}
76
83
77
84
func (w * Worker ) check (Buf []byte ) bool {
78
-
79
- if Buf [33 ]& ACK == ACK && Buf [33 ]& SYN == SYN { //RecvBuf[33] is flag of tcp header
85
+ if Buf [33 ]& ACK == ACK && Buf [33 ]& SYN == SYN && Buf [33 ]& RST != RST { //RecvBuf[33] is flag of tcp header
80
86
return true
81
87
} else {
82
88
return false
83
89
}
84
90
return true
85
91
}
86
92
93
+ func parseSrcAddrFromRecvBuf (buf []byte ) string {
94
+ Addr_A := fmt .Sprintf ("%02x" , buf [12 ])
95
+ Addr_B := fmt .Sprintf ("%02x" , buf [13 ])
96
+ Addr_C := fmt .Sprintf ("%02x" , buf [14 ])
97
+ Addr_D := fmt .Sprintf ("%02x" , buf [15 ])
98
+
99
+ Addr_Int_A , _ := strconv .ParseInt (Addr_A , 16 , 0 )
100
+ Addr_Int_B , _ := strconv .ParseInt (Addr_B , 16 , 0 )
101
+ Addr_Int_C , _ := strconv .ParseInt (Addr_C , 16 , 0 )
102
+ Addr_Int_D , _ := strconv .ParseInt (Addr_D , 16 , 0 )
103
+
104
+ SrcAddr := fmt .Sprintf ("%d.%d.%d.%d" , Addr_Int_A , Addr_Int_B , Addr_Int_C , Addr_Int_D )
105
+ return SrcAddr
106
+ }
107
+ func parseDstAddrFromRecvBuf (buf []byte ) string {
108
+ Addr_A := fmt .Sprintf ("%02x" , buf [16 ])
109
+ Addr_B := fmt .Sprintf ("%02x" , buf [17 ])
110
+ Addr_C := fmt .Sprintf ("%02x" , buf [18 ])
111
+ Addr_D := fmt .Sprintf ("%02x" , buf [19 ])
112
+
113
+ Addr_Int_A , _ := strconv .ParseInt (Addr_A , 16 , 0 )
114
+ Addr_Int_B , _ := strconv .ParseInt (Addr_B , 16 , 0 )
115
+ Addr_Int_C , _ := strconv .ParseInt (Addr_C , 16 , 0 )
116
+ Addr_Int_D , _ := strconv .ParseInt (Addr_D , 16 , 0 )
117
+
118
+ SrcAddr := fmt .Sprintf ("%d.%d.%d.%d" , Addr_Int_A , Addr_Int_B , Addr_Int_C , Addr_Int_D )
119
+ return SrcAddr
120
+ }
121
+ func parseSrcPortFromRecvBuf (buf []byte ) string {
122
+ SrcPort := fmt .Sprintf ("%2x" , buf [20 :22 ])
123
+ Iport , _ := strconv .ParseInt (SrcPort , 16 , 0 )
124
+ return strconv .Itoa (int (Iport ))
125
+ }
87
126
func (w * Worker ) Init () {
88
127
89
128
w .nowDestAddr = w .DestStartAddr
@@ -189,19 +228,40 @@ func (w *Worker) ipAddressSelfAdd(IPString string) string {
189
228
DestIPAddress := strings .Join (NewIP , "." )
190
229
return DestIPAddress
191
230
}
231
+
232
+ //find unused port
233
+ func getFreePort () (port int ) {
234
+ conn , err := net .Listen ("tcp" , ":0" )
235
+ if err != nil {
236
+ fmt .Printf ("find unused port failed:%s\n " , err )
237
+ os .Exit (1 )
238
+ }
239
+
240
+ port = conn .Addr ().(* net.TCPAddr ).Port
241
+ err = conn .Close ()
242
+ if err != nil {
243
+ fmt .Printf ("find unused port failed:%s\n " , err )
244
+ os .Exit (1 )
245
+ }
246
+ return port
247
+ }
248
+
192
249
func (w * Worker ) run () {
193
250
194
- for {
251
+ for i := 0 ; ; i ++ {
195
252
/* Make tcp Packet */
196
253
tcpMaker := new (TCPmaker )
197
254
tcpMaker .DestAddr = w .nowDestAddr
198
255
tcpMaker .DestPort = w .nowDestPort
199
256
tcpMaker .SourceAddr = w .SourceAddr
200
- tcpMaker .SourcePort = w .SourcePort
201
-
257
+ if w .IsRandomSrcPort {
258
+ tcpMaker .SourcePort = uint16 (getFreePort ())
259
+ } else {
260
+ tcpMaker .SourcePort = w .SourcePort
261
+ }
202
262
PacketLen := tcpMaker .GetPacketLen ()
203
263
Packet := make ([]byte , PacketLen )
204
- buf := tcpMaker .MakePacket ()
264
+ buf := tcpMaker .MakePacket (SYN )
205
265
copy (Packet , buf )
206
266
207
267
RemoteAddr := new (syscall.SockaddrInet4 )
@@ -213,19 +273,32 @@ func (w *Worker) run() {
213
273
RemoteAddr .Addr [2 ] = byteAddr [2 ]
214
274
RemoteAddr .Addr [3 ] = byteAddr [3 ]
215
275
RemoteAddr .Port = int (tcpMaker .GetlittleEndianDestPort ())
216
-
276
+ //if !w.IsRandomSrcPort {
277
+ //mutex.Lock()
278
+ //}
217
279
socket := w .createRawSocket ()
218
- // fmt.Printf("Socket :%d\n", socket )
280
+ fmt .Printf ("%d sendpacket,port :%d \n " , i , w . nowDestPort )
219
281
w .sendPacket (Packet , RemoteAddr , socket )
282
+ RecvBuf , RecvLen := w .recvPacket (socket )
283
+ if RecvLen == 44 && w .check (RecvBuf ) {
284
+
285
+ Openned_Port := parseSrcPortFromRecvBuf (RecvBuf )
286
+ Openned_Addr := parseSrcAddrFromRecvBuf (RecvBuf )
287
+ DstAddr := parseDstAddrFromRecvBuf (RecvBuf )
288
+ if DstAddr == w .SourceAddr {
289
+ fmt .Printf ("IP :%s \t \t Port :%s \t \t is open \n " , Openned_Addr , Openned_Port )
290
+ //sendRSTPacket(tcpMaker, RemoteAddr, socket)
291
+
292
+ }
293
+ syscall .Close (socket )
220
294
221
- RecvBuf := w .recvPacket (socket )
222
- if w .check (RecvBuf ) {
223
- mutex .Lock ()
224
- fmt .Printf ("IP :%s \t \t Port :%d \t \t is open \n " , w .nowDestAddr , w .nowDestPort )
225
- mutex .Unlock ()
226
295
} else {
227
296
//fmt.Printf("IP :%s Port :%d \t is not open \n", w.nowDestAddr, w.nowDestPort)
297
+ syscall .Close (socket )
228
298
}
299
+ //if !w.IsRandomSrcPort {
300
+ //mutex.Unlock()
301
+ //}
229
302
NextIP , NextPort := w .nextTask ()
230
303
231
304
//fmt.Printf("NextIP %s NextPort %d\n", NextIP, NextPort)
@@ -236,13 +309,23 @@ func (w *Worker) run() {
236
309
} else {
237
310
w .setNowIPAddr (NextIP )
238
311
w .setNowPort (NextPort )
239
- syscall .Close (socket )
240
312
}
241
313
}
242
314
}
243
315
244
316
func (w * Worker ) Run (channel chan int ) {
245
317
w .notify = channel
246
318
w .run ()
319
+ fmt .Printf ("Exit..." )
247
320
channel <- 1
248
321
}
322
+ func sendRSTPacket (Maker * TCPmaker , RemoteAddr * syscall.SockaddrInet4 , socket int ) {
323
+ buf := Maker .MakePacket (RST )
324
+ SendtoErr := syscall .Sendto (socket , buf , 0 , RemoteAddr )
325
+ if SendtoErr != nil {
326
+ fmt .Fprintf (os .Stderr , "Sendto is failed : %s \n " , SendtoErr )
327
+ return
328
+ } else {
329
+ fmt .Printf ("Send Fin packet is ok \n " )
330
+ }
331
+ }
0 commit comments