SSブログ

pythonとdpktでパケット解析 [プログラム]

pythonで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)  トラックバック(0) 
共通テーマ:パソコン・インターネット

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。