Python scapy抓取网卡中的数据包

# encoding: utf-8
from scapy.all import *
import threading
import sys


def dealwith():
    print '开始抓包'
    # 下面的iface是电脑网卡的名称 count是捕获报文的数目
    dpkt = sniff(iface="Qualcomm Atheros AR956x Wireless Network Adapter", count=1000)  # 抓包 # prn=lambda x: x.show(),
    # pkts = sniff(prn=lambda x : x.sprintf("{IP:%IP.src% -> %IP.dst%\n}{Raw:%Raw.load%\n}"))
    print '抓包成功'

    wrpcap("c://demo.pcap", dpkt)
    print '所抓的包已经保存'

    pcks = rdpcap('c://demo.pcap')
    print '开始解析pcap包'

    # 输出重定向  讲在控制台的输出重定向到 txt文本文件中
    output = sys.stdout
    outputfile = open('c://capture.txt', 'w')
    sys.stdout = outputfile

    zArp = 0
    zIcmp = 0
    ipNum = set()

    for p in pcks:
        status1 = p.payload.name  # 可能是ARP的报文
        status2 = p.payload.payload.name  # 可能是TCP报文 也可能是ICMP的报文

        # p.show() 输出报文, 在符合的情况下
        if status1 == 'IP':
            ipNum.add(p.payload.src)  # 将ip报文的源地址,和目的地址存在set集合里面(set去重)
            ipNum.add(p.payload.dst)
            p.show()
            print ''
        else:
            if status1 == 'ARP':
                p.show()
                print ''
                zArp += 1

            if status2 == 'ICMP':
                p.show()
                print ''
                zIcmp += 1

    print 'IP:' + str(len(ipNum)) + ' ARP:' + str(zArp) + ' ICMP:' + str(zIcmp) # 报文数量的输出

    outputfile.close()
    sys.stdout = output  # 恢复到控制台输出

    print '输出结束'
    print dpkt

dealwith() # 运行报文捕获函数



 

运行:

捕获的数据包:

 

 

这个还需要下载报文捕获工具WinPcap,需要下载两个包,一个是scapy,一个是dpkt    

这个代码是在python2.7环境下运行的

附上:scapy文档:https://scapy.readthedocs.io/en/latest/usage.html#

 

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值