2 * main.c - main hdw-sniff
4 * Copyright (C) 2004 hackbard@hackdaworld.dyndns.org
10 void parse_package(unsigned char *ptr,const struct pcap_pkthdr *pcap_header,const unsigned char *package);
14 int get_user_event(t_info *info) {
16 if(read(0,&event,1)!=1) {
17 perror("reading user interaction failed");
20 printf("user event: %c ",event);
22 info->mode^=MODE_HEXOUT;
23 printf("- hex output: %c\n",info->mode&MODE_HEXOUT?'a':'n');
26 info->mode^=MODE_ASCIIOUT;
27 printf("- ascii output: %c\n",info->mode&MODE_ASCIIOUT?'a':'n');
30 info->mode|=MODE_QUIT;
31 printf("- shutting down!\n");
38 puts("usage: hdw-sniff <options>");
40 puts("\t\t-m <mode> \tmonitor and/or wlanng");
41 puts("\t\t-d <device> \twlan0,eth0");
42 puts("\t\t-l <logfile>");
43 puts("\t\t-k <key> \t(string)");
44 puts("\t\t-h \tdisplay this help message");
48 int hop_channel(t_info *info) {
52 if(info->current_channel>=CHANNEL_MAX) info->current_channel=1;
53 memset(&iwreq,0,sizeof(iwreq));
54 strcpy(iwreq.ifr_name,info->device);
56 iwreq.u.freq.m=info->current_channel;
57 if(ioctl(info->channel_hop_fd,SIOCSIWFREQ,&iwreq)<0) {
58 puts("unable to hop channel");
62 ++(info->current_channel);
66 int main(int argc, char **argv) {
73 char sys_call[MAX_SYSCALL_CHARS];
74 char pcap_error[PCAP_ERRBUF_SIZE];
76 memset(&info,0,sizeof(t_info));
88 if(!strncmp(argv[i+1],"monitor",7)) {
89 info.mode|=MODE_MONITOR;
90 puts("will go to monitor mode.");
92 else if(!strncmp(argv[i+1],"wlanng",6)) {
93 info.mode|=MODE_WLANNG;
94 puts("expecting wlanng header in package.");
97 printf("unknown mode: %s\n",argv[1]);
103 if ((info.logfile_fd=open(argv[i+1],O_RDWR|O_CREAT))!=0)
104 printf("logfile -> %s\n",argv[i+1]);
106 puts("warning: can't write to logfile.");
110 strncpy(info.device,argv[i+1],MAX_DEV_CHARS);
123 /* setting up device */
124 if(info.mode&MODE_MONITOR) {
125 sprintf(sys_call,"iwconfig %s mode monitor",info.device);
126 puts("set monitoring mode ...");
129 sprintf(sys_call,"ifconfig %s up",info.device);
130 puts("setting up device ...");
134 if((info.pcap_handle=pcap_open_live(info.device,BUFSIZ,1,-1,pcap_error))==NULL)
136 printf("%s: %s\n",argv[0],pcap_error);
139 pcap_fd=pcap_fileno(info.pcap_handle);
140 /* -> non blocking? */
142 /* socket fd for channel hopping */
143 info.channel_hop_fd=socket(AF_INET,SOCK_DGRAM,0);
145 /* parse packages until user breaks */
146 while(!(info.mode&MODE_QUIT))
148 /* watch pcap_fd and stdin (reading) */
150 FD_SET(pcap_fd,&fds);
152 hop_f.tv_sec=HOP_SEC;
153 hop_f.tv_usec=HOP_USEC;
155 if(select(pcap_fd+1,&fds,NULL,NULL,&hop_f)) {
157 get_user_event(&info);
158 else if(FD_ISSET(pcap_fd,&fds))
159 pcap_dispatch(info.pcap_handle,-1,parse_package,(unsigned char *)&info);
167 puts("thanks for using hdw-sniff (C) 2005 hackbard");
169 puts("bugreports: hackbard@hackdaworld.dyndns.org");