-
Notifications
You must be signed in to change notification settings - Fork 2
/
send.go
34 lines (28 loc) · 865 Bytes
/
send.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
package dhcp4_spoofer
import (
"fmt"
"net"
"syscall"
"github.com/irai/packet"
)
func sendDHCP4Packet(conn net.PacketConn, srcAddr packet.Addr, dstAddr packet.Addr, p packet.DHCP4) (err error) {
b := packet.EtherBufferPool.Get().(*[packet.EthMaxSize]byte)
defer packet.EtherBufferPool.Put(b)
ether := packet.Ether(b[0:])
ether = packet.EncodeEther(ether, syscall.ETH_P_IP, srcAddr.MAC, dstAddr.MAC)
ip4 := packet.EncodeIP4(ether.Payload(), 50, srcAddr.IP, dstAddr.IP)
udp := packet.EncodeUDP(ip4.Payload(), srcAddr.Port, dstAddr.Port)
udp, err = udp.AppendPayload(p)
if err != nil {
return err
}
ip4 = ip4.SetPayload(udp, syscall.IPPROTO_UDP)
if ether, err = ether.SetPayload(ip4); err != nil {
return err
}
if _, err := conn.WriteTo(ether, &dstAddr); err != nil {
fmt.Println("icmp failed to write ", err)
return err
}
return nil
}