]> git.sesse.net Git - wardrive/blob - bt-remote.c
Added preliminary protocol information.
[wardrive] / bt-remote.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <bluetooth/bluetooth.h>
7 #include <bluetooth/rfcomm.h>
8 #include <sys/ioctl.h>
9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11                         
12 int parse_packet(unsigned char *buf, unsigned bytes, int sock)
13 {
14         char *ptr;
15         int ret = 0;
16         buf[bytes + 1] = 0;
17
18         ptr = strtok((char *)buf, "\n");
19         while (ptr) {
20                 if (strncmp(ptr, "*NETWORK: ", 10) == 0) {
21                         char bssid[32];
22                         int crypted, weak, signal, noise;
23                         if (sscanf(ptr, "*NETWORK: %s %d %d %d %d", bssid, &crypted, &weak, &signal, &noise) != 5) {
24                                 printf("Couldn't parse NETWORK packet\n");
25                         } else {
26                                 if (strcmp(bssid, "00:0D:54:A0:27:7F") == 0) {
27                                         char str1[64], str2[64], str3[64], str4[64];
28                                         short len;
29                                         sprintf(str1, "Crypted: %d", crypted);
30                                         sprintf(str2, "Weak IVs: %d", weak);
31                                         sprintf(str3, "Signal level: %d dB", signal);
32                                         sprintf(str4, "Noise level: %d dB", noise);
33                                         
34                                         write(sock, "\000\001", 2);
35                                         len = htons(2 * 4 + strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4));
36                                         write(sock, (char*)&len, 2);
37                                         
38                                         len = htons(strlen(str1));
39                                         write(sock, (char*)&len, 2);
40                                         write(sock, str1, strlen(str1));
41
42                                         len = htons(strlen(str2));
43                                         write(sock, (char*)&len, 2);
44                                         write(sock, str2, strlen(str2));
45
46                                         len = htons(strlen(str3));
47                                         write(sock, (char*)&len, 2);
48                                         write(sock, str3, strlen(str3));
49
50                                         len = htons(strlen(str4));
51                                         write(sock, (char*)&len, 2);
52                                         write(sock, str4, strlen(str4));
53                                         
54                                         ret = 1;
55                                 }
56                         }
57                 }
58                 ptr = strtok(NULL, "\n");
59         }
60
61         return ret;
62 }
63
64 int main(int argc, char **argv)
65 {
66         struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
67         struct sockaddr_in addr;
68         unsigned char buf[1024] = { 0 };
69         char initstr[] = "!1 ENABLE NETWORK bssid,cryptpackets,weakpackets,signal,noise\n";
70         int s, client, kismet, bytes_read;
71         size_t opt = sizeof(rem_addr);
72         unsigned one = 1;
73         
74         // allocate socket
75         s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
76         
77         // bind socket to port 1 of the first available 
78         // local bluetooth adapter
79         loc_addr.rc_family = AF_BLUETOOTH;
80         loc_addr.rc_bdaddr = *BDADDR_ANY;
81         loc_addr.rc_channel = (uint8_t) 1;
82         bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr));
83
84         // put socket into listening mode
85         listen(s, 1);
86
87         // accept one connection
88         client = accept(s, (struct sockaddr *)&rem_addr, &opt);
89
90         ba2str( &rem_addr.rc_bdaddr, buf );
91         fprintf(stderr, "accepted connection from %s\n", buf);
92         memset(buf, 0, sizeof(buf));
93
94         ioctl(client, FIONBIO, &one);
95         
96         // connect to kismet
97         kismet = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
98         addr.sin_family = AF_INET;
99         addr.sin_addr.s_addr = inet_addr("127.0.0.1");
100         addr.sin_port = htons(2501);
101
102         if (connect(kismet, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
103                 perror("connect()");
104                 exit(1);
105         }
106         ioctl(kismet, FIONBIO, &one);
107         write(kismet, initstr, strlen(initstr));
108         
109         printf("Connected to Kismet.\n");
110
111         // read data from the client
112         for ( ;; ) {
113                 int flag = 1;
114
115                 // gobble up data from the phone
116                 bytes_read = read(client, buf, sizeof(buf) - 1);
117                 if( bytes_read > 0 ) {
118                         unsigned i;
119                         printf("received [");
120                         for (i = 0; i < bytes_read; ++i)
121                                 printf("0x%02x ", buf[i]);
122                         printf("]\n");
123                 }
124                 
125                 // read from kismet
126                 bytes_read = read(kismet, buf, sizeof(buf));
127                 if( bytes_read > 0 ) {
128                         unsigned i;
129                         for (i = 0; i < bytes_read; ++i)
130                                 printf("%c", buf[i]);
131
132                         flag = parse_packet(buf, bytes_read, client);
133                 }
134
135                 if (flag) {
136                         // alive?
137                         write(client, "\000\012\000\000", 4);
138                         sleep(1);
139                 }
140         }
141
142         // close connection
143         close(client);
144         close(s);
145         return 0;
146 }
147