2011-03-24 98 views
3

我使用以下脚本(python + scapy)创建一个包含碎片UDP数据包的碎片整理版本的pcap文件。scapy:UDP碎片整理时间戳问题

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

我的问题是碎片整理数据包的时间戳PCAP被设置为碎片整理的日期,而不是拍摄的日期。非分片数据包仍然有其原始捕获时间戳。

我看了一下inet.py,defragment()和defrag(),但我不太流利scapy,我想帮助理解它并破解它以保存日期,说,最后一个片段,并把它放在碎片整理的数据包...

有没有人可以帮助我这个,任何提示?
一样,我在哪里可以找到输入包的拍摄日期,并在那里我应该把它放在整理包...

当然,任何其他解决方案达成同样的目标是值得欢迎的(我承认...我在赶时间:(...)

回答

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 ----