首页
社区
课程
招聘
[原创]python dpkt解包实例
发表于: 2016-10-24 13:26 7508

[原创]python dpkt解包实例

2016-10-24 13:26
7508
感谢leixyou对python dpkt库文档的翻译,本篇文章代码是以前在某个项目中使用到的一部分实例代码。



python dpkt库中包含的协议解析文件,里面包含了很多的公开协议解析代码。

实例:
#-*- ending=uft-8 -*-
#!/usr/bin/python

import dpkt
import socket
import struct
import sys
import datetime
import time

src_mac = ""
dst_mac = ""

def mac_addr(address):
    """Convert a MAC address to a readable/printable string

       Args:
           address (str): a MAC address in hex form (e.g. '\x01\x02\x03\x04\x05\x06')
       Returns:
           str: Printable/readable MAC address
    """
    return ':'.join('%02x' % ord(b) for b in address)

 
def inet_to_str(inet):
    """Convert inet object to a string

        Args:
            inet (inet struct): inet network address
        Returns:
            str: Printable/readable IP address
    """
    # First try ipv4 and then ipv6
    try:
        return socket.inet_ntop(socket.AF_INET, inet)
    except ValueError:
        return socket.inet_ntop(socket.AF_INET6, inet)

filename = "/root/python-code/test.pcap"
f = open(filename)
pcap = dpkt.pcap.Reader(f)

for timestamp,buf in pcap:
  d = datetime.datetime.fromtimestamp(timestamp)
  print 'Time: ',d.strftime("%Y-%m-%d %H:%M:%S.%f")

  eth = dpkt.ethernet.Ethernet(buf)
  src_mac = mac_addr(eth.src)
  dst_mac = mac_addr(eth.dst)
  plc_swich(src_mac,dst_mac)
  print 'Ethernet Frame: ',src_mac,dst_mac,hex(eth.type)

  if not isinstance(eth.data,dpkt.ip.IP):
    print 'Non IP Packet type not supported %s\n' % eth.data.__class__.__name__
    continue

  ip = eth.data
  tcp = ip.data
  do_not_fragment = bool(ip.off & dpkt.ip.IP_DF)
  more_fragments = bool(ip.off & dpkt.ip.IP_MF)
  fragment_offset = ip.off & dpkt.ip.IP_OFFMASK

  print 'IP: %s --> %s (len= %d ttl=%d DF= %d MF= %d offset= %d)' % (inet_to_str(ip.src),inet_to_str(ip.dst),ip.len,ip.ttl,do_not_fragment,more_fragments,fragment_offset)

  print "sport= %d,dport= %d" % (tcp.sport,tcp.dport)

  data = tcp.data
  print repr(data)
  print "\n"

代码为解析某私有协议,包括解析数据包时间、以太网头、IP头、TCP头以及PAYLOAD。PAYLOAD以具体环境解析为准。可按照协议规则编写。



如各位高手有更好的解包方法,请指点一二。谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 8952
活跃值: (2889)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
编辑有点问题,代码需要去掉plc_swich(src_mac,dst_mac)
2016-10-24 13:28
0
雪    币: 494
活跃值: (152)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
哇噻噻 楼主那些代码实例可以公开分享分享吗
2016-10-24 13:58
0
游客
登录 | 注册 方可回帖
返回
//