Ich füge Scapy ein neues Protokoll hinzu und habe Schwierigkeiten mit einem konkreten Feld. Dieses Feld gibt die Länge einer Paketnutzlast an. Das Feld kann 1, 2, 3 oder 4 Byte lang sein, abhängig von der Länge der Nutzlast. Darüber hinaus ist es codiert. Die Art, wie ich herausgefunden habe, ob die Größe des Feldes 1, 2, 3 oder 4 Bytes ist, nimmt das erste Byte des Wertes und wenn es kleiner als 127 ist, wird das Feld durch 1 Byte dargestellt, wenn es größer als ist 127 und weniger als x wird durch 2 Bytes usw. dargestellt (dies liegt an dem Kodieralgorithmus).Scapy - Hinzufügen eines neuen Feldes mit einer dynamischen Länge
So ist das Problem, dass ich diese Feldlänge nicht dynamisch basierend auf dem Wert des ersten Bytes definieren kann. Das erste, was ich versuchte, ist dieses Problem mit ConditionalFields
zu behandeln, aber das fühlt sich an wie der falsche Weg.
ConditionalField(ByteField("length",1), lambda pkt:pkt.length <= 127),
ConditionalField(ShortField("length",None), lambda pkt:pkt.length > 127),]
ich glaube, die Lösung ein neues scapy Feld zu definieren ist, aber ich weiß nicht, wie das erste Byte für den Zugriff auf und die Setup-Länge auf dieser Grundlage. Jeder Vorschlag wird geschätzt. Danke im Voraus.
Dekodierungsalgorithmus:
def test(encoded_byte):
if((encoded_byte & 128) != 0):
return True
else:
return False
def decoding(bytes):
multiplier = 1
value = 0
offset = 0
condition = True
while condition:
encoded_byte = bytes[offset]
value += (encoded_byte & 127) * multiplier
multiplier *= 128
if multiplier > 128 ** 3:
raise Exception('Malformed Remaining Length')
offset += 1
condition = test(encoded_byte)
return value
Haben Sie Code, den Sie präsentieren möchten? –
Es gibt die Bedingungsfelder und den Decodierungsalgorithmus, den ich für den Wert des Feldes programmiert habe – somarhs