diff --git a/src/packet/BOOTP.py b/src/packet/BOOTP.py index 805562bf35f3aa5beb3f7d8ebc294c0007d3b4ce..075697b5efabeb72d3ffe750ffe464fb4b880db7 100644 --- a/src/packet/BOOTP.py +++ b/src/packet/BOOTP.py @@ -91,7 +91,7 @@ class BOOTP(Packet): self.set_dhcp_option(field, new_value) # Set new value for field # Update checksums - self.update_checksums() + self.update_fields() # Return value: dictionary containing tweak information return self.get_dict_log(field, old_value, new_value) diff --git a/src/packet/CoAP.py b/src/packet/CoAP.py index 9d79806abd578c06d9c999a900734f3e768928ab..1d1d9e0b231d6f30634cf8de78fd949437d25f3c 100644 --- a/src/packet/CoAP.py +++ b/src/packet/CoAP.py @@ -101,7 +101,7 @@ class CoAP(Packet): self.layer.setfieldval("options", result["new_options"]) # Update checksums - self.update_checksums() + self.update_fields() # Return value: dictionary containing tweak information return self.get_dict_log(field, old_value, new_value) diff --git a/src/packet/DNS.py b/src/packet/DNS.py index 7b2de66ab943bdca163ed71d4c025a6bf92d0e98..6e9d750cb4a44c6f4f61506b874462d0ff976dda 100644 --- a/src/packet/DNS.py +++ b/src/packet/DNS.py @@ -110,7 +110,7 @@ class DNS(Packet): question_record.setfieldval("qname", new_value_single) # Update checksums - self.update_checksums() + self.update_fields() # Return value: dictionary containing tweak information return self.get_dict_log(field, old_value, new_value) diff --git a/src/packet/IGMPv3mr.py b/src/packet/IGMPv3mr.py index 2015bf3f6b2a061064c52c26ac609c3f04913bf6..2f1cfc019dd99a9e5e1954fbfc4f6df78c6c22b9 100644 --- a/src/packet/IGMPv3mr.py +++ b/src/packet/IGMPv3mr.py @@ -33,14 +33,9 @@ class IGMPv3mr(Packet): new_value += new_address group.setfieldval("maddr", new_address) i += 1 - - logging.info(f"Packet {self.id}: randomized all IGMPv3 group addresses.") # Update checksums - del self.packet.getlayer("IGMPv3").chksum - del self.packet.getlayer("IP").len - del self.packet.getlayer("IP").chksum - self.packet = scapy.Ether(self.packet.build()) + self.update_fields() # Return value: dictionary containing tweak information return self.get_dict_log("maddr", old_value, new_value) diff --git a/src/packet/Packet.py b/src/packet/Packet.py index 9c60a96c7ecbee8eb20abd0e91e1897ff498fcfc..d739cff576eda2160db4aab77e09b9f3442015a6 100644 --- a/src/packet/Packet.py +++ b/src/packet/Packet.py @@ -194,19 +194,29 @@ class Packet: self.packet.time = timestamp - def update_checksums(self) -> None: + def update_fields(self) -> None: """ - Update packet checksums, if needed. + Update checksum and length fields on all relevant layers, + and rebuild packet. """ - if self.packet.haslayer("IP"): - ip_layer = self.packet.getlayer("IP") - ip_layer.delfieldval("len") - ip_layer.delfieldval("chksum") - transport_layer = self.packet.getlayer(2) - if hasattr(transport_layer, "len"): - transport_layer.delfieldval("len") - if hasattr(transport_layer, "chksum"): - transport_layer.delfieldval("chksum") + # Loop on all packet layers + i = 0 + while True: + layer = self.packet.getlayer(i) + if layer is None: + break + + # Delete checksum field + if hasattr(layer, "chksum") and layer.getfieldval("chksum") is not None: + layer.delfieldval("chksum") + + # Delete length field + if hasattr(layer, "len") and layer.getfieldval("len") is not None: + layer.delfieldval("len") + + i += 1 + + # Rebuild packet, to update deleted fields self.rebuild() @@ -305,7 +315,7 @@ class Packet: self.layer.setfieldval(field, new_value) # Update checksums - self.update_checksums() + self.update_fields() # Return value: dictionary containing tweak information return self.get_dict_log(field, old_value, new_value) diff --git a/src/packet/Transport.py b/src/packet/Transport.py index 9109baca31060a1f57382fad35ef4856181c4322..433d82c73f08d4d5d7b648f64bba19e3381f5be2 100644 --- a/src/packet/Transport.py +++ b/src/packet/Transport.py @@ -50,7 +50,7 @@ class Transport(Packet): self.layer.setfieldval(field, new_value) # Update checksums, if needed - self.update_checksums() + self.update_fields() # Return value: dictionary containing tweak information return self.get_dict_log(field, old_value, new_value)