ip.py 921 B

123456789101112131415161718192021222324252627
  1. import struct
  2. def ip_unpack(data):
  3. vihl, tos, total_len, identification, flags_offset, TTL, proto, header_checksum, s_ip, d_ip = struct.unpack('! B B H H H B B H 4s 4s', data[:20])
  4. version = vihl>>4
  5. header_len = vihl & 15
  6. #Extracting x_bit, Do Not Fragment Flag and More Fragments Follow Flag.
  7. x_bit = (flags_offset >> 15) & 1
  8. DFF = (flags_offset >> 14) & 1
  9. MFF = (flags_offset >> 13) & 1
  10. #Extracting Fragment Offset
  11. frag_offset = flags_offset & 8191
  12. return version, header_len, tos, total_len, identification, x_bit, DFF, MFF, frag_offset, TTL, proto, header_checksum , getip(s_ip), getip(d_ip), data[20:]
  13. def getip(ip_bytes):
  14. return '.'.join(map(str, ip_bytes))
  15. def icmp_unpack(data):
  16. icmp_type, icmp_code, icmp_checksum = struct.unpack('! B B H', data[:4])
  17. return icmp_type, icmp_code, icmp_checksum, data[8:]