Skip to content

Commit

Permalink
Package feature modification And Optimize BPF performance
Browse files Browse the repository at this point in the history
  • Loading branch information
XinRoom committed Apr 18, 2022
1 parent be44655 commit 584312f
Showing 1 changed file with 38 additions and 5 deletions.
43 changes: 38 additions & 5 deletions core/port/syn/syn.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package syn
import (
"context"
"errors"
"fmt"
"github.com/XinRoom/go-portScan/core/port"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
Expand Down Expand Up @@ -57,6 +58,13 @@ func NewSynScanner(firstIp net.IP, retChan chan port.OpenIpPort, option port.Opt
if err != nil {
return
}
if devName == "" && option.Dev == "" {
err = errors.New("get router info fail: no dev name")
return
}
if devName == "" {
devName = option.Dev
}

rand.Seed(time.Now().Unix())

Expand Down Expand Up @@ -86,8 +94,8 @@ func NewSynScanner(firstIp net.IP, retChan chan port.OpenIpPort, option port.Opt
if err != nil {
return
}
// Set filter
handle.SetBPFFilter("tcp || arp")
// Set filter, Reduce the number of monitoring packets
handle.SetBPFFilter(fmt.Sprintf("ether dst %s && (arp || tcp)", srcMac.String()))
ss.handle = handle

// start listen recv
Expand Down Expand Up @@ -148,20 +156,40 @@ func (ss *synScanner) Scan(dstIp net.IP, dst uint16) (err error) {
SrcIP: ss.srcIp,
DstIP: dstIp,
Version: 4,
TTL: 64,
TTL: 128,
Id: uint16(50000 + rand.Intn(500)),
Flags: layers.IPv4DontFragment,
Protocol: layers.IPProtocolTCP,
}
tcp := layers.TCP{
SrcPort: layers.TCPPort(49000 + rand.Intn(5000)), // Random source port and used to determine recv dst port range
DstPort: layers.TCPPort(dst),
SYN: true,
Window: 65535,
Window: 65280,
Seq: uint32(500000 + rand.Intn(5000)),
Options: []layers.TCPOption{
{
OptionType: layers.TCPOptionKindMSS,
OptionLength: 4,
OptionData: []byte{0x05, 0x84}, // 1412
OptionData: []byte{0x05, 0x50}, // 1360
},
{
OptionType: layers.TCPOptionKindNop,
},
{
OptionType: layers.TCPOptionKindWindowScale,
OptionLength: 3,
OptionData: []byte{0x08},
},
{
OptionType: layers.TCPOptionKindNop,
},
{
OptionType: layers.TCPOptionKindNop,
},
{
OptionType: layers.TCPOptionKindSACKPermitted,
OptionLength: 2,
},
},
}
Expand Down Expand Up @@ -194,6 +222,11 @@ func (ss *synScanner) WaitLimiter() error {
return ss.limiter.Wait(ss.ctx)
}

// GetDevName Get the device name after the route selection
func (ss synScanner) GetDevName() string {
return ss.devName
}

// getHwAddrV4 get the destination hardware address for our packets.
func (ss *synScanner) getHwAddrV4(arpDst net.IP) (mac net.HardwareAddr, err error) {
ipStr := arpDst.String()
Expand Down

0 comments on commit 584312f

Please sign in to comment.