コンテンツにスキップ

dpkt

パケット操作用ライブラリ: http://code.google.com/p/dpkt/ -> https://github.com/kbandla/dpkt

Error

以下はcode.googleに置いてあった時代の話

  • GRE周りがかなり怪しい実装になってる。unpackは上手く動作しないかも。
  • TCP/IP,UDP/IP,ICMP辺りはそれなりに動くかも。
  • IPv6 ESPヘッダは非対応だから、エラー吐くよ。
  • カプセル化されていて、そのプロトコルが実装前だけど実装するのが面倒なときは、以下のように必要部分だけstrで抜き出して処理する逃げ道もある。

    dpkt.ip.IP( str(udp.data)[4:] )
    

  • Python 2.7.1でビルド

  • 例えば、「指定した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