使用Scapy将数据写入pcap文件

7

我想在过滤掉所有的NBNS流量后将数据写入pcap文件中,但是这给了我一个语法错误。

from scapy.all import *

Capture = raw_input("Enter file path of pcap file: " )
pcap = rdpcap(Capture)

ports=137

filtered = (pkt for pkt in Capture if
    (UDP in pkt and 
    (pkt[UDP].sport in str(ports)))

wrpcap("filtered.pcap",filtered)

我发现语法错误的答案只是...str(ports))))末尾缺少一个括号,但现在我有一个不同的错误。
  File "receiver2.py", line 18, in <module>
    wrpcap("filtered.pcap",filtered)
  File "/usr/lib/python2.7/dist-packages/scapy/utils.py", 
    line 470, in wrpcap
  PcapWriter(filename, *args, **kargs).write(pkt)
  File "/usr/lib/python2.7/dist-packages/scapy/utils.py", line 652, in write
    for p in pkt:
  File "receiver2.py", line 13, in <genexpr>
    (UDP in pkt and 
  TypeError: 'in <string>' requires string as left operand, not Packet_metaclass
2个回答

8

我试着使用你的脚本,但是按照原来的方式无法使其运行。我稍微修改了一下,现在应该能够满足你的需求了。希望这有所帮助。

from scapy.all import *

capture = raw_input("Enter file path of pcap file: " )
pcap = rdpcap(capture)

ports=137

def write(pkt):
    wrpcap('filtered.pcap', pkt, append=True)  #appends packet to output file

for pkt in pcap:
    if pkt.haslayer(UDP) and pkt.getlayer(UDP).sport == ports:  #checks for UDP layer and sport 137
        write(pkt)  #sends the packet to be written if it meets criteria
    else:
        pass

谢谢!这对我编写自定义数据包到类似于packet = Ether()/IP(src=src, dst=dst)/TCP(sport=sport, dport=dport, flags='A')/payload的pcap文件有所帮助。(换行) wrpcap(out_fname, packet, append=True) - Luc

0

pkt[UDP].sport 通常应该是整数而不是字符串。 str(ports) 应该替换为 ports

我正在使用 scapy v3.x。如果你还有问题,请尝试使用 scapy 3.x(pip install scapy-python3),我可以跟进和你一起解决问题。在这段代码示例中,从 python2 到 python3 所需的唯一更改是将 raw_input 替换为 input。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接