#! /usr/bin/env perl
#16:44:00.094758 1.0 Mb/s 2427 MHz 11b -53dBm signal antenna 1 Probe Request (M-PM-0M-PM-1M-PM-2M-PM-3M-PM-4M-PM-5M-QM-^QM-PM-6M-PM-7M-PM-8M-PM-9M-PM-:) [1.0 2.0 5.5 11.0 Mbit]
# 0x0000: 0018 d0b0 d0b1 d0b2 d0b3 d0b4 d0b5 d191
# 0x0010: d0b6 d0b7 d0b8 d0b9 d0ba 0104 0204 0b16
# 0x0020: 3208 0c12 1824 3048 606c 0301 072d 1a2c
# 0x0030: 0103 ff00 0000 0000 0000 0000 0000 0000
# 0x0040: 0000 0000 0000 0000 00dd 0700 50f2 0800
# 0x0050: 5400
#use strict;
sub capture {
my $iface = shift;
my % hashes;
open my $fd, "tcpdump -nxi $iface subtype probe-req |" or die $!;
my @bytes;
while ( < $fd> ) {
if ( /^ \s* ( 0x\w+ ) : \s+ ( .+ ) / ) {
push @bytes, hex( $_) for $2 = ~ / \w{ 2 } / g;
}
elsif ( @bytes) {
shift @bytes;
my $essid_length = shift @bytes;
my $essid = join '' , map chr, @bytes[ 0 .. $essid_length - 1 ] ;
unless ( $hashes{ $essid} ) {
$hashes{ $essid} = 1 ;
print "$essid\n " ;
}
@bytes = ( ) ;
}
}
close $fd;
}
my $iface = @ARGV ? $ARGV[ 0 ] : 'wlan0' ;
capture( $iface) ;
IyEgL3Vzci9iaW4vZW52IHBlcmwKIzE2OjQ0OjAwLjA5NDc1OCAxLjAgTWIvcyAyNDI3IE1IeiAxMWIgLTUzZEJtIHNpZ25hbCBhbnRlbm5hIDEgUHJvYmUgUmVxdWVzdCAoTS1QTS0wTS1QTS0xTS1QTS0yTS1QTS0zTS1QTS00TS1QTS01TS1RTS1eUU0tUE0tNk0tUE0tN00tUE0tOE0tUE0tOU0tUE0tOikgWzEuMCAyLjAgNS41IDExLjAgTWJpdF0KIwkweDAwMDA6ICAwMDE4IGQwYjAgZDBiMSBkMGIyIGQwYjMgZDBiNCBkMGI1IGQxOTEKIwkweDAwMTA6ICBkMGI2IGQwYjcgZDBiOCBkMGI5IGQwYmEgMDEwNCAwMjA0IDBiMTYKIwkweDAwMjA6ICAzMjA4IDBjMTIgMTgyNCAzMDQ4IDYwNmMgMDMwMSAwNzJkIDFhMmMKIwkweDAwMzA6ICAwMTAzIGZmMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAKIwkweDAwNDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwZGQgMDcwMCA1MGYyIDA4MDAKIwkweDAwNTA6ICA1NDAwCgojdXNlIHN0cmljdDsKCnN1YiBjYXB0dXJlIHsKICAgIG15ICRpZmFjZSA9IHNoaWZ0OwogICAgbXkgJWhhc2hlczsKICAgIG9wZW4gbXkgJGZkLCAidGNwZHVtcCAtbnhpICRpZmFjZSBzdWJ0eXBlIHByb2JlLXJlcSB8IiBvciBkaWUgJCE7CiAgICBteSBAYnl0ZXM7CiAgICB3aGlsZSAoPCRmZD4pIHsKICAgICAgICBpZiAoL15ccyooMHhcdyspOlxzKyguKykvKSB7CiAgICAgICAgICAgIHB1c2ggQGJ5dGVzLCBoZXgoJF8pIGZvciAkMiA9fiAvXHd7Mn0vZzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKEBieXRlcykgewogICAgICAgICAgICBzaGlmdCBAYnl0ZXM7CiAgICAgICAgICAgIG15ICRlc3NpZF9sZW5ndGggPSBzaGlmdCBAYnl0ZXM7CiAgICAgICAgICAgIG15ICRlc3NpZCA9IGpvaW4gJycsIG1hcCBjaHIsIEBieXRlc1swIC4uICRlc3NpZF9sZW5ndGggLSAxXTsKICAgICAgICAgICAgdW5sZXNzICgkaGFzaGVzeyRlc3NpZH0pIHsKICAgICAgICAgICAgICAgICRoYXNoZXN7JGVzc2lkfSA9IDE7CiAgICAgICAgICAgICAgICBwcmludCAiJGVzc2lkXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBieXRlcyA9ICgpOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRmZDsKICAgIAp9CgpteSAkaWZhY2UgPSBAQVJHViA/ICRBUkdWWzBdIDogJ3dsYW4wJzsKY2FwdHVyZSgkaWZhY2UpOwoK