pythonとdpktでパケット解析 [プログラム]
pythonでpcapファイルを解析する方法
dpktモジュールを使えば簡単にできました。
使い方
#python pcap.py [pcapファイル]
dpktモジュールを使えば簡単にできました。
使い方
#python pcap.py [pcapファイル]
ファイル名 pcap.py # -*- coding: utf-8 -*- import dpkt, socket import string import binascii import sys #メイン関数 def main(filename): pcr = dpkt.pcap.Reader(open(filename,'rb')) #パケット数 packet_count = 0 #パケット処理 for ts,buf in pcr: packet_count += 1 try: eth = dpkt.ethernet.Ethernet(buf) except: continue #IPデータの場合 if type(eth.data) == dpkt.ip.IP: ip = eth.data ipheader(ip) #TCPデータ if type(ip.data) == dpkt.tcp.TCP: tcp = ip.data #ペイロードが0以外 if len(tcp.data) != 0: thex = binascii.b2a_hex(tcp.data) payload(thex) #UDPデータ elif type(ip.data) == dpkt.udp.UDP: udp = ip.data #ペイロードが0以外 if len(udp.data) != 0: uhex = binascii.b2a_hex(udp.data) payload(uhex) #ICMPデータ elif type(ip.data) == dpkt.icmp.ICMP: icmp = ip.data #ペイロードが0以外 if len(icmp.data) != 0: ihex = binascii.hexlify(str(icmp.data)) payload(ihex[8:]) print "処理終了:", packet_count #IPヘッダ処理 def ipheader(header): #ヘッダの処理 src = socket.inet_ntoa(header.src) dst = socket.inet_ntoa(header.dst) #TCP if type(header.data) == dpkt.tcp.TCP: print "TCP %s:%s => %s:%s (len:%s)" % (src, header.data.sport, dst, header.data.dport, len(header.data.data)) #UDP elif type(header.data) == dpkt.udp.UDP: print "UDP %s:%s => %s:%s (len:%s)" % (src, header.data.sport, dst, header.data.dport, len(header.data.data)) #ICMP elif type(header.data) == dpkt.icmp.ICMP: print "ICMP %s:type %s,code %s => %s (len:%s)" % (src, header.data.type, header.data.code, dst, len(header.data.data)) #その他 else: print "%s => %s" % (src, dst) #ペイロード def payload(thex): #ペイロードの処理 return #メイン関数 if __name__ == '__main__': if (len(sys.argv) != 2): print "ファイルを指定して下さい" exit() #第2引数をファイル名にする filename = sys.argv[1] main(filename)
コメント 0