gpt4 book ai didi

python - 使用 Python 修改 PCAP

转载 作者:太空宇宙 更新时间:2023-11-04 10:21:11 25 4
gpt4 key购买 nike

我需要读取一个 PCAP 文件,修改一些字段(实际上是 IPv4 源和目标以及以太网源和目标)。 PCAP 经过预过滤,仅包含 IPv4 over Ethernet 数据包。

到目前为止,我尝试使用 scapy 执行此操作,但是它存在严重的内存问题。读取 ~350MB PCAP 文件时,我的 16GB RAM 已完全填满。其实就是看书。我还没有对这个文件做任何其他事情。我也有found this answer ,有了这些变化,阅读速度非常快。一旦我开始修改数据包,内存就会再次膨胀。 Scapy 实际上在这种情况下是不可用的

我也想过用tcprewrite之类的其他工具,但是不能满足我的目的。每个数据包的源 MAC 总是相同的,这也可以用 tcprewrite 来完成。源 IP 在给定的子网范围内应该是随机的,例如均匀分布在 10.0.0.0/16。不太容易。更复杂的是目标 IP,需要根据给定的流量矩阵进行计算。

所以问题是:如何读取 PCAP 文件,使用自定义函数修改四个基本字段(Ethernet src+dst、IP src+dst),然后将其写回(另一个)PCAP 文件?

实际上,我的框架的其余部分是用 Python 编写的,所以我更喜欢基于 Python 的解决方案。但是,因为我可以简单地调用其他脚本,所以这不是强制性的。谢谢!

最佳答案

正如您所说,Scapy 似乎有“严重的内存问题”,可能是因为您使用 rdpcap() 读取内存中的整个 PCAP 文件,然后对其进行修改(仍在内存中),然后将其写入使用 wrpcap() 立即从您的内存中返回到另一个文件。

但最“Pythonic”和“Scapyist”的方式来做这样的事情是使用生成器(PcapReaderPcapWriter)。这是一个例子:

from scapy.all import *

ETHER_ADDR_TRANSLATION = {
"orig_mac_1": "new_mac_1",
# [...]
}

IP_ADDR_TRANSLATION = {
"orig_ip_1": "new_ip_1",
# [...]
}

def addr_translation_pcap(source, destination):
out = PcapWriter(destination)
for pkt in PcapReader(source):
# In case we have complex encapsulations, like IP-in-IP, etc.,
# we have to do something like this. If we know for sure that's
# not the case, there's no need for such a (time-consuming) code.
layer = pkt
while not isinstance(layer, NoPayload):
if isinstance(layer, Ether):
for field in ['src', 'dst']:
fval = getattr(layer, field)
if fval in ETHER_ADDR_TRANSLATION:
setattr(layer, field, ETHER_ADDR_TRANSLATION[fval])
# Let's not forget IP-in-ICMP-error
elif isinstance(layer, (IP, IPerror)):
for field in ['src', 'dst']:
fval = getattr(layer, field)
if fval in IP_ADDR_TRANSLATION:
setattr(layer, field, IP_ADDR_TRANSLATION[fval])
elif isinstance(layer, ARP):
fields = {}
if layer.hwtype == 1:
fields.update({'hwsrc': ETHER_ADDR_TRANSLATION,
'hwdst': ETHER_ADDR_TRANSLATION})
if layer.ptype == 2048:
fields.update({'psrc': IP_ADDR_TRANSLATION,
'pdst': IP_ADDR_TRANSLATION})
for field, translator in fields.iteritems():
fval = getattr(layer, field)
if fval in translator:
setattr(layer, field, translator[fval])
layer = layer.payload
out.write(pkt)
out.close()

关于python - 使用 Python 修改 PCAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com