首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从src/dst已更改的src/dst的pcap发送数据包

从src/dst已更改的src/dst的pcap发送数据包
EN

Stack Overflow用户
提问于 2012-01-04 20:29:03
回答 4查看 42K关注 0票数 23

我正在尝试发送一个以前记录的流量(以pcap格式捕获)。目前,我被困在剥离原始以太网层。流量是在另一台主机上捕获的,我基本上需要更改IP和以太网层src和dst。我设法替换IP层并重新计算校验和,但以太网层给我带来了麻烦。

有没有人有过从捕获文件重新发送数据包并对IP和以太网层(src和dst)应用更改的经验?此外,捕获是相当大的几Gb,在如此大的流量下性能如何?

EN

回答 4

Stack Overflow用户

发布于 2012-01-13 06:41:01

检查此示例

代码语言:javascript
复制
from scapy.all import *
from scapy.utils import rdpcap

pkts=rdpcap("FileName.pcap")  # could be used like this rdpcap("filename",500) fetches first 500 pkts
for pkt in pkts:
     pkt[Ether].src= new_src_mac  # i.e new_src_mac="00:11:22:33:44:55"
     pkt[Ether].dst= new_dst_mac
     pkt[IP].src= new_src_ip # i.e new_src_ip="255.255.255.255"
     pkt[IP].dst= new_dst_ip
     sendp(pkt) #sending packet at layer 2

评论:

  • 使用rdpcap,从pcap格式化文件中读取和写入packets
  • performance的方法
  • 您可以使用sniff(offline="filename")读取数据包,您可以使用类似于此sniff(offline="filename",prn=My_Function)的prn参数在这种情况下,My_Functions将应用于每个嗅探到的pkt
  • 写入您的新ip或mac的正确方法是将其视为字符串ex:ip="1.1.1.1"等,如上所述。
  • 示例: for循环中包含的sendp方法比创建其他循环发送wrpcap慢提示:在python中使用for循环太慢使用<代码>C14相反,如果你想要像C中的for循环这样的速度,如果读取时可用的内存为1.5 Gb,并且您正在读取的是2,3,.,则上面使用的Ref
  • the rdpcap会立即读取文件。
  • 如果性能问题对你很重要,你可以使用winpcap,但你必须用C编写更复杂的代码;使用python/

完成同样的任务很简单很简单,但它并不比c

  • 快它取决于所需的性能级别
  • 如果我的猜测是正确的,您正在发送视频流包在这种情况下,我将使用winpcap如果我发送的是1兆像素的视频,或者在其他情况下(较小的每帧大小)
  • 在使用C/winpcap的情况下,您将在读取pcaps、更改数据和重新发送时获得很好的性能,但您必须意识到相同的问题(大文件)您必须创建具有适当大小的缓冲器以将其用于读取发送相当大小( performance
  • if )中的分组。分组大小是恒定的(这在大多数情况下很少见,我猜)你可能有一个优势,那就是充分利用你的可用内存
  • 如果你想要使用python /

整个“项目/程序”,你可以用C/Wincap创建高性能的函数并编译成动态链接库,然后你可以把这个动态链接库导入到你的python程序中,你可以在一个python程序中使用它。这样,您就可以从非常简单的python/Scapy中获得好处,并且只需用c编写特定的函数,就可以更快地完成工作,并将代码集中在一起并具有可扩展性( maintainable )。

票数 32
EN

Stack Overflow用户

发布于 2014-01-23 20:10:26

如果我是您,我会让Scapy处理Ether层,并使用send()函数。例如:

代码语言:javascript
复制
ip_map = {"1.2.3.4": "10.0.0.1", "1.2.3.5": "10.0.0.2"}
for p in PcapReader("filename.cap"):
    if IP not in p:
        continue
    p = p[IP]
    # if you want to use a constant map, only let the following line
    p.src = "10.0.0.1"
    p.dst = "10.0.0.2"
    # if you want to use the original src/dst if you don't find it in ip_map
    p.src = ip_map.get(p.src, p.src)
    p.dst = ip_map.get(p.dst, p.dst)
    # if you want to drop the packet if you don't find both src and dst in ip_map
    if p.src not in ip_map or p.dst not in ip_map:
        continue
    p.src = ip_map[p.src]
    p.dst = ip_map[p.dst]
    # as suggested by @AliA, we need to let Scapy compute the correct checksum
    del(p.chksum)
    # then send the packet
    send(p)
票数 7
EN

Stack Overflow用户

发布于 2012-01-05 22:25:04

好的,我想出了以下几点(很抱歉我的Python)。希望它能帮助一些人。还有一种可能更简单的方案,其中来自pcap文件的所有数据包都被读取到内存中,但这可能会导致大型捕获文件出现问题。

代码语言:javascript
复制
from scapy.all import *
global src_ip, dst_ip
src_ip = 1.1.1.1
dst_ip = 2.2.2.2
infile = "dump.pcap"

try:
    my_reader = PcapReader(infile)
    my_send(my_reader)
except IOError:
    print "Failed reading file %s contents" % infile
    sys.exit(1)

def my_send(rd, count=100):
    pkt_cnt = 0
    p_out = []

    for p in rd:
        pkt_cnt += 1
        np = p.payload
        np[IP].dst = dst_ip
        np[IP].src = src_ip
        del np[IP].chksum
        p_out.append(np)
        if pkt_cnt % count == 0:
            send(PacketList(p_out))
            p_out = []

    # Send remaining in final batch
    send(PacketList(p_out))
    print "Total packets sent %d" % pkt_cn
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8726881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档