From 8f0f19923128195b051fa8194c7287f018615a6a Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Mon, 23 Jul 2012 16:47:20 +0200 Subject: [PATCH] First implementation for detected wifi cards database --- wifisniffer/wificards.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ wifisniffer/wifilogger.py | 45 +++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 wifisniffer/wificards.py diff --git a/wifisniffer/wificards.py b/wifisniffer/wificards.py new file mode 100644 index 0000000..b64d776 --- /dev/null +++ b/wifisniffer/wificards.py @@ -0,0 +1,57 @@ + +discovered = {} + + +def add_card ( mac , radio_hdr ) : + if not discovered.has_key( mac ) : + discovered[ mac ] = card( mac , radio_hdr['CHANNEL'] ) + print "INFO : adding node %3d , %s" % ( len(discovered) , mac ) + + +def add_full_card ( mac , tipo , subtype , radio_hdr ) : + if not discovered.has_key( mac ) : + discovered[ mac ] = card( mac , radio_hdr['CHANNEL'] , tipo ) + print "INFO : adding node %3d , %s" % ( len(discovered) , mac ) + elif not discovered[ mac ].tipo : + discovered[ mac ].tipo = tipo + elif discovered[ mac ].tipo != tipo : + print "WARNING : AP/STA mismatch on %s for %s" % ( subtype , mac ) + + +class card : + + def __init__ ( self , mac , channel=None , tipo=None ) : + self.mac = mac + self.fresh = True + self.tipo = tipo + self.channel = [] + self.rssi = [ 0 , 0 , 0 , 0 , 0 ] + self.sta = [] + if channel : + self.channel.append( "%s" % channel ) + + def add_rssi ( self , radio_hdr ) : + signal = int(radio_hdr['DBM_ANTSIGNAL']) + noise = int(radio_hdr['DBM_ANTNOISE']) + self.rssi[0] = self.rssi[0] + 1 + self.rssi[1] = self.rssi[1] + signal + self.rssi[2] = self.rssi[2] + signal**2 + self.rssi[3] = self.rssi[3] + noise + self.rssi[4] = self.rssi[4] + noise**2 + + def from_string ( self , str_list ) : + self.tipo = str_list.pop(0) + self.channel.extend( str_list.pop(0).split(",") ) + self.rssi = map( int , str_list.pop(0).split(",") ) + if str_list : + self.sta.extend( str_list.pop(0).split(",") ) + self.fresh = False + + def add_sta ( self , mac ) : + if mac not in self.sta : + self.sta.append( mac ) + + def __str__ ( self ) : + rssi_str = ",".join( map( str , self.rssi ) ) + return "%s %s %s %s %s" % ( self.mac , self.tipo , ",".join( self.channel ) , rssi_str , ",".join( self.sta ) ) + diff --git a/wifisniffer/wifilogger.py b/wifisniffer/wifilogger.py index 8b44527..4ee5f86 100755 --- a/wifisniffer/wifilogger.py +++ b/wifisniffer/wifilogger.py @@ -12,6 +12,7 @@ wlan = pyiw.WirelessInterface(iface) import time from ieee80211 import * +from wificards import * max_time = 15 * 60 tstamp = time.time() @@ -24,6 +25,17 @@ read_timeout = 100 # in milliseconds pc = pcapy.open_live(iface, max_bytes, promiscuous, read_timeout) +fd = open( "discovered.list" ) +for line in fd.readlines() : + items = line[:-1].split() + mac = items.pop(0) + discovered[ mac ] = card( mac ) + discovered[mac].from_string( items ) + if discovered[mac].tipo not in ( 'AP' , 'STA' , 'CELL' ) : + print "Unknwon type '%s' for %s" % ( discovered[mac].tipo , mac ) +fd.close() + + channel_hop = [ 30.0 , False ] def channel_change ( ) : @@ -196,6 +208,34 @@ def dealWithPacket ( hdr , data ) : pcktlen -= 6 + if frame_type == "MGT" : # addresses : dest orig BSSID + if len(maclist) != 3 : + print "ERROR : insuficientes macs (%d) en un MGT",len(maclist),pcktlen," %s"*len(maclist) % tuple(maclist) + else : + if frame_subtype == "BEACON" : + if maclist[0] == "FF:FF:FF:FF:FF:FF" : + add_full_card ( maclist[1] , 'AP' , frame_subtype , radio_hdr ) + discovered[ maclist[1] ].add_rssi( radio_hdr ) + if maclist[1] != maclist[2] : + add_full_card ( maclist[2] , 'CELL' , frame_subtype , radio_hdr ) + if maclist[1] not in discovered[ maclist[2] ].sta : + discovered[ maclist[2] ].add_sta( maclist[1] ) + else : + print "ERROR : non broadcast BEACON : %s %s %s" % tuple(maclist) + elif frame_subtype == "PROBE_REQ" : # Pueden ser al broadcast o una "reasociacion ?? + if maclist[0] == maclist[2] : + add_full_card ( maclist[1] , 'STA' , frame_subtype , radio_hdr ) + discovered[ maclist[1] ].add_rssi( radio_hdr ) + if maclist[0] != "FF:FF:FF:FF:FF:FF" : + add_full_card ( maclist[0] , 'AP' , frame_subtype , radio_hdr ) + if maclist[1] not in discovered[ maclist[0] ].sta : + discovered[ maclist[0] ].add_sta( maclist[1] ) + else : + print "ERROR : broken PROBE_REQ : %s %s %s" % tuple(maclist) + else : + print "WARNING : unhandled MGT subtype %s" % frame_subtype + + logfile.write( "%4s %13s %6s %4d [ %2d %2d ] read %4d missing %4d" % (frame_type,frame_subtype,direction,radio_hdr['CHANNEL'],radio_hdr['FLAGS'],radio_hdr['CHANNEL_BITMAP'],pointer,pcktlen) ) logfile.write( " = %s %s " % ( radio_hdr['DBM_ANTSIGNAL'] , radio_hdr['DBM_ANTNOISE'] ) ) logfile.write( " ; %4d %4d " % sequence ) @@ -225,3 +265,8 @@ except Exception , ex : logfile.close() +fd = open( "discovered.list" , "w" ) +for mac in discovered.keys() : + fd.write( "%s\n" % discovered[mac] ) +fd.close() + -- 1.7.9.5