scapy: проблема с отметкой времени дефрагментации UDP - PullRequest
3 голосов
/ 24 марта 2011

Я использую следующий скрипт (python + scapy) для создания дефрагментированной версии файла pcap, который содержит фрагментированные пакеты 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, я хотел бы помочь разобраться в этом и взломать, чтобы сохранить дату , последний фрагмент, и положить его в дефрагментированный пакет ...

Может ли кто-нибудь помочь мне в этом, любой намек?
Например, где я могу найти дату захвата во входных пакетах и ​​где я должен поместить ее в дефрагментированный пакет ...

Конечно, любое другое решение, достигающее той же цели, приветствуется (я признаю ... я тороплюсь :( ...)

1 Ответ

2 голосов
/ 29 марта 2011

Вот патч для inet.py, который добавляет дату захвата 1-го фрагмента в дефрагментированный пакет.

Возможно, есть более чистые решения, такие как модификация метода 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 ----
...