簡體   English   中英

Scapy:如何訪問自定義層

[英]Scapy: How to access a Custom Layer

我試圖了解如何在 Scapy 中添加自定義解剖器。 如果這對結果有任何影響,我正在使用 Python 3.4 和 Scapy3。

我有一個愚蠢的 class,並且packet.show2()命令正確呈現嵌套數據包。 但我無法訪問新的圖層字段值。

可怕的 Class 和 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 yield 創建的數據包

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層字段

但是 PACK[DUMBO].ears

不正確 - 因為顯示為 pack.show() 的數據包仍然具有原始有效負載...。

我錯過了什么??

好的-這是我的解決方案。

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

如果任何人都可以對此進行改進,那么我很高興看到解決方案。

注意:我剛剛開始使用 Scapy,所以我不能 promise 這是 go 的正確/唯一方法。

根據文檔:向 Scapy 添加新協議,將帶有協議定義的代碼放在單獨的 python 文件中。 確保您還設置了所需的標題。 然后將該文件放在scapy/layersscapy/contrib中。

之后,可以在您計划使用它的地方使用load_layer(...)load_contrib(...)加載協議。

對於 DUMBO,我們將 go 和contrib

dumbo.py

# scapy.contrib.description = Dumbo the elephant
# scapy.contrib.status = loads

from scapy.packet import Packet, bind_layers
from scapy.fields import ShortField
from scapy.layers.inet import TCP

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

現在讓我們使用它:

$ scapy
>>> load_contrib("dumbo")
>>> pack1=IP()/TCP(sport=9898, dport=9898)/DUMBO(b'\x00\x02\x00\x04\x00\x01')
>>> pack2=IP()/TCP(sport=9898, dport=9898)/DUMBO(ears=2, legs=4, trunk=1)
>>> pack1
<IP  frag=0 proto=tcp |<TCP  sport=9898 dport=9898 |<DUMBO  ears=2 legs=4 trunk=1 |>>>
>>> pack2
<IP  frag=0 proto=tcp |<TCP  sport=9898 dport=9898 |<DUMBO  ears=2 legs=4 trunk=1 |>>>
>>> pack1[DUMBO].ears
2
>>> pack2[DUMBO].ears
2

希望這對偶然發現這個問題的人有所幫助。


使用的版本:Python v3.8.5; Scapy v2.4.5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM