2016-05-09 13 views
0

Ich versuche zu verstehen, wie Sie einen benutzerdefinierten Dissektor in Scapy hinzufügen. Ich verwende Python 3.4 und Scapy3, wenn das Auswirkungen auf das Ergebnis hat.Scapy: Zugriff auf eine benutzerdefinierte Ebene

Ich habe eine dumme Klasse, und der packet.show2() Befehl rendert korrekt das verschachtelte Paket. Aber ich kann nicht auf die neuen Feldwerte für Ebenen zugreifen.

Scary Klasse und bind_layer folgt ...

from scapy.all import * 
#Create simple Class 
class DUMBO(Packet): 
    fields_desc = [ 
     ShortField('ears',0), 
     ShortField('legs',0), 
     ShortField('trunk',0) 
    ] 
#Inform TCP that ports 9898 are this protocol 
bind_layers(TCP, DUMBO, sport=9898, dport=9898) 

Ich mache ein Paket wie dieses

#Make a Packet 
pack=IP()/TCP(sport=9898, dport=9898)/Raw(load=b'\x00\x02\x00\x04\x00\x01') 

im Packet Suche ich geschaffen habe ls Erträge

version : BitField    = 4    (4) 
ihl  : BitField    = None   (None) 
tos  : XByteField   = 0    (0) 
len  : ShortField   = None   (None) 
id   : ShortField   = 1    (1) 
flags  : FlagsField   = 0    (0) 
frag  : BitField    = 0    (0) 
ttl  : ByteField   = 64    (64) 
proto  : ByteEnumField  = 6    (0) 
chksum  : XShortField   = None   (None) 
src  : Emph     = '127.0.0.1'  (None) 
dst  : Emph     = '127.0.0.1'  ('127.0.0.1') 
options : PacketListField  = []    ([]) 
-- 
sport  : ShortEnumField  = 9898   (20) 
dport  : ShortEnumField  = 9898   (80) 
seq  : IntField    = 0    (0) 
ack  : IntField    = 0    (0) 
dataofs : BitField    = None   (None) 
reserved : BitField    = 0    (0) 
flags  : FlagsField   = 2    (2) 
window  : ShortField   = 8192   (8192) 
chksum  : XShortField   = None   (None) 
urgptr  : ShortField   = 0    (0) 
options : TCPOptionsField  = {}    ({}) 
-- 
load  : StrField    = b'\x00\x02\x00\x04\x00\x01' (b'') 

mit und Anzeige mit Show2 alles sieht gut aus

pack.show2() 


###[ IP ]### 
    version = 4 
    ihl  = 5 
    tos  = 0x0 
    len  = 46 
    id  = 1 
    flags  = 
    frag  = 0 
    ttl  = 64 
    proto  = tcp 
    chksum = 0x7cc7 
    src  = 127.0.0.1 
    dst  = 127.0.0.1 
    \options \ 
###[ TCP ]### 
    sport  = monkeycom 
    dport  = monkeycom 
    seq  = 0 
    ack  = 0 
    dataofs = 5 
    reserved = 0 
    flags  = S 
    window = 8192 
    chksum = 0x447f 
    urgptr = 0 
    options = [] 
###[ DUMBO ]### 
     ears  = 2 
     legs  = 4 
     trunk  = 1 

ich jetzt die DUMBO Schichtfelder

Aber PACK [DUMBO] .ears

Ist das nicht richtig zugreifen wollen - wie das Paket, wenn sie als pack.show angezeigt() noch die Payload as Raw ....

Was fehlt mir?

Antwort

0

Ok - Das ist meine Lösung ....

pack=IP()/TCP(sport=19898, dport=19898)/Raw(load=b'\x00\x02\x00\x04\x00\x01') 

    #Cast this packet back 
    pack=IP(bytes(pack)) 
    pack.show2() 
    pack.show() 
    if DUMBO in pack: 
     print('Elephant in the house') 
     print('Ears -> {}'.format(pack[DUMBO].ears)) 

Wenn jemand auf diese verbessern kann ich beim Anblick der Lösung zufrieden sein würde.