-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpacket.go
92 lines (81 loc) · 2.5 KB
/
packet.go
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"github.com/google/netstack/tcpip"
"github.com/google/netstack/tcpip/header"
"github.com/google/netstack/tcpip/transport/tcp"
)
var ipID uint16
//FPacket IP and TCP header info
type FPacket struct {
ipID uint16
srcIP []byte
dstIP []byte
srcPort uint16
dstPort uint16
syn bool
ack bool
seqNum uint32
ackNum uint32
payload []byte
}
func craftPacket(packet []byte, fPacket *FPacket) int {
ipID = getNextID(ipID)
payload := packet[(header.IPv4MinimumSize + header.TCPMinimumSize):]
ipPacket := header.IPv4(packet[0:])
//IPv4 header
ipHeader := header.IPv4Fields{}
ipHeader.IHL = header.IPv4MinimumSize
ipHeader.TOS = 0
ipHeader.TotalLength = uint16(len(packet))
ipHeader.ID = ipID
ipHeader.Flags = 0b010
ipHeader.FragmentOffset = 0
ipHeader.TTL = 60
ipHeader.Protocol = 6
ipHeader.Checksum = 0
ipHeader.SrcAddr = tcpip.Address(fPacket.srcIP)
ipHeader.DstAddr = tcpip.Address(fPacket.dstIP)
ipPacket.Encode(&ipHeader)
ipPacket.SetChecksum(^ipPacket.CalculateChecksum())
//TCP header
tcpPacket := header.TCP(packet[header.IPv4MinimumSize:])
tcpHeader := header.TCPFields{}
tcpHeader.SrcPort = fPacket.srcPort
tcpHeader.DstPort = fPacket.dstPort
tcpHeader.SeqNum = fPacket.seqNum
tcpHeader.AckNum = fPacket.ackNum
tcpHeader.DataOffset = header.TCPMinimumSize
tcpHeader.Flags = 0
if fPacket.syn {
tcpHeader.Flags = tcpHeader.Flags | header.TCPFlagSyn
}
if fPacket.ack {
tcpHeader.Flags = tcpHeader.Flags | header.TCPFlagAck
}
tcpHeader.WindowSize = 65000
tcpHeader.Checksum = 0
tcpHeader.UrgentPointer = 0
tcpPacket.Encode(&tcpHeader)
xsum := header.PseudoHeaderChecksum(tcp.ProtocolNumber,
tcpip.Address(fPacket.srcIP),
tcpip.Address(fPacket.dstIP),
uint16(len(packet)-header.IPv4MinimumSize))
xsum = header.Checksum(payload, xsum)
tcpPacket.SetChecksum(^tcpPacket.CalculateChecksum(xsum))
//payload
return len(packet)
}
func unpacket(data []byte, fPacket *FPacket) {
ipHeader := header.IPv4(data)
tcpHeader := header.TCP(data[header.IPv4MinimumSize:])
copy(fPacket.srcIP, ipHeader.SourceAddress().To4())
copy(fPacket.dstIP, ipHeader.DestinationAddress().To4())
fPacket.ipID = ipHeader.ID()
fPacket.srcPort = tcpHeader.SourcePort()
fPacket.dstPort = tcpHeader.DestinationPort()
fPacket.syn = tcpHeader.Flags()&header.TCPFlagSyn != 0
fPacket.ack = tcpHeader.Flags()&header.TCPFlagAck != 0
fPacket.seqNum = tcpHeader.SequenceNumber()
fPacket.ackNum = tcpHeader.AckNumber()
fPacket.payload = data[header.IPv4MinimumSize+header.TCPMinimumSize:]
}