10

scapy のすべてのレイヤーのリストを取得するにはどうすればよいですか? 例:Ether/IP/UDP/DNSまたはEther/IP/TCP/HTTP. 私が考えることができる唯一のことはpacket.summary()、出力を実行して解析することですが、これは非常に粗雑に思えます。組み込みのメソッドが必要だと思いますが、ドキュメントには見つかりません。助言がありますか?

私がやろうとしているのは、ユーザーが指定した特定のプロトコルのすべてのフィールドを繰り返し処理し、その値を表示することです。

更新:私が探しているものはwiresharkで正確に見ることができます:キャプチャを開き、パケットを選択し、「フレーム」メニューで、 Protocols in frame: eth:ip:udp:data これがまさに私がScapyで探しているものです。私は今、私がより明確であることを願っています。

4

4 に答える 4

10

追加の各レイヤーはパケットのペイロードであるため、反復できます

def expand(x):
    yield x
    while x.payload:
        x = x.payload
        yield x

その後

res = list(expand(packet))

それがあなたの意図したことであることを願っています。

于 2012-11-25T10:11:37.903 に答える
9

packet.getLayer(<id>)ループで使用します。例えば:

from scapy.all import Ether

def get_packet_layers(packet):
    counter = 0
    while True:
        layer = packet.getlayer(counter)
        if layer is None:
            break

        yield layer
        counter += 1


packet = 'ffffffffffff00ffd59c64320806000108000604000100ffd59c6432000000000000000000000a000001'.decode('hex')
packet = Ether(_pkt=packet)

for layer in get_packet_layers(packet):
    print (layer.name)

出力

Ethernet
ARP
于 2012-11-25T12:24:11.197 に答える
4

ソースコードを調べたところ、そのようなメソッドが見つからなかったので、cronosのコードを少し変更したところ、今のように動作しているように見えます。

scapyのバグレポートを作成し、新しい方法を提案することができます。

>>> ip = Ether()/IP()/TCP()
>>> ip
<Ether  type=0x800 |<IP  frag=0 proto=tcp |<TCP  |>>>
>>> ip.name
'Ethernet'
>>> def expand(x):
...     yield x.name
...     while x.payload:
...         x = x.payload
...         yield x.name
... 
>>> list(expand(ip))
['Ethernet', 'IP', 'TCP']
>>> l=list(expand(ip))
>>> ":".join(l)
'Ethernet:IP:TCP'
>>> 
于 2012-11-25T11:55:22.123 に答える