Skip to content

Commit 3b027a9

Browse files
author
feimyy
committed
修复部分BUG
1,解决显示错误的端口开放信息的BUG 2,未找到开放端口重复显示的BUG所在
1 parent 94efe39 commit 3b027a9

File tree

3 files changed

+132
-39
lines changed

3 files changed

+132
-39
lines changed

src/main/goSynPortScanner.go

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ func getRoutinueNum() uint32 {
109109
n := checkRoutinueNum(strings.Join(Num, ""))
110110
return uint32(n)
111111
}
112+
func getSrcPortOption() bool {
113+
value, err := strconv.ParseBool(strings.Join(os.Args[6:7], ""))
114+
if err != nil {
115+
return true
116+
} else {
117+
fmt.Printf("value :%v", value)
118+
return value
119+
}
120+
}
112121

113122
func ipAddressSelfAdd(IPString string) string {
114123

@@ -169,7 +178,7 @@ func nextTask(NowDestBeginIP string, NowDestBeginPort uint16, DestStartPort uint
169178
nowPort := NowDestBeginPort
170179
var i uint8
171180
for i = 0; i < routinueNum; i++ {
172-
if nowPort == DestEndPort { //The Next Port will be overflow
181+
if nowPort == DestEndPort { //The Next Port will be overflow
173182

174183
nowIP = ipAddressSelfAdd(nowIP)
175184
nowPort = DestStartPort
@@ -212,7 +221,7 @@ func getTaskNum(DestStartAddr string, DestEndAddr string, DestStartPort uint16,
212221
}
213222
func main() {
214223

215-
if len(os.Args) < 6 {
224+
if len(os.Args) < 7 {
216225
usage()
217226
return
218227
}
@@ -225,27 +234,29 @@ func main() {
225234
DestEndPort := getDestEndPort()
226235

227236
RoutinueNum := getRoutinueNum()
237+
IsRandomSrcPort := getSrcPortOption()
228238
runtime.GOMAXPROCS(int(RoutinueNum))
229239
var i uint32
230240
taskNum := getTaskNum(DestStartAddr, DestEndAddr, DestStartPort, DestEndPort)
231241
space := taskNum / RoutinueNum
232-
InstanceNum := RoutinueNum - 1
242+
InstanceNum := RoutinueNum
233243

234244
fmt.Printf("space : %d taskNum %d\n", space, taskNum)
235-
workes := make([]manager.Worker, InstanceNum)
245+
workers := make([]manager.Worker, InstanceNum)
236246
channels := make([]chan int, InstanceNum)
237247

238248
NowDestStartAddr := DestStartAddr
239249
NowDestStartPort := DestStartPort
240250
for i = 0; i < InstanceNum; i++ {
241251
worker := new(manager.Worker)
242-
workes[i] = *worker
243-
workes[i].SourceAddr = SourceAddr
244-
workes[i].SourcePort = SourcePort
245-
workes[i].DestStartAddr = NowDestStartAddr
246-
workes[i].DestStartPort = NowDestStartPort
247-
workes[i].StartPort = DestStartPort
248-
workes[i].EndPort = DestEndPort
252+
workers[i] = *worker
253+
workers[i].SourceAddr = SourceAddr
254+
workers[i].SourcePort = SourcePort
255+
workers[i].DestStartAddr = NowDestStartAddr
256+
workers[i].DestStartPort = NowDestStartPort
257+
workers[i].StartPort = DestStartPort
258+
workers[i].EndPort = DestEndPort
259+
workers[i].IsRandomSrcPort = IsRandomSrcPort
249260
var NowDestEndAddr string
250261
var NowDestEndPort uint16
251262

@@ -257,11 +268,11 @@ func main() {
257268
}
258269

259270
//fmt.Printf("i : %d NowDestStartAddr: %s NowDestStartPort: %d NowDestEndAddr : %s ,NowDestEndPort: %d \n", i, NowDestStartAddr, NowDestStartPort, NowDestEndAddr, NowDestEndPort)
260-
workes[i].DestEndAddr = NowDestEndAddr
261-
workes[i].DestEndPort = NowDestEndPort
262-
workes[i].Init()
271+
workers[i].DestEndAddr = NowDestEndAddr
272+
workers[i].DestEndPort = NowDestEndPort
273+
workers[i].Init()
263274
channels[i] = make(chan int, 1)
264-
go workes[i].Run(channels[i])
275+
go workers[i].Run(channels[i])
265276
if (InstanceNum - 1) != i {
266277
NowDestStartAddr, NowDestStartPort = nextTask(NowDestEndAddr, NowDestEndPort, DestStartPort, DestEndPort, 1)
267278
}
@@ -270,7 +281,6 @@ func main() {
270281
break
271282
}
272283
}
273-
274284
for _, ch := range channels {
275285
<-ch
276286
}

src/manager/tcpmaker.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func inet_address(IPString string) (value uint32) {
8383

8484
result4 := uint32(a) //Padding Last place
8585

86-
result = result1 + result2 + result3 + result4 // Combine
86+
result = result1 + result2 + result3 + result4 // Combine
8787

8888
value = result
8989
return
@@ -134,7 +134,7 @@ func (this *TCPmaker) GetPacketLen() uint32 {
134134
return Len
135135

136136
}
137-
func (this *TCPmaker) MakePacket() (packet []byte) {
137+
func (this *TCPmaker) MakePacket(flag byte) (packet []byte) {
138138

139139
/* Padding The ip Head Data */
140140
ipHeader := new(IP_HEADER)
@@ -160,7 +160,7 @@ func (this *TCPmaker) MakePacket() (packet []byte) {
160160
tcpHeader.seq = htonl(0x01)
161161
tcpHeader.ack = 0
162162
tcpHeader.lengthAndres = (uint8(TCP_HEADER_LEN)/4<<4 | 0)
163-
tcpHeader.flag = 2 //SYN
163+
tcpHeader.flag = flag //SYN
164164
tcpHeader.windowsSize = htons(10)
165165
tcpHeader.sum = 0
166166
tcpHeader.urp = 0

src/manager/worker.go

Lines changed: 103 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"strings"
88
"sync"
99
"syscall"
10+
//"time"
11+
"net"
1012
"unsafe"
1113
)
1214

@@ -23,8 +25,9 @@ type Worker struct {
2325
EndPort uint16
2426
notify chan int
2527

26-
nowDestAddr string
27-
nowDestPort uint16
28+
nowDestAddr string
29+
nowDestPort uint16
30+
IsRandomSrcPort bool
2831
}
2932

3033
func (w *Worker) createRawSocket() (fd int) {
@@ -43,7 +46,7 @@ func (w *Worker) createRawSocket() (fd int) {
4346
}
4447

4548
timeVal := new(syscall.Timeval)
46-
timeVal.Sec = 5
49+
timeVal.Sec = 6
4750
err = syscall.SetsockoptTimeval(socket, syscall.SOL_SOCKET, syscall.SO_SNDTIMEO, timeVal)
4851
if err != nil {
4952
fmt.Fprintf(os.Stderr, "SetsockoptTimeval error :%s", err.Error())
@@ -64,26 +67,62 @@ func (w *Worker) sendPacket(buf []byte, RemoteAddr *syscall.SockaddrInet4, socke
6467

6568
}
6669

67-
func (w *Worker) recvPacket(socket int) []byte {
70+
func (w *Worker) recvPacket(socket int) ([]byte, int) {
6871

72+
//time.Sleep(time.Duration(time.Millisecond * 100))
6973
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)
7178
if RecvErr != nil {
7279
fmt.Printf("%s", RecvErr.Error())
7380
}
74-
return RecvBuf
81+
return RecvBuf, RecvLen
7582
}
7683

7784
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
8086
return true
8187
} else {
8288
return false
8389
}
8490
return true
8591
}
8692

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+
}
87126
func (w *Worker) Init() {
88127

89128
w.nowDestAddr = w.DestStartAddr
@@ -189,19 +228,40 @@ func (w *Worker) ipAddressSelfAdd(IPString string) string {
189228
DestIPAddress := strings.Join(NewIP, ".")
190229
return DestIPAddress
191230
}
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+
192249
func (w *Worker) run() {
193250

194-
for {
251+
for i := 0; ; i++ {
195252
/* Make tcp Packet */
196253
tcpMaker := new(TCPmaker)
197254
tcpMaker.DestAddr = w.nowDestAddr
198255
tcpMaker.DestPort = w.nowDestPort
199256
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+
}
202262
PacketLen := tcpMaker.GetPacketLen()
203263
Packet := make([]byte, PacketLen)
204-
buf := tcpMaker.MakePacket()
264+
buf := tcpMaker.MakePacket(SYN)
205265
copy(Packet, buf)
206266

207267
RemoteAddr := new(syscall.SockaddrInet4)
@@ -213,19 +273,32 @@ func (w *Worker) run() {
213273
RemoteAddr.Addr[2] = byteAddr[2]
214274
RemoteAddr.Addr[3] = byteAddr[3]
215275
RemoteAddr.Port = int(tcpMaker.GetlittleEndianDestPort())
216-
276+
//if !w.IsRandomSrcPort {
277+
//mutex.Lock()
278+
//}
217279
socket := w.createRawSocket()
218-
//fmt.Printf("Socket :%d\n", socket)
280+
fmt.Printf("%d sendpacket,port :%d \n", i, w.nowDestPort)
219281
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)
220294

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()
226295
} else {
227296
//fmt.Printf("IP :%s Port :%d \t is not open \n", w.nowDestAddr, w.nowDestPort)
297+
syscall.Close(socket)
228298
}
299+
//if !w.IsRandomSrcPort {
300+
//mutex.Unlock()
301+
//}
229302
NextIP, NextPort := w.nextTask()
230303

231304
//fmt.Printf("NextIP %s NextPort %d\n", NextIP, NextPort)
@@ -236,13 +309,23 @@ func (w *Worker) run() {
236309
} else {
237310
w.setNowIPAddr(NextIP)
238311
w.setNowPort(NextPort)
239-
syscall.Close(socket)
240312
}
241313
}
242314
}
243315

244316
func (w *Worker) Run(channel chan int) {
245317
w.notify = channel
246318
w.run()
319+
fmt.Printf("Exit...")
247320
channel <- 1
248321
}
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

Comments
 (0)