Here it is; sloppy but works great! It's written so that perl beginners can understand it.
#!/usr/bin/perl -w
use Net::Pcap;
my $err;
my $dev = $ARGV[0];
my $object;
$object = Net::Pcap::open_offline($dev, \$err);
unless (defined $object) {
die 'Unable to create packet capture on device ', $dev, ' - ', $er
+r;
}
Net::Pcap::loop($object, -1, \&callback_function, '');
Net::Pcap::close($object);
sub callback_function {
my ($user_data,$header,$packet) =@_;
if (length($packet)>36) {
my $o = unpack ('H2*',substr($packet,0,1)); #find out what kind of
+ packet it is
if ($o eq "80") { #if it is a broadcast
my $sourcemac = unpack ('H12',substr($packet,10,6)); #the packet
+s source mac address
my $len = hex unpack ('H2',substr($packet,37)); #get the size of
+ the ssid
my $bs = unpack ('H12',substr($packet,16,6)); #get the basestati
+on mac
$ssid=unpack ('A*',substr($packet,38,$len)); #get the ssid
if ($len==0) { #if the ssid isnt broadcasted
$ssid=">no ssid<";
}
print "Beacon Frame: source mac:",$sourcemac," basestation id: $
+bs other: ",$o," ssid: $ssid
len: $len\n";
}
if ($o eq "40") { #if it's a probe for ssid's
my $offmac=unpack ('H12',substr($packet,10,6)); #get the source
+mac
print "PROBE! source mac: $offmac\n";
}
if ($o eq "50") { #if it's a probe response
my $offmac=unpack ('H12',substr($packet,5,6));
my $sourcemac = unpack ('H12',substr($packet,10,6));
my $bs = unpack ('H12',substr($packet,16,6));
my $len = hex unpack ('H2',substr($packet,37));
my $ssid=unpack ('A*',substr($packet,38,$len));
if ($len==0) {
$ssid=">no ssid<";
}
print "PROBE RESPONSES! source mac: $offmac $len $ssid\n";
}
}
}
|