commit often and soon
[my-code/hdw-sniff.git] / parse.c
1 /*
2  * parse.c - parsing of pcap packages
3  *
4  * author: hackbard@hackdaworld.dyndns.org
5  *
6  */
7
8 #include "parse.h"
9 #include "main.h"
10
11 /* all the parsing stuff will go here
12  *
13  * different protocols should get to seperated files though ...
14  */
15
16 unsigned int int_s(unsigned int val) {
17
18   unsigned int swapped;
19
20   swapped=(val&0x000000ff)<<24;
21   swapped|=(val&0x0000ff00)<<8;
22   swapped|=(val&0x00ff0000)>>8;
23   swapped|=(val&0xff000000)>>24;
24
25   return swapped;
26 }
27
28 int switch_active_state(char *state) {
29
30   switch(*state) {
31     case '-':
32       *state='\\';
33       break;
34     case '\\':
35       *state='|';
36       break;
37     case '|':
38       *state='/';
39       break;
40     default:
41       *state='-';
42       break;
43   }
44
45   return 23;
46 }
47
48 void parse_package(unsigned char *ptr,const struct pcap_pkthdr *pcap_header,const unsigned char *pkg) {
49
50   t_info *info;
51   int i;
52   t_sta new_sta;
53   t_sta *sta;
54   unsigned char *package=NULL;
55   t_frame4_hdr *f4hdr;
56   t_frame3_hdr *f3hdr;
57   //t_frame2_hdr *f2hdr;
58   //t_frame1_hdr *f1hdr;
59   t_beacon_fb *beacon_fb;
60   unsigned char *data;
61   t_prism_hdr *prismhdr=NULL;
62   int ret;
63   char string[MESSAGE_MAX];
64   char sc[MAX_SYSCALL_CHARS];
65   unsigned char new;
66   unsigned char foo;
67
68   info=(t_info *)ptr;
69
70   info->count++;
71
72   memset(&new_sta,0,sizeof(t_sta));
73   new=0;
74   foo=0;
75
76   if(info->dump_fd!=0) {
77     ret=write(info->dump_fd,pcap_header,sizeof(struct pcap_pkthdr));
78     if(ret!=sizeof(struct pcap_pkthdr))
79       display_console(info,"warning, pcap header write failed!");
80     ret=write(info->dump_fd,package,pcap_header->caplen);
81     if(ret!=pcap_header->caplen)
82       display_console(info,"warning, package write failed!");
83   }
84   
85   /* prism or ieee802.11 header ? */
86   if(info->mode&MODE_IEEE80211) {
87     package=(unsigned char *)pkg;
88     prismhdr=NULL;
89   }
90   else if(info->mode&MODE_PRISM) {
91     package=(unsigned char *)pkg+sizeof(t_prism_hdr);
92     prismhdr=(t_prism_hdr *)pkg;
93   }
94
95   /* management */
96   if(FCTL_TYPE(package[0])==FCTL_TYPE_MGMT) {
97     info->count_m++;
98
99     /* beacon frames */
100     if(FCTL_STYPE(package[0])==FCTL_STYPE_BEACON) {
101       f3hdr=(t_frame3_hdr *)package;
102       beacon_fb=(t_beacon_fb *)(package+sizeof(t_frame3_hdr));
103       // check sta
104       memcpy(new_sta.addr,f3hdr->addr2,ADDR_LEN);
105       memcpy(new_sta.bssid,f3hdr->addr3,ADDR_LEN);
106       ret=list_search_data(&(info->sniffed_sta),&new_sta,ADDR_LEN);
107       if((ret==L_EMPTY_LIST)|(ret==L_NO_SUCH_ELEMENT)) {
108         list_add_element(&(info->sniffed_sta),&new_sta,sizeof(t_sta));
109         sta=(t_sta *)info->sniffed_sta.current->data;
110         new=1;
111       }
112       else sta=(t_sta *)info->sniffed_sta.current->data;
113       // fill in stuff ...
114       memcpy(sta->ssid,beacon_fb->ssid,beacon_fb->ssid_length);
115       if((CAP_INFO_ESS(beacon_fb->cap_info))&
116          (CAP_INFO_IBSS(beacon_fb->cap_info)==0)) sta->ap=AP;
117       if(CAP_INFO_PRIVACY(beacon_fb->cap_info)) sta->wep=WEP;
118       sta->count_mgmt++;
119       switch_active_state(&(sta->active));
120       if(info->mode&MODE_IEEE80211) sta->sq=0;
121       else if(info->mode&MODE_PRISM)
122         sta->sq=(prismhdr->signal.data)-(prismhdr->noise.data);
123       strncpy(string,"last: beacon, source: ",MESSAGE_MAX);
124       for(i=0;i<ADDR_LEN;i++)
125         snprintf(&string[22+3*i],4,"%02x%c",sta->addr[i],
126                  (i==ADDR_LEN-1)?'.':':');
127       string[22+3*ADDR_LEN+1]=0;
128       display_console(info,string);
129       if(new) {
130         snprintf(sc,MAX_SYSCALL_CHARS,
131                  "flite 'access point found: %s'",
132                  sta->ssid);
133         system(sc);
134         if(sta->wep&WEP) strncpy(sc,"flite ' crypted'",MAX_SYSCALL_CHARS);
135         else strncpy(sc,"flite 'not crypted'",MAX_SYSCALL_CHARS);
136         system(sc);
137       } 
138     }
139
140   }
141
142   /* control */
143   else if(FCTL_TYPE(package[0])==FCTL_TYPE_CTRL) {
144     info->count_c++;
145     display_console(info,"last: got control frame");
146   }
147
148   /* data */
149   else if(FCTL_TYPE(package[0])==FCTL_TYPE_DATA) {
150     info->count_d++;
151
152     //if(FCTL_STYPE(package[0])==FCTL_STYPE_DATA) {
153       if(FCTL_TODS(package[0])&FCTL_FROMDS(package[0])) {
154         f4hdr=(t_frame4_hdr *)package;
155         data=package+sizeof(t_frame4_hdr);
156         memcpy(new_sta.addr,f4hdr->addr4,ADDR_LEN);
157         foo=1;
158       }
159       else {
160         f3hdr=(t_frame3_hdr *)package;
161         data=package+sizeof(t_frame3_hdr);
162         if(FCTL_TODS(package[0])) {
163           memcpy(new_sta.addr,f3hdr->addr2,ADDR_LEN);
164           memcpy(new_sta.bssid,f3hdr->addr1,ADDR_LEN);
165         }
166         else if(FCTL_FROMDS(package[0])) {
167           memcpy(new_sta.addr,f3hdr->addr3,ADDR_LEN);
168           memcpy(new_sta.bssid,f3hdr->addr2,ADDR_LEN);
169         }
170         else {
171           memcpy(new_sta.addr,f3hdr->addr2,ADDR_LEN);
172           memcpy(new_sta.bssid,f3hdr->addr3,ADDR_LEN);
173         }
174       }
175       ret=list_search_data(&(info->sniffed_sta),&new_sta,ADDR_LEN);
176       if((ret==L_EMPTY_LIST)|(ret==L_NO_SUCH_ELEMENT)) {
177         list_add_element(&(info->sniffed_sta),&new_sta,sizeof(t_sta));
178         sta=(t_sta *)info->sniffed_sta.current->data;
179         new=1;
180       }
181       else sta=(t_sta *)info->sniffed_sta.current->data;
182       // fill in stuff ...
183       sta->count_data++;
184       switch_active_state(&(sta->active));
185       if(info->mode&MODE_IEEE80211) sta->sq=0;
186       else if(info->mode&MODE_PRISM)
187         sta->sq=(prismhdr->signal.data)-(prismhdr->noise.data);
188       if(new) {
189         strcpy(sc,"flite 'station found by data package'");
190         system(sc);
191       }
192       if(foo) {
193         sta->wds=1;
194         strcpy(sc,"flite 'wds package'");
195         system(sc);
196       }
197       memcpy(sta->snap,data,10);
198       if((data[0]==0xaa)&(data[1]==0xaa)&(data[2]==0x03)&
199          (data[3]==0x00)&(data[4]==0x00)&(data[5]==0x00)) {
200         sta->wep=0;
201         strcpy(sc,"flite 'not crypted'");
202         system(sc);
203       }
204       else {
205         sta->wep=WEP;
206         strcpy(sc,"flite ' crypted'");
207         system(sc);
208       }
209          
210     //}
211
212     display_console(info,"last: got data frame");
213   }
214
215
216 }