scapy: UDP重组时间戳问题

3 投票
1 回答
1752 浏览
提问于 2025-04-16 14:20

我使用下面的脚本(Python + Scapy)来创建一个去碎片化的版本,里面包含了一些被分割的UDP数据包。

# Read pcap file
in=rdpcap("in.pcap")
# Defragment ...
out = defragment(in)
# Write defragmented pcap file
wrpcap ("out.pcap", out) 

我遇到的问题是,去碎片化后的数据包时间戳被设置成了去碎片化的日期,而不是捕获数据包的日期。没有被分割的数据包仍然保留着它们原来的捕获时间戳。

我查看了inet.py中的defragment()和defrag()函数,但我对Scapy不太熟悉,想请教一下,如何才能理解这些代码,并修改它,让去碎片化的数据包保留最后一个碎片的日期,并把这个日期放到去碎片化的数据包里……

有没有人能帮我一下,给点提示?
比如,我可以在哪里找到输入数据包的捕获日期,应该把它放在哪里在去碎片化的数据包里……

当然,任何其他能达到同样目的的解决方案也欢迎(我承认……我有点着急 :( …)

1 个回答

2

这里有一个对inet.py的补丁,它可以把第一个数据片段的捕获日期添加到解碎片后的数据包中。

可能还有更简单的解决办法,比如修改Packet.copy()方法和其他一些方法,但这个方法也能满足需求……

*** inet.py     2011-03-29 14:01:19.000000000 +0000
--- inet.py.orig        2011-03-29 07:59:02.000000000 +0000
***************
*** 846,856 ****
          lastp = lst[-1]
          if p.frag > 0 or lastp.flags & 1 != 0: # first or last fragment missing
              missfrag += lst
-             print "missing framgent!"
              continue
!         # Keep 1st fragment capture time (as it is lost in subsequent copies during defragmentation)
!         ptime = p.time
!         p = p.copy() # copy() method do not copy time member (?)
          if Padding in p:
              del(p[Padding].underlayer.payload)
          ip = p[IP]
--- 846,853 ----
          lastp = lst[-1]
          if p.frag > 0 or lastp.flags & 1 != 0: # first or last fragment missing
              missfrag += lst
              continue
!         p = p.copy()
          if Padding in p:
              del(p[Padding].underlayer.payload)
          ip = p[IP]
***************
*** 878,892 ****
              del(ip.len)
              p = p/txt
              p._defrag_pos = max(x._defrag_pos for x in lst)
-             # Put back time in packet
-             p.time= ptime
              defrag.append(p)
      defrag2=[]
      for p in defrag:
          q = p.__class__(str(p))
          q._defrag_pos = p._defrag_pos
-         # Put back time in packet
-         q.time = p.time
          defrag2.append(q)
      final += defrag2
      final += missfrag
--- 875,885 ----

撰写回答