在 scapy 中通过 src mac 过滤数据包

Filtering packets by src mac in scapy

当我在 wireshark 中使用这个过滤器过滤数据包时: wlan.sa == 04.b1.67.14.bd.64 一切顺利。

但是,我正在尝试使用 scapy 使用以下 python 脚本来完成它,但它从不按源过滤 mac:

from scapy.all import *
from datetime import datetime
import traceback
# import MySQLdb

def getAverageSSI():
    global ssiFinal
    return ssiFinal

def setParams():
    global window
    global timestamp
    global SSID
    global datetime
    global iterator1
    window = 1
    timestamp = datetime.now()
    SSID='DefaultName'
    iterator1 = 0
    global ssiArray

    ssiArray = []


def myPacketHandler(pkt) :
    global SSID
    global timestamp
    global iterator1
    global ssiArray

    try :

        if pkt.haslayer(Dot11) :

            ssiNew = -(256-ord(pkt.notdecoded[-4:-3]))

            ssiArray.append(ssiNew)

            diffT=(datetime.now()-timestamp).seconds


            if diffT>window:

                print 'With MAC dst = %s with SSI Power= %s' %(pkt.addr1, sum(ssiArray)/len(ssiArray))
                print ssiArray
                ssiArray = []

                timestamp=datetime.now()

    except Exception as e:
        print 'Exception'
        print e
        traceback.print_exc()
        sys.exit(0)


setParams()

try:
    sniff(iface="wlan1", filter="ether src 04:b1:67:14:bd:64", prn = myPacketHandler, store=0)
except Exception as e:
    print e
    print "Sniff AP1 Off"

我也试过在 sniff 中删除过滤器,并像下面这样放置一个 if:

if pkt.addr1 == '04:b1:67:14:bd:64' : # mac xiaomi mi a1

            # SSID = pkt.info;
            ssiNew = -(256-ord(pkt.notdecoded[-4:-3]))

            ssiArray.append(ssiNew)

            diffT=(datetime.now()-timestamp).seconds


            if diffT>window:

                # query = "START TRANSACTION;"
                # queryBack=cur.execute(query)

                # query = "INSERT INTO RSSI VALUES(%d,\"AP1\",%d);"%(iterator1,ssiNew)
                # queryBack = cur.execute(query)

                print 'MAC = %s with SSI Power= %s' %(pkt.addr1, sum(ssiArray)/len(ssiArray))

                ssiArray = []
                # Conexion.commit()

                # iterator1+=1

                timestamp=datetime.now()

但它只是按目的地过滤 mac。

您知道如何像下面的 wireshark 图像一样按 mac 正确过滤吗? (它需要与 wireshark 过滤器中的行为完全相同):

如果您使用 addr2 而不是 addr1

,则您的第二种方法应该运行良好

这是它在 802.11 中的工作方式(是的,它真的很乱)

另外,你应该更新到github scapy版本,它直接支持RSSI(所以你不必解析notdecoded)

https://github.com/secdev/scapy/archive/master.zip