python分析pcap包

前两天需要分析一个pcap包,写了一段python脚本,将每个包的基本信息(源/目的MAC、源/目的IP、源/目的端口)提取出来。

在实现过程中为了省事用了dpkt开发包,不过只用了几个简单的函数,具体的信息提取部分都是自己实现的。

值得注意的是 用到了binascii包中的b2a_hex函数,可以将一段2进制数用16进制的方式显示出来。

源代码:

 

import sys

import dpkt

import socket

import binascii

def addr2str(addrobj):

  if len(addrobj) != 4 :

    return "addr error!"

  else:

    return str(ord(addrobj[0]))+"."+str(ord(addrobj[1]))+"."+str(ord(addrobj[2]))+"."+str(ord(addrobj[3]))

def TCPorUDP(obj):

  if (ord(obj) == 0x01):

    return "ICMP"

  elif (ord(obj) == 0x02):

    return "IGMP"

  elif (ord(obj) == 0x06):

    return "TCP"

  elif (ord(obj) == 0x08):

    return "EGP"

  elif (ord(obj) == 0x09):

    return "IGP"

  elif (ord(obj) == 0x11):

    return "UDP"

  elif (ord(obj) == 41):

    return "IPv6"

  elif (ord(obj) == 89):

    return "OSPF"

  else:

    return "error"

def main():

  fw = open("result.txt","w")

  f = file("./traces_new.cap","rb")

  pcap = dpkt.pcap.Reader(f)

  for ts, buf in pcap:

    fw.writelines("timestamp:"+str(ts)+"\tpacket len:"+str(len(buf))+"\n")

    ethheader = buf[0:14]

    dstmac = ethheader[0:6]

    srcmac = ethheader[6:12]

    netlayer_type = ethheader[12:14]

    fw.writelines("dstMAC:"+str(binascii.b2a_hex(dstmac))+"\tsrcMAC:"+str(binascii.b2a_hex(srcmac))+"\n")

    pktheader = buf[14:34]

    trans_type = pktheader[9]

    srcip = pktheader[12:16]

    dstip = pktheader[16:20]

    fw.writelines("dstIP:"+addr2str(dstip)+"\tsrcIP:"+addr2str(srcip)+"\n")

    fw.writelines("packet type:"+TCPorUDP(trans_type)+"\n")

    if (ord(trans_type) == 0x11): #UDP

      udpheader = buf[34:42]

      srcport = udpheader[0:2]

      dstport = udpheader[2:4]

      udplen = udpheader[4:6]

      fw.writelines("srcport:"+str(ord(srcport[1])+ord(srcport[0])*16*16)+"\tdstport:"+str(ord(dstport[1])+ord(dstport[0])*16*16)+"\n\n")

    elif (ord(trans_type) == 0x06): #TCP

      tcpheader = buf[34:54]

      srcport = tcpheader[0:2]

      dstport = tcpheader[2:4]

      fw.writelines("srcport:"+str(ord(srcport[1])+ord(srcport[0])*16*16)+"\tdstport:"+str(ord(dstport[1])+ord(dstport[0])*16*16)+"\n\n")

  f.close()

if __name__ == "__main__":

  main()

 

 

转载于:https://www.cnblogs.com/yulele/archive/2013/04/16/3023785.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值