Last active
June 17, 2018 18:33
-
-
Save superchausette/e1aa5640b12c332cd887 to your computer and use it in GitHub Desktop.
Test with PacketListField and pdfdump in scapy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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