Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scapy和python将MAC地址记录到csv中_Python_Csv_Scapy - Fatal编程技术网

使用scapy和python将MAC地址记录到csv中

使用scapy和python将MAC地址记录到csv中,python,csv,scapy,Python,Csv,Scapy,好的,我正在尝试创建一个csv文件,其中包含所有已看到的mac地址和SSID的列表。这是我到目前为止得到的代码,大部分来自:我正在使用Python2.7 from scapy.all import * import csv, time from datetime import datetime PROBE_REQUEST_TYPE=0 PROBE_REQUEST_SUBTYPE=4 WHITELIST = ['de:ad:be:ef:ca:fe',] # Replace this with

好的,我正在尝试创建一个csv文件,其中包含所有已看到的mac地址和SSID的列表。这是我到目前为止得到的代码,大部分来自:我正在使用Python2.7

from scapy.all import *
import csv, time
from datetime import datetime


PROBE_REQUEST_TYPE=0
PROBE_REQUEST_SUBTYPE=4

WHITELIST = ['de:ad:be:ef:ca:fe',] # Replace this with your phone's MAC address

def PacketHandler(pkt):
    if pkt.haslayer(Dot11):
        if pkt.type==PROBE_REQUEST_TYPE and pkt.subtype == PROBE_REQUEST_SUBTYPE and ( pkt.addr2.lower() not in WHITELIST and pkt.addr2.upper() not in WHITELIST):
            CheckCsv(pkt)

def PrintPacket(pkt):
    try:
        extra = pkt.notdecoded
    except:
        extra = None
    if extra!=None:
        signal_strength = -(256-ord(extra[-4:-3]))
    else:
        signal_strength = -100
        print "No signal strength found"
    print "Added: %s SSID: %s"%(pkt.addr2,pkt.getlayer(Dot11ProbeReq).info)

    with open('logmacs.csv','ab') as out:
        w=csv.writer(out)
        w.writerow([datetime.now().strftime('%Y-%m-%d'),datetime.now().strftime('%H:%M:%S'),pkt.addr2,pkt.getlayer(Dot11ProbeReq).info,signal_strength])
        out.close()

def CheckCsv(pkt):
    with open('logmacs.csv', 'rb') as f:
        reader = csv.reader(f, delimiter=',')
        for row in reader:
            if pkt.addr2 != row[2]:
                PrintPacket(pkt)
        f.close()


def main():
    print "[%s] Starting scan"%datetime.now()
    print "Scanning..."
    while True:
        sniff(iface=sys.argv[1],prn=PacketHandler, count=1)
        time.sleep(2)

if __name__=="__main__":
    main()
现在看来,要么它捕获了大量的数据包,要么它陷入了编写单个数据包的循环中。我添加了“count=1,while-True:and-time.sleep(2)”,试图防止出现这种情况,但似乎没有帮助


我想做的是记录一个日期/时间,当一台MAC电脑创建一个独特的MAC电脑列表时,但这并没有做到这一点….

您不应该在读取输出文件时写入输出文件。当前,您在
PrintPacket
中更新logmacs.csv的内容,同时在
CheckCsv
中对其进行迭代

我将修改
CheckCsv
的实现(和名称),以将监视的数据包存储到内存中的某个新变量,并检查是否应根据新引入的变量更新输出文件。这样做的另一个好处是,它的效率也要高得多

我还希望只打开文件一次,而不是每次写入(尝试使用
而不是
函数


编辑:

根据您的澄清要求,这里是一个基本的实施方案,符合我的目标:

from scapy.all import *
from datetime import datetime
import csv

PROBE_REQUEST_TYPE = 0
PROBE_REQUEST_SUBTYPE = 4

WHITELIST = ['de:ad:be:ef:ca:fe',] # Replace this with your phone's MAC address

PACKET_FILE_PATH = 'logmacs.csv'

class PacketHandler(object):
    def __init__(self, packet_file_path):
        self.packet_file_path = packet_file_path
        self.handled_packets = set()

    def __enter__(self):
        self.csv_file = open(self.packet_file_path, 'ab')
        self.csv_writer = csv.writer(self.csv_file)
        return self

    def __exit__(self, *exc_info):
        self.csv_file.close()

    def handle_packet(self, pkt):
        if pkt.haslayer(Dot11) and pkt.type == PROBE_REQUEST_TYPE and pkt.subtype == PROBE_REQUEST_SUBTYPE and (pkt.addr2.lower() not in WHITELIST and pkt.addr2.upper() not in WHITELIST) and pkt.addr2 not in self.handled_packets:
            self.add_packet(pkt)

    def add_packet(self, pkt):
        self.handled_packets.add(pkt.addr2)
        try:
            signal_strength = -(256 - ord(pkt.notdecoded[-4:-3]))
        except Exception, e:
            signal_strength = -100
            print "No signal strength found"
        self.csv_writer.writerow([datetime.now().strftime('%Y-%m-%d'),
                                  datetime.now().strftime('%H:%M:%S'),
                                  pkt.addr2,
                                  pkt.getlayer(Dot11ProbeReq).info,
                                  signal_strength])
        print "Added: %s SSID: %s" % (pkt.addr2, pkt.getlayer(Dot11ProbeReq).info)


def main():
    packet_handler = PacketHandler(PACKET_FILE_PATH)
    print "[%s] Starting scan" % datetime.now()
    print "Scanning..."
    with packet_handler as ph:
        sniff(iface=sys.argv[1], prn=ph.handle_packet)

if __name__=="__main__":
    main()
我想强调的主要改进是:

  • 输出文件在
    \uuuu enter\uuuu
    方法期间仅打开一次,该方法在输入
    with
    语句时调用

  • 与分析输出文件以确定是否已经遇到某个客户机不同,将维护一个局部变量以保存所有检测到的客户机。检查此变量比打开和读取输出文件更有效


  • 我想我让它工作了。我为mac读取了它,如果找到它,它会将一个变量设置为true,然后中断,否则它会继续检查。然后我有另一个if语句检查变量,以决定是否需要添加mac,因为它不存在。如果我理解正确,您仍然会在每个数据包上打开文件两次,但已将两者分开,以便它们不会混合。这将解决问题,但仍然不如我上面的建议有效(不过,这在您的情况下可能并不重要)。不管怎么说,既然这个答案解决了你的问题,请考虑一下。请注意,绝对没有义务做这些事情。我不太清楚你的意思,我以为我就是这么做的。我不知道如何让代码正确显示。。。但是如果你能给我看代码,那将是一个很大的帮助!到目前为止,我得到的是:我已经编辑了我的答案,并为您提供了一个示例实现,您可以在此基础上进行构建。