2

How can I add custom fields like IP and UDP headers in python in the SOCK_RAW format?I want to have a custom field in the packet and use that field in computation.

3
  • What do you mean by the SOCK_RAW format? Commented Feb 24, 2013 at 6:45
  • If you're planning to mess around the IP format, you need to change everything --- from the OSes to all the routers on the route. For UDP, I'm not sure, but I think you need to as well. Why not take the safe solution and add your field inside the UDP data? Commented Feb 24, 2013 at 9:16
  • I was talking about the raw type socket. And building the packet from scratch and editing the header fields. Thanks Mike and Rigo Commented Feb 24, 2013 at 16:42

1 Answer 1

4

You didn't specify where you want that custom field. This example lets you build the UDP header at will (at least on Linux - there might be OS-dependent behaviour):

from socket import *
import struct
s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
data = 'string'
sport = 4711    # arbitrary source port
dport = 45134   # arbitrary destination port
length = 8+len(data);
checksum = 0
udp_header = struct.pack('!HHHH', sport, dport, length, checksum)
s.sendto(udp_header+data, ('', 0));

Tested with:

# socat -u UDP:localhost:4711 - &
# netstat -up
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 localhost:45134         localhost:4711          ESTABLISHED 2663/socat      
# tcpdump -ilo -vv -x
11:32:07.409163 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 34)
localhost.4711 > localhost.45134: [no cksum] UDP, length 6
    0x0000:  4500 0022 0000 4000 4011 3cc9 7f00 0001
    0x0010:  7f00 0001 1267 b04e 000e 0000 7374 7269
    0x0020:  6e67
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.