scapy数据包操作和原始pkt.time

时间:2014-10-31 15:44:34

标签: packet scapy

我有python,scapy和平的代码,将我的数据存储到数据库(IP src和dst,ports,..) 我用它来进行一些统计。 在一些数据包上,我正在进行一些操作(更改dst端口),然后将它们发送回接口。

问题是我操作的这个数据包与原始数据包有不同的pkt.time值 如果我将这些数据包存储到数据库中,则它们具有与原始数据包不同的数据包时间。

在创建UDP数据包时是否存在选项以放置原始pkt.time值? 使用此选项,数据包操作延迟不会导致我的数据包无序。

欢迎任何帮助

以下是我的操作脚本

#!/usr/bin/env python

from scapy.all import *

# VARIABLES
interface = 'eth1'
filter_bpf = "port 8000"

def pkt_change(pkt):
    if pkt.haslayer(UDP):
        # --> pkt.time is packet time
        ts = pkt.time
        src  = pkt[IP].src
        dst = pkt[IP].dst
        sport = pkt[IP].sport
        dport = pkt[IP].dport
        msg = pkt[IP].load

        #### Spoof Response
        changed_pkt = Ether()/IP(dst=dst, src=src)/UDP(dport=8000, sport=sport)/msg

        sendp(changed_pkt, iface="eth1") 
        print 'Sent:', changed_pkt.summary()

# ------------------------------------------------
# start sniffing
print "Start Sniffing"
sniff(iface=interface, filter=filter_bpf, store=0, prn=pkt_change)

1 个答案:

答案 0 :(得分:1)

创建changed_pkt后,您只需按如下方式设置其time属性:

changed_pkt.time = ts

请注意,即使在更改数据包的时间戳并发送它之后,更新的时间戳也不会反映在另一端的接收数据包中,因为时间戳是在接收机中设置的,因为数据包是收到了,如here所述。

如果您对将数据包传输到远程计算机感兴趣,同时保留其时间戳,请考虑将处理后的数据包存储在pcap文件中,然后将该文件发送到另一台计算机。