added list support
authorhackbard <hackbard>
Mon, 2 Dec 2002 23:35:24 +0000 (23:35 +0000)
committerhackbard <hackbard>
Mon, 2 Dec 2002 23:35:24 +0000 (23:35 +0000)
Makefile
hdw-sniff.c
hdw-sniff.h
list.c [new file with mode: 0644]
list.h [new file with mode: 0644]

index 8a234aa..fb4a778 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -9,5 +9,6 @@ TARGETS = hdw-sniff
 all: $(TARGETS)
 
 hdw-sniff:
-       $(CC) $(CFLAGS) -Wall hdw-sniff.c $(LDFLAGS) -o hdw-sniff 
+       $(CC) $(CFLAGS) -Wall list.c hdw-sniff.c $(LDFLAGS) -o hdw-sniff 
+#      $(CC) $(CFLAGS) -Wall hdw-sniff.c $(LDFLAGS) -o hdw-sniff
 
index 08f6998..0c73bc9 100644 (file)
@@ -86,9 +86,12 @@ int main(int argc, char *argv[]) {
                return 1;
        }
        
-       /* grab a package until user breaks */
+       /* set info struct */
        my_info_struct.count=0;
        my_info_struct.mmode=argv[2][0];
+       my_info_struct.ssid_list=(struct list *)malloc(sizeof(struct list));
+       my_info_struct.ssid_list->next=NULL;
+       // strcpy(my_info_struct.ssid_list->ssid,"test");
        strcpy(my_info_struct.dev,argv[1]);
 
        /* prepare for select */
