那么在哪里可以看到802.11帧呢?我们不得不靠猜测来找到它。鉴于各个厂商的实现不一致,可以使用Windows开发工具箱中的dumpbin来查看具体的网卡驱动,我这里使用的是
athur.sys/netathur.inf/athurext.cat,dumpbin结果如下:
在实在看不出结果的情况下,可以考虑memcpy这个超级底层库函数,因为几乎所有的模块都涉及到内存拷贝,而数据帧从硬件到内存也会涉及到memcpy,当然这只是猜测,实现者完全可以不使用库函数,直接使用指针运算,然而这种实现难道可以商业化吗,因此我敢肯定商业代码中的帧拷贝操作[几乎]一定用了memcpy。
然而问题来了,使用memcpy的操作太多了,到底哪个是复制802.11帧的呢?这就牵扯到了如何过滤802.11帧的问题了。这需要你对802.11帧格式有着深刻的理解,才能在茫茫内存中发现802.11帧。ndiswrapper的driver里面有个crt.c文件,封装C库供ntoskernel以及NDIS调用,修改其中的memcpy就好了,以下是我的一个修改,仅仅过滤802.11的纯数据帧,一种是FromAP的,另一种是ToAP的,关键不同点是第二个字节代表From AP和To AP:
noregparm void *WIN_FUNC(_win_memcpy,3)
(void *to, const void *from, SIZE_T n)
{
#ifdef DUMP_802_11
#define 80211_MINLEN 24
#define 80211_CTRL 0x88
#define 80211_TOAP 0x01
#define 80211_FROMAP 0x02
//最短的帧头24字节
if (n > 80211_MINLEN) {
int i = 0;
char *search = from;
for (i = 0; i < n-1; i++, search++) {
//寻找802.11帧的控制字段;
//可能会将非802.11帧然而恰好匹配的也匹配进来
if (((*search & 0x000000ff) == 80211_CTRL) &&
(*(search+1) == 80211_TOAP ||
*(search+1) == 80211_FROMAP)) {
if (n-i > 80211_MINLEN) {
int j = 0;
char *frame = search;
//将其后的帧体打印出来
printk("###### memcpy #####n");
for (j = 0; j < n-i; j++, frame++) {
printk("%02X ", *frame & 0x000000ff );
}
printk("n###### memcpy END#####n");
}
break;
}
}
}
#endif
return memcpy(to, from, n);
}
上面的过滤算法不一定是最高效的,然而只求说明问题。除此之外,这个算法还有以下的问题:
1.字节匹配使用了遍历搜索,其实还可以使用诸如二分等方式优化;
2.不能解决802.11帧分批copy的情况,如果一个帧分好几次copy将无法得到整个帧,甚至帧头都无法取得;
3.如果Windows驱动程序根本就没有使用memcpy进行帧拷贝,比如使用DMA零拷贝技术。那此方法将完全失效;
重新
make -C $ndiswrapper_dir
运行
ndiswrapper -l确认下面的行
netathur : driver installed
device (0CF3:1006) present
运行
modprobe ndiswrapper
配置wlan0的IP地址以及连接接入点,然后ping 190.168.1.100,参见下面的图片确认地址信息,以便和抓包结果比对:
最后,dmesg的结果如下:
这就说明,802.11数据帧已经被dump了下来。不管怎么说,总算是抓到了802.11帧,也是一件不容易的事,虽然还有很多改进的空间。如此之工作完成,以后就可以尽情分析802.11网络上的种种怪事了,还不错...
原文链接: https://blog.csdn.net/dog250/article/details/7772801
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/409064
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!