#! /usr/bin/env python
|
|
from __future__ import print_function
|
import getopt
|
|
def usage():
|
print("""Usage: check_asdis -i <pcap_file> [-o <wrong_packets.pcap>]
|
-v increase verbosity
|
-d hexdiff packets that differ
|
-z compress output pcap
|
-a open pcap file in append mode""", file=sys.stderr)
|
|
def main(argv):
|
PCAP_IN = None
|
PCAP_OUT = None
|
COMPRESS=False
|
APPEND=False
|
DIFF=False
|
VERBOSE=0
|
try:
|
opts=getopt.getopt(argv, "hi:o:azdv")
|
for opt, parm in opts[0]:
|
if opt == "-h":
|
usage()
|
raise SystemExit
|
elif opt == "-i":
|
PCAP_IN = parm
|
elif opt == "-o":
|
PCAP_OUT = parm
|
elif opt == "-v":
|
VERBOSE += 1
|
elif opt == "-d":
|
DIFF = True
|
elif opt == "-a":
|
APPEND = True
|
elif opt == "-z":
|
COMPRESS = True
|
|
|
if PCAP_IN is None:
|
raise getopt.GetoptError("Missing pcap file (-i)")
|
|
except getopt.GetoptError as e:
|
print("ERROR: %s" % e, file=sys.stderr)
|
raise SystemExit
|
|
|
|
from scapy.config import conf
|
from scapy.utils import RawPcapReader,RawPcapWriter,hexdiff
|
from scapy.layers import all
|
|
|
pcap = RawPcapReader(PCAP_IN)
|
pcap_out = None
|
if PCAP_OUT:
|
pcap_out = RawPcapWriter(PCAP_OUT, append=APPEND, gz=COMPRESS, linktype=pcap.linktype)
|
pcap_out._write_header(None)
|
|
LLcls = conf.l2types.get(pcap.linktype)
|
if LLcls is None:
|
print(" Unknown link type [%i]. Can't test anything!" % pcap.linktype, file=sys.stderr)
|
raise SystemExit
|
|
|
i=-1
|
differ=0
|
failed=0
|
for p1,meta in pcap:
|
i += 1
|
try:
|
p2d = LLcls(p1)
|
p2 = str(p2d)
|
except KeyboardInterrupt:
|
raise
|
except Exception as e:
|
print("Dissection error on packet %i" % i)
|
failed += 1
|
else:
|
if p1 == p2:
|
if VERBOSE >= 2:
|
print("Packet %i ok" % i)
|
continue
|
else:
|
print("Packet %i differs" % i)
|
differ += 1
|
if VERBOSE >= 1:
|
print(repr(p2d))
|
if DIFF:
|
hexdiff(p1,p2)
|
if pcap_out is not None:
|
pcap_out.write(p1)
|
i+=1
|
correct = i-differ-failed
|
print("%i total packets. %i ok, %i differed, %i failed. %.2f%% correct." % (i, correct, differ,
|
failed, i and 100.0*(correct)/i))
|
|
|
if __name__ == "__main__":
|
import sys
|
try:
|
main(sys.argv[1:])
|
except KeyboardInterrupt:
|
print("Interrupted by user.", file=sys.stderr)
|