10

如何获取 scapy 中所有图层的列表?例如:Ether/IP/UDP/DNSEther/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 回答
1

packet.payload.layers()得到了数据包的层类列表。然后我可以访问数据包层,例如:


def sniff_callback(packet):
    print(packet.payload.layers())  # display all layers
    first_layer = packet[packet.payload.layers()[0]]  # access first layer of the list

于 2021-03-03T10:55:24.513 回答