Guest User

hva_pckt.py

a guest
Jun 11th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.34 KB | None | 0 0
  1. #/usr/bin/env python3
  2. # Packet decoder
  3. import struct
  4.  
  5. class MacAddress:
  6.     def __init__(self, data):
  7.         if isinstance(data, bytes):
  8.             assert len(data) == 6
  9.             self.data = data
  10.         elif isinstance(data, str):
  11.             assert len(data) == 17
  12.             self.data = struct.pack('!BBBBBB', *[ int(i, 16) for i in data.split(':')])
  13.         else:
  14.             assert False, repr(data)
  15.  
  16.     def __str__(self):
  17.         # Note: type(b) == int
  18.         return ':'.join([ '{0:02x}'.format(b) for b in self.data ])
  19.  
  20. class IpAddress:
  21.     def __init__(self, data):
  22.         if isinstance(data, bytes):
  23.             assert len(data) == 4, repr(data)
  24.             self.data = data
  25.         elif isinstance(data, str):
  26.             assert 7 <= len(data) <= 15
  27.             self.data = struct.pack('!BBBB', *[ int(i) for i in data.split('.')])
  28.         elif isinstance(data, int):
  29.             self.data = struct.pack('!I', data)
  30.         else:
  31.             assert False, repr(data)
  32.  
  33.     def __str__(self):
  34.         # Note: type(b) == int
  35. #       print('DEBUG: IpAddress::__str__', self.data)
  36.         return '.'.join([ '{0:d}'.format(b) for b in self.data ])
  37.  
  38.     def __int__(self):
  39.         return struct.unpack('!I', self.data)[0]
  40.  
  41.     def __lt__(self, other):
  42.         return self.data < other.data
  43.  
  44.     def __eq__(self, other):
  45.         return self.data == other.data
  46.  
  47.     def __le__(self, other):
  48.         return self.data <= other.data
  49.  
  50. class IpPort:
  51.     pass # TODO
  52.  
  53. class Eth:
  54.     @classmethod
  55.     def decode(cls, data):
  56.         self = Eth()
  57.         _eth = struct.unpack('!6s6sH', data[:14])
  58.         if len(_eth) != 3:
  59.             raise Exception('Eth: unable to decode {}'.format(repr(data[:14])))
  60.         self.smac = MacAddress(_eth[0])
  61.         self.dmac = MacAddress(_eth[1])
  62.         self.typ = _eth[2]
  63.         self.pl = data[14:]
  64.         if self.typ not in [ 0x0800 ]: return None
  65.         return self
  66.  
  67.     def __str__(self):
  68.         return '<Eth smac=%s, dmac=%s, typ=%04x, len=%d>'%(self.smac, self.dmac, self.typ, len(self.pl))
  69.  
  70.  
  71. class Ip:
  72.     kProto_TCP = 0x06 #  6
  73.     kProto_UDP = 0x11 # 17
  74.     @classmethod
  75.     def decode(cls, data):
  76.         self = Ip()
  77.         _ip = struct.unpack('!BBHHHBBH4s4s', data[:20])
  78.         if len(_ip ) != 10:
  79.             raise Exception('Ip: unable to decode {}'.format(repr(data[:20])))
  80.         self.vrs = (_ip[0] >> 4) & 0x0F
  81.         self.hdrlen = ((_ip[0] >> 0) & 0x0F) * 4
  82.         self.dscp = (_ip[1] >> 0) & 0x3F
  83.         self.ecn = (_ip[1] >> 6)& 0x03
  84.         self.pcklen = _ip[2]
  85.         self.id = _ip[3]
  86.         self.flags = (_ip[4] >> 13) & 0x07
  87.         self.frgoff = _ip[4] & 0x1FFF
  88.         self.ttl = _ip[5]
  89.         self.proto = _ip[6]
  90.         self.hdrcksm = _ip[7]
  91.         self.saddr = IpAddress(_ip[ 8])
  92.         self.daddr = IpAddress(_ip[ 9])
  93.         self.opts = data[20:self.hdrlen-20]
  94.         self.pl = data[self.hdrlen:]
  95.         if self.vrs != 4: return None
  96.         return self
  97.  
  98.     def __str__(self):
  99.         return '<Ip vrs=%d, hdrlen=%d, dscp=0x%02x, ecn=0x%1x, pcklen=%d, id=%d, flags=0x%1x, frgoff=%d, ttl=%d, proto=%d, hdrcksm=%d, saddr=%s, daddr=%s, optlen=%d, len=%d>'%(
  100.                 self.vrs, self.hdrlen, self.dscp, self.ecn, self.pcklen,
  101.                 self.id, self.flags, self.frgoff,
  102.                 self.ttl, self.proto, self.hdrcksm,
  103.                 self.saddr, self.daddr, len(self.opts), len(self.pl))
  104.  
  105.  
  106. class Tcp:
  107.     kFlags_FIN = 0x001
  108.     kFlags_SYN = 0x002
  109.     kFlags_RST = 0x008
  110.     kFlags_PSH = 0x008
  111.     kFlags_ACK = 0x010
  112.     kFlags_URG = 0x020
  113.     kFlags_ECE = 0x040
  114.     kFlags_CWR = 0x080
  115.     kFlags_NS  = 0x180
  116.     @classmethod
  117.     def decode(cls, data):
  118.         self = Tcp()
  119.         _tcp = struct.unpack('!HHIIHHHH', data[:20])
  120.         if len(_tcp ) != 8:
  121.             raise Exception('Tcp: unable to decode {}'.format(repr(data[:20])))
  122.         self.sport = _tcp[0]
  123.         self.dport = _tcp[1]
  124.         self.seq =_tcp[2]
  125.         self.ack =_tcp[3]
  126.         self.hdrlen = ((_tcp[4] >> 12) & 0x000F) * 4    # Todo Check
  127.         self.flags = _tcp[4] & 0x01FF                    # Todo Check
  128.         self.winsiz = _tcp[5]
  129.         self.cksm = _tcp[6]
  130.         self.urg = _tcp[7]
  131.         self.opts = data[20:self.hdrlen]
  132.         self.pl = data[self.hdrlen:]
  133.         return self
  134.  
  135.     def __str__(self):
  136.         return '<Tcp sport=%d, dport=%d, seq=%d, ack=%d, hdrlen=%d, flags=0x%03x, winsiz=%d, cksm=%d, urg=%d, optlen=%d, len=%d>'%(
  137.                 self.sport, self.dport,
  138.                 self.seq, self.ack, self.hdrlen, self.flags,
  139.                 self.winsiz, self.cksm, self.urg,
  140.                 len(self.opts), len(self.pl))
  141.  
  142.  
  143. class Udp:
  144.     pass # TODO
  145.  
  146.  
  147. if __name__ == '__main__':
  148.     import hva_pcap as pcap
  149.  
  150.     rdr = pcap.open_offline('xsupport.pcap')
  151.     i = 0
  152.     for hdr, data in rdr:
  153.         if i ==2:
  154.  
  155.             print(hdr)
  156.             eth = Eth.decode(data)
  157.             if eth is None: continue
  158.             print(str(eth))
  159.             ip = Ip.decode(eth.pl)
  160.             if ip is None: continue
  161.             print(str(ip))
  162.             tcp = Tcp.decode(ip.pl)
  163.             if tcp is None: continue
  164.             print(str(tcp))
  165.             print((repr(tcp.flags) + " - " + repr(tcp.kFlags_FIN) + " * " + repr(tcp.kFlags_ACK)))
  166.             # break
  167.  
  168.         if i ==4:
  169.             break
  170.         i = i + 1
Add Comment
Please, Sign In to add comment