Pythonでパケットキャプチャ

とある事情によりパケットキャプチャするプログラムが必要になったので、手慣れたPythonで書いてみた。パケットキャプチャをするためのライブラリはpcapy。キャプチャしたパケットを自分で解析するとつらいので、impacketも使用する。特に後者は日本語の情報があまりないので未来の自分のためのメモ書き。

必要なソフト

Python2.5:pcapyの関係でバージョンは2.5。
WinPcap4.0:pcapyの関係でバージョンは4.0。
pcapy0.10.5:WinPcapをpythonから使うためのライブラリ。
Impacket0.9.6:パケットを解析するためのライブラリ。

サンプルソース

# coding: shift_jis
#----------------------------------------------------

import pcapy
from impacket.ImpactDecoder import *

#----------------------------------------------------
# パケットが届くと呼ばれる
def f(header, data):
	eth = EthDecoder().decode(data)
	ip = eth.child()
	tcp = ip.child()
	src = (ip.get_ip_src(), tcp.get_th_sport())
	dst = (ip.get_ip_dst(), tcp.get_th_dport())
	data = tcp.get_data_as_string()
	print src, dst
	print data
#----------------------------------------------------

#----------------------------------------------------
def main():
	no = 1	# 適当に有効なデバイス番号を入れる
	dev = pcapy.findalldevs()[no]
	p = pcapy.open_live(dev, 65536, False, 100)
	p.setfilter("tcp")
	p.loop(-1, f)
#----------------------------------------------------