@@ -124,7 +127,7 @@ void pcap_process(u_char *info,const struct pcap_pkthdr *pcap_header,
                        const u_char *package) {
        
        /* local variables */
-       char tmp_buf[20],crypted_snap[11];
+       char tmp_buf[20],crypted_snap[12],tmp_buf1[10],tmp_buf2[32];
        struct linux_wlan_ng_prism_hdr *prism_hdr;
        struct ieee802_11_hdr *w_hdr;
        struct snaphdr *snap_hdr;
@@ -155,7 +158,7 @@ void pcap_process(u_char *info,const struct pcap_pkthdr *pcap_header,
 
        /* wireless stuff */
        /* prism wlan ng headers */
-       if((my_info_struct->mmode-0x30==1) &
+       if((my_info_struct->mmode-0x30==1) &
                (strncmp(my_info_struct->dev,"wlan",4)==0)) {
        printf("prism header: (%d bytes)\n",p_o);
        prism_hdr=(struct linux_wlan_ng_prism_hdr *)package;
@@ -194,10 +197,14 @@ void pcap_process(u_char *info,const struct pcap_pkthdr *pcap_header,
        else if((w_hdr->frame_ctl & IEEE802_11_STYPE_PROBE_RESP)>0)
                strcpy(tmp_buf,"probe response");
        else if((w_hdr->frame_ctl & IEEE802_11_STYPE_BEACON)==IEEE802_11_STYPE_BEACON) {
-               // beacon_hdr=(struct beacon_struct *)(package+p_o+w_o);
-               // printf("ssid: ");
-               // for(i=0;i<(((beacon_hdr->ssid)&0x2)>>
-               // strcpy(tmp_buf,"beacon");
+               beacon_hdr=(struct beacon_struct *)(package+p_o+w_o);
+               beacon_hdr->ssid_s.elementid==0?strcpy(tmp_buf1,"essid = ")
+                                               :strcpy(tmp_buf1,"ibssid = ");
+               strncpy(tmp_buf2,beacon_hdr->ssid_s.ssid,
+                               beacon_hdr->ssid_s.length);
+               tmp_buf2[beacon_hdr->ssid_s.length]='\0';
+               strcpy(tmp_buf,"beacon");
+               add_ssid_2_list(tmp_buf2,my_info_struct->ssid_list);
        }
        else if((w_hdr->frame_ctl & IEEE802_11_STYPE_ATIM)>0)
                strcpy(tmp_buf,"announcement traffic indication message");
@@ -212,7 +219,7 @@ void pcap_process(u_char *info,const struct pcap_pkthdr *pcap_header,
        else strcpy(tmp_buf,"control & data frame type not supported yet");
        /* print out frame type */
        printf("=> %s\n",tmp_buf);
-       
+       printf("   %s%s\n",tmp_buf1,tmp_buf2);
        printf("duration/id: 0x%x\n",w_hdr->duration_id);
        printf("version check ... %s\n",
        ((w_hdr->frame_ctl & IEEE802_11_FCTL_VERS)==0x00)?
@@ -221,7 +228,7 @@ void pcap_process(u_char *info,const struct pcap_pkthdr *pcap_header,
 
        /* ethernet */
        if((strncmp(my_info_struct->dev,"eth",3)==0) | 
-               ((w_hdr->frame_ctl & IEEE802_11_FTYPE_DATA)>0)) {
+       ((w_hdr->frame_ctl & IEEE802_11_FTYPE_DATA)==IEEE802_11_FTYPE_DATA)) {
 
        if(!(w_hdr->frame_ctl & IEEE802_11_FTYPE_DATA)) {
                printf("ethernet: (%d bytes)\n",e_o);
@@ -246,34 +253,38 @@ void pcap_process(u_char *info,const struct pcap_pkthdr *pcap_header,
                   (snap_hdr->snap[5]==0x00)) {
                        printf("- no encryption!\n");
                        if(snap_hdr->proto==ntohs(ETH_P_IP)) {
-                               /* we want ip header to get parsed */
-                               e_hdr->h_proto=htons(ETH_P_IP);
                                e_o=sizeof(struct snaphdr);
                        }
                }
                else {
                        printf("- crypted packet!\n");
                        /* print crypted snap - write into file */
-                       printf("snap: (iv + crypted aa aa 03 00 00 00) ");
+                       printf("snap: (iv(3) + index(1) + crypted snap(6)) ");
                        for(i=0;i<10;i++) {
                                printf("%x ",*(snap_hdr->snap+i));
                                crypted_snap[i]=*(snap_hdr->snap+i);
-                               // if(file_fd>0) 
-                               //      write(file_fd,snap_hdr->snap+i-4,1);
                        }
+                       /*
+                       crypted_snap[4]^=0xaa;
+                       crypted_snap[5]^=0xaa;
+                       crypted_snap[6]^=0x03;
+                       crypted_snap[7]^=0x00;
+                       crypted_snap[8]^=0x00;
+                       crypted_snap[9]^=0x00;
+                       */
+
                        printf("\n");
-                       crypted_snap[10]='\n';
+                       crypted_snap[10]='\0';
+                       crypted_snap[11]='\n';
                        if(file_fd>0) {
                                printf("debug: saved to file\n");
                                write(file_fd,crypted_snap,11);
                        }
-                       /* dont look at ipheader */
-                       e_hdr->h_proto=htons(0);
                }
        }
 
-               /* IP ? */
-       if(ntohs(e_hdr->h_proto)==ETH_P_IP) {
+       /* IP ? */
+       if((ntohs(e_hdr->h_proto)==ETH_P_IP) | (ntohs(snap_hdr->proto)==ETH_P_IP)) {
                printf("ip protocol: (%d bytes)\n",i_o);
                ip_hdr=(struct iphdr *)(package+p_o+w_o+e_o);
                printf("version = %x ",ntohs(ip_hdr->version));
@@ -305,10 +316,12 @@ void pcap_process(u_char *info,const struct pcap_pkthdr *pcap_header,
        for(i=p_o+w_o;i<pcap_header->caplen;i++)
                printf("%x ",*(package+i));
        printf("\n");
+#ifdef DEBUG_CHAR
        printf("all dump: (char)\n");
        for(i=p_o+w_o;i<pcap_header->caplen;i++)
                printf("%c ",*(package+i));
        printf("\n");
+#endif
 }
 
 int hop_channel(struct info_struct *info,int foo_fd) {
@@ -320,7 +333,6 @@ int hop_channel(struct info_struct *info,int foo_fd) {
 
        memset(&my_iwreq,0,sizeof(my_iwreq));
        strcpy(my_iwreq.ifr_name,info->dev);
-       printf("debug: channel = %d\n",info->channel);
        my_iwreq.u.freq.e=0;
        my_iwreq.u.freq.m=info->channel;
        if((ioctl(foo_fd,SIOCSIWFREQ,&my_iwreq))==-1) {
index 76eee82..38b2db9 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/wireless.h>
+#include "list.h"
 
 #define C_MAX 14
 
@@ -18,16 +19,31 @@ struct info_struct {
                 char dev[10];   /* device */
                 char mmode;     /* monitor type ... and later more */
                int channel;    /* current freq channel */
+               struct list *ssid_list; /* pointer to ssid list */
 };
 
 /* hop_chanel function */
 int hop_channel(struct info_struct *info,int foo_fd);
 
+/* ssid struct */
+struct ssid_struct {
+               unsigned char elementid;        /* element id */
+               unsigned char length;           /* length of ssid */
+               unsigned char ssid[32];         /* ssid */
+} __attribute__ ((packed));
+
 /* beacon header */
 struct beacon_struct {
-               long int timestamp;             /* time stamp */
+               long long timestamp;            /* time stamp */
                unsigned short interval;        /* beacon interval field */
                unsigned short capability;      /* capability field */
-               unsigned char ssid;             /* ssid field */
+               struct ssid_struct ssid_s;      /* ssid field */
 } __attribute__ ((packed));
 
+/* association request header */
+struct asso_req_struct {
+               unsigned short capability;      /* capability field */
+               unsigned short listeninterval;  /* listen interval field */
+               unsigned short ssid;            /* ssid field */
+               /* supported rates missing */
+} __attribute__ ((packed));
diff --git a/list.c b/list.c
new file mode 100644 (file)
index 0000000..03fec7c
--- /dev/null
+++ b/list.c
@@ -0,0 +1,33 @@
+/* manage sniffed stuff in linked lists
+ *
+ * author: hackbard@hackdaworld.dyndns.org
+ *
+ */
+
+#include "list.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+char sys_call[20];
+
+int add_ssid_2_list(char *ssid, struct list *my_list) {
+
+       struct list *new_entry;
+
+       if(my_list->next==NULL) {
+               // printf("debug: new ssid found!\n");
+               sprintf(sys_call,"flite \"new ssid. %s\"",ssid);
+               system(sys_call);
+               new_entry=(struct list *)malloc(sizeof(struct list));
+               my_list->next=new_entry;
+               strcpy(my_list->ssid,ssid);
+               new_entry->next=NULL;
+       } else if(!strcmp(my_list->ssid,ssid)) {
+       /* do nothing! */
+       } else {
+               add_ssid_2_list(ssid,my_list->next);
+       }
+       return 1;
+}
diff --git a/list.h b/list.h
new file mode 100644 (file)
index 0000000..b554914
--- /dev/null
+++ b/list.h
@@ -0,0 +1,13 @@
+/*
+ * list header file
+ *
+ */
+
+/* data structures */
+struct list {
+       char ssid[32];          /* ssid */
+       struct list *next;      /* pointer to next list */
+};
+
+/* prototypes */
+int add_ssid_2_list(char *ssid, struct list *my_list);