====== Erstellung eines eigenen Protokoll-Layers in Scapy ====== Es lassen sich relativ einfach [[https://scapy.readthedocs.io/en/latest/build_dissect.html|eigene Protokolle in Scapy nachbauen]]. Dazu wird einfach eine Klasse erstellt, die von ''Packet'' erbt: class MY_PROTO(Packet): name = 'Protocol Example' fields_desc = [ BitField('field1', 0, 1), # 1 Bit, initialized to 0 BitField('field2', 3, 7), # 7 Bit, initialized to 3 LEShortField('count_1', 0), # 2-Byte - LittleEndian ShortField('count_2'), # 2-Byte - BigEndian ] :!: Mit Scapy gebaute Pakete sind byte-aligned, d.h. alle Bitfelder müssen am Ende ein volles Byte ergeben. [[https://stackoverflow.com/questions/7897522/building-scapy-packets-with-packetfields-shorter-than-8-bits/7908728#7908728|Notfalls muss ein Padding eingefügt werden]]! ==== Längenangaben im Paket ==== * https://stackoverflow.com/questions/9416751/working-with-lenfields-in-scapy * https://stackoverflow.com/questions/33037605/scapy-update-field-after-building-with-post-build-function * https://stackoverflow.com/questions/27163340/scapy-variable-length-fields ==== Stuff ==== * https://stackoverflow.com/questions/64059638/scapy-how-to-skip-bytes-when-dissecting-a-packet * Um das neue Protokoll mit dem darunter liegenden Layer zu verknüpfen benutzt man ''bind_layers()''. Dabei ist es wichtig alle Änderungen zur gleichen Zeit vorzunehmen und ''bind_layers()'' nur einmal aufzurufen, z.B. so: ''bind_layers(UDP, MY_PROTO, dport=55555, sport=55555)'', anderenfalls werden teilweise die Felder wieder auf die Default-Werte zurückgesetzt.