2015-04-26 3 views
1

Хорошо, поэтому я пытаюсь создать файл csv со списком всех MAC-адресов и SSID, которые были замечены. Это код, который у меня до сих пор, большая часть его: http://edwardkeeble.com/2014/02/passive-wifi-tracking/ Я использую python 2.7.Запись MAC-адресов в csv с использованием scapy и python

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: и time.sleep (2)», чтобы попытаться предотвратить это, но, похоже, не помогло.

То, что я пытаюсь сделать, это войти на дату/время, когда MAC видно, чтобы создать список уникальных МКВ, но это не совсем делать это ....

ответ

1

Вы не должны писать к вашему выходному файлу во время чтения с него. В настоящее время вы обновляете содержимое logmacs.csv в PrintPacket, итерации по нему в CheckCsv.

Я бы изменил реализацию (и имя) CheckCsv, чтобы сохранить отслеживаемые пакеты в какую-либо новую переменную в памяти и проверить, должен ли выходной файл обновляться на основе этой новой введенной переменной. У этого есть дополнительное преимущество, что он также намного более эффективен.

Я бы также открыл файл для записи только один раз, а не в каждой записи (попробуйте использовать class, а не function).


EDIT:

В ответ на запрос о разъяснении здесь является базовая реализация, которая является по руководящим принципам я целился:

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() 

основных улучшений, которые я бы хотели бы выделить:

  1. Выходной файл открывается только один раз, в течение метода __enter__, который вызывается при вводе инструкции with.

  2. Вместо анализа выходного файла, чтобы узнать, был ли обнаружен определенный клиент, локальная переменная поддерживается для хранения всех обнаруженных клиентов. Проверка этой переменной намного эффективнее, чем открытие и чтение выходного файла.

+0

У меня это работает, я думаю. Я прочитал его для mac, а затем, если он найден, он устанавливает переменную в true, а затем ломается, иначе она продолжает проверять. Тогда у меня есть другой оператор if, проверяющий переменную, чтобы решить, нужно ли мне добавлять mac, потому что он еще не существует. – Gaudard

+0

Если я правильно вас понимаю, вы все равно открываете файл дважды на каждом пакете, но отделили два, чтобы они не смешивались. Это решило бы проблему, но все же менее эффективно, чем мое предложение выше (однако это может быть не критично в вашем случае). В любом случае, поскольку этот ответ решил вашу проблему, пожалуйста, рассмотрите [голосование] (http://meta.stackexchange.com/q/173399) и [принятие] (http://meta.stackexchange.com/q/5234) Это. Обратите внимание, что нет абсолютно никаких обязательств в отношении любого из них. – Yoel

+0

Я не совсем уверен, что вы имеете в виду, я думал, что это то, что я сделал. Я не могу понять, как правильно получить код ... но если бы вы могли показать мне код, который будет большой помощью! Вот что у меня есть до сих пор: https://github.com/gaudard/scripts/blob/master/Python/MACAddrScanner.py – Gaudard

Смежные вопросы