Скажем, у меня есть пакет, содержащий поля, все значения которых являются шестнадцатеричными. Как я могу определить функцию, которая возвращает пакет, в котором все шестнадцатеричные значения полей в пакете инвертированы? Вот что у меня есть до сих пор:
def complementPacket(pkt):
'''
Function: complementPacket
Purpose: Takes a packet as an input and inverts all bits in the packet.
Return: Inverted packet of same structure as the input packet
'''
retPkt = pkt
while(pkt): # iterate through the packets
for field in pkt.fields_desc:
print(fmtToLen(field.fmt)) # converts scapy field.fmt to the number of bits for that field type
# invert bits, assign to retPkt
pkt = pkt.payload
return retPkt
Единственное решение, которое я могу придумать, - это перебрать пакет и создать новый пакет, взяв дополнение всех полей. Есть лучший способ сделать это?
Для пакета P с шестнадцатеричными (двоичными) значениями я хочу вернуть ~P.
Пример:
def customPacket(Packet):
name = "myPacket"
fields_desc = [XByteField("data", 1)]
pkt = customPacket()
pkt.show()
выведет, что значение 'data' равно 0x1
complementedPkt = complementPacket(pkt)
complementedPkt.show()
выведет, что значение 'data' равно 0xE
(0x1 = 0001, ~0001 = 1110, 1110 = 0xE)