差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
programming:python:dpkt:start [2011/03/09 22:29]
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>​
  
 +  * 例えば、「指定したpcapファイルのパケットを、GREでカプセル化して吐き出す」というのを適当に書くと以下のようになる。
 +  * <​code>​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()</​code>​
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0