more beacon work
[my-code/hdw-sniff.git] / main.c
1 /*
2  * main.c - main hdw-sniff
3  *
4  * Copyright (C) 2004/05 hackbard@hackdaworld.org
5  *
6  */
7
8 #include "main.h"
9
10 // void parse_package(unsigned char *ptr,const struct pcap_pkthdr *pcap_header,const unsigned char *package);
11
12 /* functions */
13
14 int display_console(t_info *info,char *string) {
15
16   int x,y,size;
17   t_display *display;
18   char help[32];
19
20   display=(t_display *)&(info->display);
21
22   x=display->max_x-1;
23   y=display->max_y-1;
24
25   size=strlen(string);
26
27   display_line(display,0,0,2,0,'-');
28   display_string(display,4,0,"sta",3);
29   display_line(display,8,0,12,0,'-');
30
31   display_string(display,13,0,"bssid",5);
32   display_line(display,19,0,23,0,'-');
33
34   display_string(display,25,0,"M",1);
35   display_line(display,27,0,x,0,'-');
36
37   //display_line(display,0,0,0,y,'|');
38   //display_line(display,x,0,x,y,'|');
39
40   /* footer */
41   display_line(display,0,y-3,x,y-3,'-');
42
43   memset(help,0,32);
44   snprintf(help,32,"total: %06d",info->count);
45   display_string(display,3,y-2,help,13);
46
47   memset(help,0,32);
48   snprintf(help,32,"management: %06d",info->count_m);
49   display_string(display,18,y-2,help,18);
50
51   memset(help,0,32);
52   snprintf(help,32,"control: %06d",info->count_c);
53   display_string(display,38,y-2,help,15);
54
55   memset(help,0,32);
56   snprintf(help,32,"data: %06d",info->count_d);
57   display_string(display,55,y-2,help,12);
58
59   display_line(display,0,y-1,x,y-1,'-');
60
61   display_draw(display);
62
63   return 23;
64 }
65
66 int noop(t_input *input,void *ptr) {
67
68   return 23;
69 }
70
71 int get_user_interaction(t_info *info) {
72
73   char *string;
74
75   string=(char *)malloc(info->display.max_x*sizeof(char));
76
77   input_get_event(&(info->input),noop,info);
78
79   /*
80   if(info->input.content[0]=='h') {
81     display_console(info,"hdw-sniff help:");
82     display_console(info,"h - print this help");
83     display_console(info,"x - enable/disable hex output");
84     display_console(info,"a - enable/disable ascii output");
85     display_console(info,"q - quit");
86     display_console(info,"console navigation: arrow up/down");
87     display_console(info,"network list navigation: page up/down");
88   }
89   */
90
91   if(info->input.content[0]=='x') {
92     info->mode^=MODE_HEXOUT;
93     display_console(info,"toggled hex output");
94   }
95
96   else if(info->input.content[0]=='a') {
97     info->mode^=MODE_ASCIIOUT;
98     display_console(info,"toggled ascii output");
99   }
100
101   else if(info->input.content[0]=='q') {
102     event_stop(&(info->event));
103     display_console(info,"quit!");
104   }
105
106   else {
107     snprintf(string,info->display.max_x,"unknown event (%x)",
108              info->input.content[0]);
109     display_console(info,string);
110   }
111
112   return 23;
113 }
114
115 int react_on_event(t_event *event,void *ptr) {
116
117   t_info *info;
118
119   info=(t_info *)ptr;
120
121   if(event_check(event,0)==E_FD_YES) get_user_interaction(info);
122   else pcap_dispatch(info->pcap_handle,-1,parse_package,(u_char *)ptr);
123
124   return 23;
125 }
126
127 int usage(void) {
128   puts("usage: hdw-sniff <options>");
129   puts("\toptions:");
130   puts("\t\t-m <mode> \tmonitor and/or wlanng");
131   puts("\t\t-d <device> \twlan0,eth0");
132   puts("\t\t-l <logfile>");
133   puts("\t\t-k <key> \t(string)");
134   puts("\t\t-D <file> \t(dump packages to file)");
135   puts("\t\t-h \tdisplay this help message");
136   puts("");
137
138   return 23;
139 }
140
141 int hop_channel(t_event *event,void *ptr) {
142  
143   struct iwreq iwreq;
144   t_info *info;
145
146   info=(t_info *)ptr;
147
148   if((info->current_channel>CHANNEL_MAX)|(info->current_channel==0))
149     info->current_channel=1;
150   memset(&iwreq,0,sizeof(iwreq));
151   strcpy(iwreq.ifr_name,info->device);
152   iwreq.u.freq.e=0;
153   iwreq.u.freq.m=info->current_channel;
154   if(ioctl(info->channel_hop_fd,SIOCSIWFREQ,&iwreq)<0) {
155     puts("unable to hop channel");
156     perror("ioctl");
157     return -23;
158   }
159   ++(info->current_channel);
160
161   return 23;
162 }
163
164 int main(int argc, char **argv) {
165
166   t_info info;
167   int pcap_fd;
168   int i;
169   char sys_call[MAX_SYSCALL_CHARS];
170   char pcap_error[PCAP_ERRBUF_SIZE];
171
172   memset(&info,0,sizeof(t_info));
173  
174  /* parse arguments */
175  for(i=1;i<argc;i++) {
176   if(argv[i][0]=='-') {
177    switch(argv[i][1]) {
178     case 'h':
179      usage();
180     case 'm':
181      if(!strncmp(argv[i+1],"monitor",7)) {
182       info.mode|=MODE_MONITOR;
183       puts("will go to monitor mode.");
184      }
185      else if(!strncmp(argv[i+1],"wlanng",6)) {
186       info.mode|=MODE_WLANNG;
187       puts("expecting wlanng header in package.");
188      }
189      else {
190       printf("unknown mode: %s\n",argv[1]);
191       return -23;
192      }
193      ++i;
194      break;
195     case 'l':
196      if((info.log_fd=open(argv[i+1],O_RDWR|O_CREAT))!=0)
197       printf("logfile -> %s\n",argv[i+1]);
198      else
199       puts("warning: can't write to logfile.");
200      ++i;
201      break;
202     case 'D':
203      if((info.dump_fd=open(argv[i+1],O_RDWR|O_CREAT))!=0)
204       printf("dump file -> %s\n",argv[i+1]);
205      else
206       puts("warning: can't dump to file.");
207      ++i;
208      break;
209     case 'd':
210      strncpy(info.device,argv[i+1],MAX_DEV_CHARS);
211      ++i;
212      break;
213     default:
214      usage();
215      return -23;
216    }
217   } else {
218    usage();
219    return -23;
220   }
221  }
222
223  /* setting up device */
224  if(info.mode&MODE_MONITOR) {
225   sprintf(sys_call,"iwconfig %s mode monitor",info.device);
226   puts("set monitoring mode ...");
227   system(sys_call);
228  }
229  sprintf(sys_call,"/sbin/ifconfig %s up",info.device);
230  puts("setting up device ...");
231  system(sys_call);
232
233  if(info.log_fd==0) {
234    if((info.log_fd=open("/tmp/hdw-sniff.log",O_RDWR|O_CREAT))!=0)
235      puts("using logfile /tmp/hdw-sniff.log ...");
236    else {
237      puts("failed to open logfile ...");
238      return -23;
239    }
240  }
241
242  /* pcap */
243  if((info.pcap_handle=pcap_open_live(info.device,BUFSIZ,1,-1,pcap_error))==NULL)
244  {
245   printf("%s: %s\n",argv[0],pcap_error);
246   return -23;
247  }
248  pcap_fd=pcap_fileno(info.pcap_handle);
249  /* -> non blocking? */
250
251  /* socket fd for channel hopping */
252  info.channel_hop_fd=socket(AF_INET,SOCK_DGRAM,0);
253
254  display_init(&(info.display),info.log_fd);
255
256  input_init(&(info.input),info.log_fd);
257  //input.mode=CONTENT_BUFFER;
258  input_ios_init(&info.input);
259
260  event_init(&(info.event),info.log_fd);
261  event_set_timeout(&(info.event),HOP_SEC,HOP_USEC);
262
263  event_math(0,&(info.event),READ,ADD);
264  event_math(pcap_fd,&(info.event),READ,ADD);
265
266  list_init(&(info.sniffed_sta),info.log_fd);
267
268  display_console(&info,"foo");
269
270  event_start(&(info.event),&info,react_on_event,hop_channel);
271
272  input_shutdown(&(info.input));
273  display_shutdown(&(info.display));
274  
275  puts("");
276  puts("");
277  puts("thanks for using hdw-sniff (C) 2004/05 hackbard");
278  puts("");
279  puts("bugreports: hackbard@hackdaworld.org");
280
281  return 23;
282 }