Author: gkruse Date: 2007-01-29 22:31:33 +0100 (Mon, 29 Jan 2007) New Revision: 220 Added: trunk/Sources/WaveDrivers/WaveDriverKismet.h trunk/Sources/WaveDrivers/WaveDriverKismet.m Log: Forgot two important files on the last commit ;) Added: trunk/Sources/WaveDrivers/WaveDriverKismet.h =================================================================== --- trunk/Sources/WaveDrivers/WaveDriverKismet.h 2007-01-29 21:22:31 UTC (rev 219) +++ trunk/Sources/WaveDrivers/WaveDriverKismet.h 2007-01-29 21:31:33 UTC (rev 220) @@ -0,0 +1,46 @@ +/* + + File: WaveDriverKismet.m + Program: KisMAC + Author: Geordie Millar + themacuser@xxxxxxxxx + Description: Scan with a Kismet server in KisMac. + + This file is part of KisMAC. + + KisMAC is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + KisMAC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with KisMAC; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#import <Foundation/Foundation.h> +#import "WaveDriver.h" +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + + +@interface WaveDriverKismet : WaveDriver { + int fd; + int sockd; + struct sockaddr_in serv_name; + int status; + struct hostent *hp; + UInt32 ip; + int port; + const char *hostname; +} + ++ (int) kismetInstanceCount; +@end Added: trunk/Sources/WaveDrivers/WaveDriverKismet.m =================================================================== --- trunk/Sources/WaveDrivers/WaveDriverKismet.m 2007-01-29 21:22:31 UTC (rev 219) +++ trunk/Sources/WaveDrivers/WaveDriverKismet.m 2007-01-29 21:31:33 UTC (rev 220) @@ -0,0 +1,208 @@ +/* + + File: WaveDriverKismet.m + Program: KisMAC + Author: Geordie Millar + themacuser@xxxxxxxxx + Description: Scan with a Kismet server in KisMac. + + This file is part of KisMAC. + + KisMAC is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + KisMAC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with KisMAC; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#import "WaveDriverKismet.h" +#import "WaveHelper.h" +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <sys/uio.h> +#include <unistd.h> +#include "80211b.h" + +static int KismetInstances = 0; + +@implementation WaveDriverKismet + +- (id)init { + self = [super init]; + if (!self) return nil; + + NSUserDefaults *defs; + defs = [NSUserDefaults standardUserDefaults]; + + char* initstr = "!0 ENABLE NETWORK bssid,type,wep,signal,maxrate,channel,ssid\n"; + + sockd = socket(AF_INET, SOCK_STREAM, 0); + if (sockd == -1) { + NSLog(@"Socket creation failed!"); + NSRunCriticalAlertPanel( + NSLocalizedString(@"Could not connect to the Kismet server", "Error dialog title"), + NSLocalizedString(@"Socket creation failed! This really shouldn't happen!", "LONG desc"), + OK, Nil, Nil); + return nil; + } + + hostname = [[defs objectForKey:@"kismetserverip"] cString]; + port = [[defs objectForKey:@"kismetserverport"] intValue]; + + ip = inet_addr(hostname); + + serv_name.sin_addr.s_addr = ip; + serv_name.sin_family = AF_INET; + serv_name.sin_port = htons(port); // option as well + + status = connect(sockd, (struct sockaddr*)&serv_name, sizeof(serv_name)); + + if (status == -1) { + NSLog(@"Could not connect to %s port %d", hostname, port); + NSRunCriticalAlertPanel( + NSLocalizedString(@"Could not connect to the Kismet server", "Error dialog title"), + [NSString stringWithFormat:@"KisMac could not connect to the Kismet server at %s port %d. Check the IP address and port.",hostname,port], + OK, Nil, Nil); + return nil; + } + + write(sockd, initstr, strlen(initstr)); + + KismetInstances++; + + return self; +} + ++(int) kismetInstanceCount { + return KismetInstances; +} + +#pragma mark - + ++ (enum WaveDriverType) type { + return activeDriver; +} + ++ (NSString*) description { + return NSLocalizedString(@"Kismet Server, Passive Mode", "long driver description"); +} + ++ (NSString*) deviceName { + return NSLocalizedString(@"Kismet Server", "short driver description"); +} + +#pragma mark - + ++ (bool) loadBackend { + return YES; +} + ++ (bool) unloadBackend { + return YES; +} + +#pragma mark - + +- (NSArray*) networksInRange { + int len,i,j,flags,t,signalint; + int usenetarray = 0; + char netbuf[2048]; + unsigned int bssidbyte; + char bssidstring[6]; + NSString *netrcvd, *name; + NSArray *netarray,*rcvd,*rcvd2,*rcvd3,*bssidar; + NSDictionary *nets; + NSData *bssid; + NSNumber *signal,*noise,*channel,*capability,*isWPA; + + if((len = read(sockd, &netbuf[0], 2048)) < 0) { // read it in + NSLog(@"Kismet Server read failed"); // we can't read in! + return NO; + } + + netarray = [NSArray array]; + netrcvd = [NSString stringWithCString:netbuf length:len]; + rcvd2 = [netrcvd componentsSeparatedByString:@"\n"]; // split packet into lines + int arrayCount = [rcvd2 count]; + for (i = 0; i < arrayCount; i++) { // iterate through each line - 1 line = 1 network + @try { + netrcvd = [rcvd2 objectAtIndex:i]; // put the current object into netrcvd + rcvd = [netrcvd componentsSeparatedByString:@"\x01"]; // strip the SSID out + rcvd3 = [[rcvd objectAtIndex:0] componentsSeparatedByString:@" "]; // strip the rest down + if ([[rcvd3 objectAtIndex:0] isEqualToString:@"*NETWORK:"]) { // if this is a line specifying a new network + bssidar = [[rcvd3 objectAtIndex:1] componentsSeparatedByString:@":"]; // get the BSSID + + for (j=0; j<6; j++) { + sscanf([[bssidar objectAtIndex:j] cString], "%x", &bssidbyte); // convert it from ascii 12:34:56 into raw binary + bssidstring[j] = bssidbyte; + } + + bssid = [NSData dataWithBytes:bssidstring length:6]; // bssid, simple enough + signalint = [[rcvd3 objectAtIndex:4] intValue]; // signal level, as an int + if (signalint > 1000 || signalint < 0) { signalint = 0; } // sometimes it comes through as an invalid number + signal = [NSNumber numberWithInt:signalint]; // signal level as NSNumber + noise = [NSNumber numberWithInt:0]; // this is only subtracted from signal, not needed + channel = [NSNumber numberWithInt:[[rcvd3 objectAtIndex:6] intValue]]; // channel + + flags = 0; + + if ([[rcvd3 objectAtIndex:3] intValue] == 2) { + flags = flags | IEEE80211_CAPINFO_PRIVACY_LE; // if it's 2, it's WEP + } + + if ([[rcvd3 objectAtIndex:3] intValue] > 2) { // it's either not WEP, or it's some other encryption scheme + isWPA = [NSNumber numberWithInt:1]; // it's WPA + } else { + isWPA = [NSNumber numberWithInt:0]; // it's open, or we don't know what it is + } + + t = [[rcvd3 objectAtIndex:2] intValue]; // network type + + if (t == 0) { + flags = flags | IEEE80211_CAPINFO_ESS_LE; // it's managed + } else if (t == 1) { + flags = flags | IEEE80211_CAPINFO_IBSS_LE; // it's adhoc + } else if (t == 2) { + flags = flags | IEEE80211_CAPINFO_PROBE_REQ_LE; // it's a probe request + } + capability = [NSNumber numberWithInt:flags]; + name = [rcvd objectAtIndex:1]; + nets = [NSDictionary dictionaryWithObjectsAndKeys:bssid,@"BSSID",signal,@"signal",noise,@"noise",channel,@"channel",isWPA,@"isWPA",name,@"name",capability,@"capability",nil]; + netarray = [netarray arrayByAddingObject:nets]; + usenetarray = 1; // we do want to send the result + } + } + @catch (NSException *exception) { + NSLog(@"Invalid message, ignored"); // if an invalid message came in, ignore it instead of crashing + } + } + if (usenetarray == 1) { return netarray; } else { return nil; } // return the result +} + +#pragma mark - + +- (void) hopToNextChannel { + return; +} + +#pragma mark - + +-(void) dealloc { + KismetInstances--; + close(sockd); + + [super dealloc]; +} + + +@end