IEEE802.11数据帧在Linux上的抓取(4)

事情往往要比你想的复杂得多,如果你认为上面的工作已经完成了一大半,那就大错特错了,实际完成的工作才不到1%...!!!我的ralink无线网卡的驱动在2.6.32上根本就编译不过,后来找了一个Debian4的虚拟机,编译过了,可是没法识别USB2.0的无线网卡,于是索性安装VMWare-tools,折腾了一上午,费了好大劲,终于装上了VMWare-tools,还是无法识别,于是就又开了一个RedHat虚拟机,内核版本2.6.18-92.el5,终于既可以编译驱动又可识别网卡了,...期间,装一台物理机器的心都有了!接下来终于改修改代码了,一打开驱动源码,MD,全部是从Windows的NDIS驱动里面移植过来的,Linux内核提供的诸多的802.11适配代码完全没有使用,全部都是自己编写的,仅仅在最上端使用register_netdevice之类的接口和内核衔接。

困难一波接着一波,那就一个一个解决。虽然NDIS的代码不是很熟悉,但基本的逻辑还是清楚的。在$SRC/sta/rtmp_data.c中找到了STAHandleRxDataFrame函数,就是它了:

// 1. skip 802.11 HEADER   {       pRxBlk->pData += LENGTH_802_11;       pRxBlk->DataSize -= LENGTH_802_11;   }  

一下子就找准了,skip 802.11 HEADER说明没有skip之前就是802.11帧了,于是将上述的list_for_each_entry_rcu代码加到这个代码上面,然而且慢,我们需要自己构造skb啊,这可真的麻烦了,因为这个驱动完全是自己处理的,没有用到skb...不管怎么说,在写构造skb的代吗之前先用printk将802.11帧打印出来再说,于是添加的代吗变成了下面的样子:

{       int i = 0;       char *p = pRxBlk->pData;       printk("###################### begin:%d\n", pRxBlk->DataSize);       for (i = 0; i < pRxBlk->DataSize; i++) {           printk("%02X ", *p & 0x000000ff);           p++;       }       printk("%d \n", ret);       printk("###################### end\n");   }  

然后编译,加载rt3070sta.ko,调用以下的命令:
ifconfig ra0 up
iwconfig ra0 mode Managed
iwcondig ra0 essid "zhaoya"
ifconfig ra0 190.168.1.123/24
ping 190.168.1.100

使用dmesg查看的结果如下:

IEEE802.11数据帧在Linux上的抓取


这里就不再解释802.11帧每一个字段的具体含义了,涉及到很多细节,比如to ap,from ap等等,不管怎么说,成功抓取了802.11的帧,接下来就是如何使用正规的方法来做了,所谓的正规方法就是使用AF_PACKET套接字。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pxgxg.html