差分
この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
programming:python:dpkt:start [2011/04/01 20:58] yuki |
programming:python:dpkt:start [2021/05/22 18:41] yuki 削除 |
||
---|---|---|---|
ライン 3: | ライン 3: | ||
* パケット操作用。 | * パケット操作用。 | ||
* http://code.google.com/p/dpkt/ | * http://code.google.com/p/dpkt/ | ||
+ | |||
+ | * GRE周りがかなり怪しい実装になってる。unpackは上手く動作しないかも。 | ||
+ | * TCP/IP,UDP/IP,ICMP辺りはそれなりに動くかも。 | ||
+ | * IPv6 ESPヘッダは非対応だから、エラー吐くよ。 | ||
+ | * IPv6は拡張ヘッダ周りでバグが残ってるぽいのでdiff当てて、python setup.py installやり直し。 | ||
+ | * http://code.google.com/p/dpkt/issues/detail?id=67 | ||
+ | * ICMPv6は別段デコードしないデータグラムを重複して返すかもしれない。これも書きなおしかも。 | ||
+ | * http://code.google.com/p/dpkt/issues/detail?id=77 | ||
+ | * カプセル化されていて、そのプロトコルが実装前だけど実装するのが面倒なときは、以下のように必要部分だけstrで抜き出して処理する逃げ道もある。 | ||
+ | * <code>dpkt.ip.IP( str(udp.data)[4:] )</code> | ||
* Python 2.7.1でビルド | * Python 2.7.1でビルド | ||
ライン 9: | ライン 19: | ||
python setup.py install</code> | python setup.py install</code> | ||
- | * 例えば、「filename(ハードコード)で指定したpcapファイルのパケットを、GREでカプセル化して吐き出す」というのを適当に書くと以下のようになる。 | + | * 例えば、「指定したpcapファイルのパケットを、GREでカプセル化して吐き出す」というのを適当に書くと以下のようになる。 |
* <code>import sys | * <code>import sys | ||
import dpkt | import dpkt | ||
+ | |||
+ | def ethaddr(addr): | ||
+ | addrcode = [chr(int(i)) for i in addr.split(':')] | ||
+ | return "".join(addrcode) | ||
def ipv4addr(addr): | def ipv4addr(addr): | ||
ライン 23: | ライン 37: | ||
gre = dpkt.gre.GRE() | gre = dpkt.gre.GRE() | ||
ip = dpkt.ip.IP(src=ipv4addr('10.90.0.1'), dst=ipv4addr('10.90.0.2'), p=47) | ip = dpkt.ip.IP(src=ipv4addr('10.90.0.1'), dst=ipv4addr('10.90.0.2'), p=47) | ||
- | eth = dpkt.ethernet.Ethernet(src='\x01\x02\x03\x04\x05\x06', dst='\x05\x06\x07\x08\x09\x0a', type=dpkt.ethernet.ETH_TYPE_IP) | + | 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')) | pcw = dpkt.pcap.Writer(open('gre_'+filename,'wb')) | ||
ライン 31: | ライン 47: | ||
ip.sum = 0 | ip.sum = 0 | ||
ip.data = gre | ip.data = gre | ||
- | ip.len = len(ip) | + | ip.len = len(str(ip)) |
eth.data = ip | eth.data = ip | ||
pcw.writepkt(eth,ts) | pcw.writepkt(eth,ts) |