Skip to content

Instantly share code, notes, and snippets.

@superchausette
Last active June 17, 2018 18:33
Show Gist options
  • Save superchausette/e1aa5640b12c332cd887 to your computer and use it in GitHub Desktop.
Save superchausette/e1aa5640b12c332cd887 to your computer and use it in GitHub Desktop.
Test with PacketListField and pdfdump in scapy
#!/usr/bin/env python
from scapy.packet import Packet, bind_layers
from scapy.fields import FieldLenField, PacketListField
from scapy.fields import IntField,XByteField, ShortField
from scapy.fields import ByteEnumField
from scapy.plist import PacketList
class CarHeader(Packet):
name = "Car"
fields_desc = [ByteEnumField('type',0x1,{0x1:'Freight',0x2:'Passenger'})]
def extract_padding(self, p):
return p,""
class FreightCar(Packet):
name = "Freight Car"
fields_desc = [ ByteEnumField('type',0x1,{0x1:'Wheat',0x2:'Floor'}),
IntField('qty', 2)]
def extract_padding(self,p):
return "",p
class PassengerCar(Packet):
name = "Passenger Car"
fields_desc = [ByteEnumField('class',0x1,{0x1:'First Class',0x2:'Second Class'})]
def extract_padding(self,p):
return "",p
class Train(Packet):
name = "Train"
fields_desc = [
ShortField("length", None),
IntField("ID",-1),
PacketListField('cars', None, CarHeader, count_from = None,
length_from = lambda pkt: pkt.length-6)
]
# bind stuff
bind_layers(Train,CarHeader)
bind_layers(CarHeader,FreightCar, {'type': 1})
bind_layers(CarHeader,PassengerCar, {'type': 2})
def test_FreightCar():
pktF = "\1\1\00\00\01\00"
testF = CarHeader(pktF)
pktP = "\2\1"
testP = CarHeader(pktP)
tests = PacketList([testF,testP])
print "Freight ================="
testP.show()
print "Passenger ==============="
testF.show()
tests.psdump(layer_shift=1)
#test_FreightCar()
train_pkt1 = "\00\x18"+"\x00\x00\x00\x01" # Train (6)
train_pkt1 += "\x02\x01" # PassengerCar 1st (+2)
train_pkt1 += "\x02\x02" # PassengerCar 2nd (+2)
train_pkt1 += "\x02\x02" # PassengerCar 2nd (+2)
train_pkt1 += "\x01\x01\x00\x00\x01\x00" # Freight car with 256 wheat (+6)
train_pkt1 += "\x01\x02\x00\x00\x00\x10" # Freight car with 16 floor (+6)
train = Train(train_pkt1)
train.show()
train.psdump(layer_shift=1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment