dpkt¶
パケット操作用ライブラリ: http://code.google.com/p/dpkt/ -> https://github.com/kbandla/dpkt
Error
以下はcode.googleに置いてあった時代の話
- GRE周りがかなり怪しい実装になってる。unpackは上手く動作しないかも。
- TCP/IP,UDP/IP,ICMP辺りはそれなりに動くかも。
- IPv6 ESPヘッダは非対応だから、エラー吐くよ。
- IPv6は拡張ヘッダ周りでバグが残ってるぽいのでdiff当てて、python setup.py installやり直し。
- ICMPv6は別段デコードしないデータグラムを重複して返すかもしれない。これも書きなおしかも。
-
カプセル化されていて、そのプロトコルが実装前だけど実装するのが面倒なときは、以下のように必要部分だけstrで抜き出して処理する逃げ道もある。
dpkt.ip.IP( str(udp.data)[4:] )
-
Python 2.7.1でビルド
- http://dpkt.googlecode.com/files/dpkt-1.7.tar.gz
python setup.py config python setup.py install
- http://dpkt.googlecode.com/files/dpkt-1.7.tar.gz
-
例えば、「指定したpcapファイルのパケットを、GREでカプセル化して吐き出す」というのを適当に書くと以下のようになる。
import sys
import dpkt
def ethaddr(addr):
addrcode = [chr(int(i)) for i in addr.split(':')]
return "".join(addrcode)
def ipv4addr(addr):
addrcode = [chr(int(i)) for i in addr.split('.')]
return "".join(addrcode)
def main():
filename = "target.pcap"
pcr = dpkt.pcap.Reader(open(filename))
gre = dpkt.gre.GRE()
ip = dpkt.ip.IP(src=ipv4addr('10.90.0.1'), dst=ipv4addr('10.90.0.2'), p=47)
eth = dpkt.ethernet.Ethernet(type=dpkt.ethernet.ETH_TYPE_IP)
eth.src=ethaddr('01:02:03:04:05:06')
eth.dst=ethaddr('01:02:03:04:05:07')
pcw = dpkt.pcap.Writer(open('gre_'+filename,'wb'))
for ts, buf in pcr:
eth_in = dpkt.ethernet.Ethernet(buf)
gre.data = eth_in.data
ip.sum = 0
ip.data = gre
ip.len = len(str(ip))
eth.data = ip
pcw.writepkt(eth,ts)
pcw.close
pass
if __name__ == '__main__':
main()
最終更新日: 2021-05-22 13:37:13