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() # 运行报文捕获函数



Python scapy抓取网卡中的数据包_第1张图片

 

运行:

Python scapy抓取网卡中的数据包_第2张图片

捕获的数据包:

Python scapy抓取网卡中的数据包_第3张图片

 

 

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

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

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

 

你可能感兴趣的:(Python)