基于树莓派的WIFI抓包、分析(wireshark)并上传至阿里云数据库

一、系统功能
1)实现对环境中所有wifi信号的抓取
2)对抓取后的报文进行解析,能够拿到每个报文的rss、源MAC地址、目标MAC地址、时间戳
3)建立云数据库存储解析后的数据
4)开发安卓app,用图形UI对数据库的数据进行访问并按照需求进行数据处理(比如实现定位算法,进行mac地址对比等)

二、所需设备
树莓派、支持monitor模式的无线网卡

三、话不多说上代码(抓包、分析并上传到阿里云数据库),需要app代码请私聊
# encoding: utf-8
from tracemalloc import start
from scapy.all import *
import threading
import sys
import os
import csv
import pymysql
import re
import datetime

def dealwith():

z = r'/home/pi/Desktop/demo/demo'
y = r'pcap'
k = r'/home/pi/Desktop/demo/capture'
t = r'.txt'
fff = r'/home/pi/Desktop/demo/filter
n = int(input("input:"))  
for i in range(1,n+1):
    if i < n+1:
        j = str(i)
        h = str(i-1)
        print ('开始抓包')
        now = datetime.datetime.now()
        dpkt = sniff(iface ='wlan1mon', count=5,filter = 'wlan subtype Beacon')  # 抓包
        print ('抓包成功')
        wrpcap(z+j+y, dpkt)
        print ( '所抓的包已经保存')
        pcks = PcapReader(z+j+y)
        print ('开始解析pcap包')

                    # 输出重定向  讲在控制台的输出重定向到 txt文本文件中
        
        output = sys.stdout
        outputfile = open(k+j+t, 'w')
        sys.stdout = outputfile
        
        zArp = 0
        zIcmp = 0
        zEther = 0
        zOther = 0
        ipNum = set()

        for p in pcks:
            status1 = p.payload.name  # 可能是ARP的报文
            status2 = p.payload.payload.name  # 可能是TCP报文 也可能是ICMP的报文
            status3 = p.name
    # 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
        
                if status3 == 'Ethernet':
                    p.show()
                    print( '')
                    zEther += 1
        
                else:
                    p.show()
                    print( '')
                    zOther += 1


            print ('IP:' + str(len(ipNum)) + ' ARP:' + str(zArp) + ' ICMP:' + str(zIcmp) + ' Ethernet:' + str(zEther))# 报文数量的输出
        outputfile.close()
        sys.stdout = output
    
        ccssvv = open('/home/pi/Desktop/filtt.csv','a',newline='')
        writer = csv.writer(ccssvv)
        data = []  
        filef = open(k+j+t, 'r')
        file_contents = filef.readlines()
        pp = open(fff+j+t, 'w')    
        for content in file_contents:
            if 'mac_timestamp=' in content:
                
                data.append(now.strftime("%Y-%m-%d %H:%M:%S"))
                pp.write(now.strftime("%Y-%m-%d %H:%M:%S"))   #将符合要求的内容写入文件
                pp.write('\n')
            
            if 'dBm_AntSignal=' in content:
        #print(content)            #打印,看效果
                jj = content.rfind('dBm_AntSignal=')
                rr = content[jj+15:jj+19]+'dBm'
                data.append(rr)
                pp.write(rr)   #将符合要求的内容写入文件
                pp.write('\n')
                
            '''if 'mac_timestamp=' in content:
                jj = content.rfind('mac_timestamp=')
                rr = content[jj+16:jj+25]
                dateArray = datetime.datetime.utcfromtimestamp(int(rr))
                rrtt = dateArray.strftime("%Y-%m-%d %H:%M:%S")
                data.append(rrtt)
                pp.write(rrtt)   #将符合要求的内容写入文件
                pp.write('\n')'''
    
            if 'DA' in content:
        #print(content)            #打印,看效果
                jj = content.rfind('DA')
                rr = content[jj-22:jj-5]
                data.append(rr)
                pp.write(rr)   #将符合要求的内容写入文件
                pp.write('\n')

            if  'addr2' in content:          #检查包含pH的那行数据
    #print(content)            #打印,看效果
                jj = content.rfind('addr2')   # 找到最后一条数据所在的位置
        #i = content.index('addr2', start)
                rr = content[jj+12:jj+29]
                data.append(rr)
                pp.write(rr)
                pp.write('\n')

            if 'BSSID' in content:
        #print(content)            #打印,看效果
                jj = content.rfind('BSSID')
                rr = content[jj-19:jj-2]
                data.append(rr)
                pp.write(rr)   #将符合要求的内容写入文件
                pp.write('\n')
        
            
    #outputfile.close()
    #sys.stdout = output  # 恢复到控制台输出
            if len(data) == 5:
                
                writer.writerow(data)
                data = []
        
        conn = pymysql.connect(host='...', user='...', password='...', db='test', port=3306, charset='utf8')
        print('连接数据库成功!')
        cursor = conn.cursor()
#测试代码
        sql="select mac from userlist where phone = 1"
        cursor.execute(sql)
        res=cursor.fetchone()
        conn.commit()

        print(res)

        with open('/home/pi/Desktop/filtt.csv','r',encoding='utf-8') as f:
            read=csv.reader(f)
            for each in list(read)[1:]:
                i=tuple(each[0:])
                sql="INSERT INTO data VALUE" + str(i)
                cursor.execute(sql)
            conn.commit()
            cursor.close()
            conn.close()
        
        
    print ('输出结束')
    print (dpkt)

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

四、实例图片
在这里插入图片描述
阿里云数据库可参考:https://blog.csdn.net/cljhwt/article/details/10838480

乌拉!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生只为一个成果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值