如何获得scapy中所有图层的列表?例如:Ether/IP/UDP/DNS或Ether/IP/TCP/HTTP.我唯一能想到的是做一个packet.summary()并解析输出,看起来很粗糙.我认为应该有一个内置的方法,但在文档中找不到任何方法.有什么建议?
我想要做的是迭代用户给出的特定协议的所有字段并显示其值.
更新:在wireshark中可以看到我正在寻找的内容:打开任何捕获,选择一个数据包,在"框架"菜单中,可以看到
Protocols in frame: eth:ip:udp:data
这正是我在Scapy中寻找的内容.我希望我现在更清楚了.
每个附加层都是数据包的有效负载,因此您可以进行迭代
def expand(x):
yield x
while x.payload:
x = x.payload
yield x
Run Code Online (Sandbox Code Playgroud)
然后
res = list(expand(packet))
Run Code Online (Sandbox Code Playgroud)
我希望这就是你的意思.
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)
Run Code Online (Sandbox Code Playgroud)
产出
Ethernet
ARP
Run Code Online (Sandbox Code Playgroud)
我查看了源代码,没有找到这样的方法,所以我对 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'
>>>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17359 次 |
| 最近记录: |