def get_packet(self): selected_transport_layer = self.combo_box_transport.currentIndex() packet = Packet() eth_layer = {} eth_layer["LayerType"] = "Ethernet" eth_layer["Source MAC"] = str(self.line_edit_source_mac.text()) eth_layer["Destination MAC"] = str(self.line_edit_destination_mac.text()) eth_layer["Type"] = 8 ip_layer = {} ip_layer["LayerType"] = "IP" ip_layer["Source Address"] = str(self.line_edit_source_ip.text()) ip_layer["Destination Address"] = str(self.line_edit_destination_ip.text()) ip_layer["TTL"] = self.spin_box_ttl.value() ip_layer["Version"] = 4 transport_layer = {} if selected_transport_layer == 0: ip_layer["Protocol"] = 6 transport_layer["LayerType"] = "TCP" transport_layer["Source port"] = self.spin_box_tcp_source_port.value() transport_layer["Destination port"] = self.spin_box_tcp_destination_port.value() transport_layer["Sequence"] = self.spin_box_tcp_sequence.value() transport_layer["Acknowledgement"] = self.spin_box_tcp_acknowledgement.value() transport_layer["Data"] = str(self.line_edit_tcp_data.text()) elif selected_transport_layer == 1: ip_layer["Protocol"] = 1 transport_layer["LayerType"] = "ICMP" transport_layer["Type"] = self.spin_box_icmp_type.value() transport_layer["Code"] = self.spin_box_icmp_code.value() transport_layer["Data"] = str(self.line_edit_icmp_data.text()) else: ip_layer["Protocol"] = 17 transport_layer["LayerType"] = "UDP" transport_layer["Source port"] = self.spin_box_udp_source_port.value() transport_layer["Destination port"] = self.spin_box_udp_destination_port.value() transport_layer["Data"] = str(self.line_edit_udp_data.text()) packet.add_layer(eth_layer) packet.add_layer(ip_layer) packet.add_layer(transport_layer) return packet
def parse(self): if self._file is None: print "Error : PcapReader : Open a file before using parse" return if self._packets: self._packets[:] = [] # Parsing du fichier via dpkt pcap = dpkt.pcap.Reader(self._file) for ts, buf in pcap: # Parsing des donnees du paquet eth = dpkt.ethernet.Ethernet(buf) # On ne traite que les paquets IP if eth.type != dpkt.ethernet.ETH_TYPE_IP: continue packet = Packet(buf) # Recuperation des donnees de la couche ethernet eth_layer = {} eth_layer['LayerType'] = "Ethernet" # Un header ethernet fait 14 bytes (2 * 6 bytes d'addresses MAC + l'ethertype ou la taille du payload (2 bytes)) eth_layer['Header length'] = 14 eth_layer['Type'] = socket.ntohs(eth.type) eth_layer['Destination MAC'] = network_utils.eth_addr(eth.dst) eth_layer['Source MAC'] = network_utils.eth_addr(eth.src) packet.add_layer(eth_layer) ip = eth.data ip_layer = {} # Recuperation des donnees de la couche ip ip_layer['LayerType'] = 'IP' ip_layer['Version'] = ip.v ip_layer['Header length'] = ip.hl ip_layer['TTL'] = ip.ttl ip_layer['Protocol'] = ip.p # on converti les adresses IP binaire en leur notation string ip_layer['Source Address'] = socket.inet_ntop(socket.AF_INET, ip.src) ip_layer['Destination Address'] = socket.inet_ntop(socket.AF_INET, ip.dst) # On rajoute la couche IP recuperee au paquet packet.add_layer(ip_layer) # TCP protocol if ip.p == dpkt.ip.IP_PROTO_TCP: tcp = ip.data # Recuperation des donnees de la couche TCP tcp_layer = {} tcp_layer['LayerType'] = 'TCP' tcp_layer['Source port'] = tcp.sport tcp_layer['Destination port'] = tcp.dport tcp_layer['Sequence'] = tcp.seq tcp_layer['Acknowledgement'] = tcp.ack tcp_layer['Header length'] = tcp.off tcp_layer['Data'] = tcp.data # On rajoute la couche TCP recuperee au paquet packet.add_layer(tcp_layer) # ICMP protocol elif ip.p == dpkt.ip.IP_PROTO_ICMP: icmp = ip.data # Recuperation des donnees de la couche ICMP icmp_layer = {} icmp_layer['LayerType'] = 'ICMP' icmp_layer['Type'] = icmp.type icmp_layer['Code'] = icmp.code icmp_layer['Checksum'] = icmp.sum icmp_layer['Data'] = icmp.data # On rajoute la couche ICMP recuperee au paquet packet.add_layer(icmp_layer) # UDP protocol elif ip.p == dpkt.ip.IP_PROTO_UDP: udp = ip.data # Recuperation des donnees de la couche UDP udp_layer = {} udp_layer['LayerType'] = 'UDP' udp_layer['Source port'] = udp.sport udp_layer['Destination port'] = udp.dport udp_layer['Length'] = udp.ulen udp_layer['Checksum'] = udp.sum udp_layer['Data'] = udp.data # On rajoute la couche UDP recuperee au paquet packet.add_layer(udp_layer) self._packets.append(packet) self.close_file()