修改NDIS库的实现来抓取802.11帧看似简单,实则困难。原因就在于NDIS只是Windows网络驱动的一套框架,类似Linux的Netfilter,它看重的是接口而不是实现,特别对于小端口驱动,最终只要将数据和上层驱动接口即可,具体读写设备的逻辑完全对外是封闭的。而对于Windows平台上的TP-Link无线网卡驱动,正是小端口驱动的典范,因此别指望它大量调用NDIS函数,它只需要最终调用NdisMIndicateReceivePacket即可,而NdisMIndicateReceivePacket所做的就是调用Linux的netif_rx将数据包交给Linux,在此之前,802.11帧和以太帧的适配转换工作已经在“小端口驱动的实现”中完成了。
那么在哪里可以看到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网络上的种种怪事了,还不错...
分享到:
相关推荐
适合想要替换指定内核,内核却因过时而被删除的人儿们
ndiswrapper-1.54.tar.gz
ndiswrapper是Linux用于安装无线网卡驱动的一款软件。 ndiswrapper调用Windows下的驱动为Linux系统所用。
ndiswrapper可以把windows下的驱动程序文件直接可以放在linux下使用,将设备驱动起来- 这是为大家找来的最新的版本
自水星MW150UH驱动提取,可作为NdisWrapper安装Linux无线网卡驱动的原料。 本人使用win7 32位驱动成功安装Linux无线网卡驱动
一款将window下的无线网卡驱动运行在linux系统中的辅助软件,使用方便。使用方法参考 https://blog.csdn.net/ccboy2009/article/details/47986247
1.sudo apt-get install ndiswrapper-common ndiswrapper-utils-1.9 2./etc/modules:添加ndiswarapper 目的让其在系统启动时自动加载 3.解压驱动 4.进入驱动解压目录:sudo ndiswrapper -i netathur.inf 5....
linux system software ndiswrapper-1.53, used by loading netcard
用于移植无线网卡到linux上,但又没有linux下的驱动的
用他来加载xp下网卡驱动,功能还是不错的
ndiswrapper 作为Linux 内核的一个模块,
通过ndiswrapper工具,可以将无线网卡的windows下的驱动安装到linux下,如ubuntu上。
linux下通过ndiswrapper安装usb无线网卡驱动,ndiswrapper软件和驱动都已经在里面了,按照文档的步骤驱动都会装成功的,我们公司都是这样装得。
blacklist ndiswrapper 4、编辑/etc/sysconfig/modules/kmod-wl.modules写入以下内容 #!/bin/bash for M in lib80211 cfg80211 wl; do modprobe $M &>/dev/null done 这样,驱动就会开机启动啦!
将Windows Dynamic Link库移植到Linux简介此存储库包含一个库,该库允许本机Linux程序从Windows DLL加载和调用函数。 作为演示,我已将Windows移植...peloader目录包含一个自ndiswrapper派生的自定义PE / COFF加载器。
Linux 内核的 NDIS 驱动程序包装器
有一个解决方案适用于很多的网卡,一个名为ndiswrapper的程序能够让LINUX核心模块加载Windows下的某些无线网卡驱动,这样可以让便携机在没有可用的Linux驱动情况下使用无线网卡。本文将为大家介绍如何在Linux系统...
便携式计算机内置的无线功能很多不支持Linux,有一个解决方案适用于很多的网卡,一个名为ndiswrapper的程序能够让LINUX核心模块加载Windows下的某些无线网卡驱动,这样可以让便携机在没有可用的Linux驱动情况下使用...