2016-05-09 2 views
0

Я пытаюсь понять, как добавить пользовательский диссектор в Scapy. Я использую Python 3.4 и Scapy3, если это имеет какое-либо отношение к результату.Scapy: Как получить доступ к пользовательскому слою

У меня есть глупый класс, а команда package.show2() правильно отображает вложенный пакет. Но я не могу получить доступ к новым значениям полей Layers.

Scary класса и bind_layer следует ...

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) 

я сделать пакет как этот

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

Глядя на Пакета я создал с помощью LS урожаи

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'') 

И отобразите его с помощью Show2, все это выглядит хорошо

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 

теперь я хочу, чтобы получить доступ к DUMBO слоя полей

Но ПАКЕТ [DUMBO] .ears

не правильно - как пакет, когда отображается как pack.show() по-прежнему имеет Полезная нагрузка как сырье ....

Что мне недостает?

ответ

0

Ok - Это мое решение ....

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)) 

Если кто-то может улучшить на этом я был бы счастлив, увидев решение.

Смежные вопросы