dpkt

  • パケット操作用。
  • GRE周りがかなり怪しい実装になってる。unpackは上手く動作しないかも。
  • TCP/IP,UDP/IP,ICMP辺りはそれなりに動くかも。
  • IPv6 ESPヘッダは非対応だから、エラー吐くよ。
  • カプセル化されていて、そのプロトコルが実装前だけど実装するのが面倒なときは、以下のように必要部分だけstrで抜き出して処理する逃げ道もある。
    • <code>dpkt.ip.IP( str(udp.data)[4:] )</code>
  • Python 2.7.1でビルド
  • 例えば、「指定した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>
programming/python/dpkt/start.txt · 最終更新: 2012/03/06 00:58 by yuki
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0