5 Stimmen

python: Konvertierung von tcpdump in text2pcap-lesbares Format

Vor kurzem musste ich die Textausgabe von "tcpdump -i eth0 -neXXs0" in eine pcap-Datei umwandeln. Also habe ich ein Python-Skript geschrieben, das die Informationen in ein Zwischenformat konvertiert, das von text2pcap verstanden wird. Da dies mein erstes Programm in Python ist, gibt es natürlich Verbesserungsmöglichkeiten. Ich möchte, dass sachkundige Leute eventuelle Unstimmigkeiten ausmerzen und/oder das Programm verbessern.

Eingabe

Die tcpdump-Ausgabe hat das folgende Format:

20:11:32.001190 00:16:76:7f:2b:b1 > 00:11:5c:78:ca:c0, Ethertyp IPv4 (0x0800), Länge 72: 123.236.188.140.41756 > 94.59.34.210.45931: UDP, Länge 30

0x0000:  0011 5c78 cac0 0016 767f 2bb1 0800 4500  ..\x....v.+...E.
0x0010:  003a 0000 4000 4011 812d 7bec bc8c 5e3b  .:..@.@..-{...^;
0x0020:  22d2 a31c b36b 0026 b9bd 2033 6890 ad33  "....k.&...3h..3
0x0030:  e845 4b8d 2ba1 0685 0cb3 70dd 9b98 76d8  .EK.+.....p...v.
0x0040:  8fc6 8293 bf33 325a                      .....32Z

Ausgabe

Code hier eingeben

Von text2pcap verständliches Format:

20:11:32.001190

0000: 00 11 5c 78 ca c0 00 16 76 7f 2b b1 08 00 45 00   ..\x....v.+...E. 
0010: 00 3a 00 00 40 00 40 11 81 2d 7b ec bc 8c 5e 3b   .:..@.@..-{...^; 
0020: 22 d2 a3 1c b3 6b 00 26 b9 bd 20 33 68 90 ad 33   "....k.&...3h..3
0030: e8 45 4b 8d 2b a1 06 85 0c b3 70 dd 9b 98 76 d8   .EK.+.....p...v. 
0040: 8f c6 82 93 bf 33 32 5a   .....32Z 

Hier ist mein Code.

import re
# Identify time of the current packet.
time = re.compile ('(..:..:..\.[\w]*) ')
# Get individual elements from the packet. ie. offset, hexdump, chars
all = re.compile('[ |\t]+0x([\w]+:) +(.+)  +(.*)')
# Regex for two spaces
twoSpaces = re.compile('  +')
# Regex for single space
singleSpace = re.compile(' ')
# Single byte pattern.
singleBytePattern = re.compile(r'([\w][\w])')

# Open files.
f = open ('pcap.txt', 'r')
outfile = open ('ashu.txt', 'w')

for line in f:
  result = time.match (line)
  if result:
    # If current line contains time format dump only time
    print result.group()
    outfile.write (result.group() + '\n')
  else:
    print line,
    # Split line containing hex dump and tokenize into list elements.
    result = all.split (line)
    if result:
      i = 0
      for values in result:
        if (i == 2):
          # Strip off additional spaces in hex dump
          # Useful when hex dump does not end in 16 bytes boundary.
          val = twoSpaces.sub ('', values)

          # Tokenize individual elements seperated by single space.
          byteResult = singleSpace.split (val)
          for twoByte in byteResult:
            # Identify individual byte
            singleByte = singleBytePattern.split(twoByte)
            byteOffset = 0
            for oneByte in singleByte:
              if ((byteOffset == 1) or (byteOffset == 3)):
               # Write out individual byte with a space char appended
               print oneByte, 
               outfile.write (oneByte+ ' ')
              byteOffset = byteOffset + 1
        elif (i == 3):
          # Write of char format of hex dump
          print "  "+values,
          outfile.write ('  ' + values+ ' ')
        elif (i == 4):
          outfile.write (values) 
        else:
          print values,
          outfile.write (values + ' ')
        i=i+1
    else:
      print "could not split"
f.close ()
outfile.close ()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X