期末计算机网络课程设计让做一个网络嗅探器,要求可以检测和选择网卡,并打开到混杂模式,监听局域网中的所有数据包并解析出所用网络协议以及首部各个字段的值,如 MAC地址,IP地址,端口号等。
然后从网上各种找资料,C语言下基本上都是基于 winpcap包做的,难的是配置环境。网上有各种 VS的配置教程,但是本人用不惯 VS,所以就配置了 DEV C++,朋友也有把 codeblocks 配置成功的。下面就和大家分享一下配置过程。参考文章:DEV 搭建winpcap开发环境。
首先要下载 winpcap的两个东西:
WinPcap V4.1.2:驱动程序、Dll文件
http://www.winpcap.org/install/bin/WinPcap_4_1_2.exe
WinPcap V4.1.2 Developer’s Pack:库文件、头文件、简单的示例程序代码和帮助文件
http://www.winpcap.org/install/bin/WpdPack_4_1_2.zip
第一个 exe文件直接安装到任意目录即可。第二个 zip文件下载解压后将名为 WpdPack的文件夹放到 C盘下,当然放到别的地方也可以。
配置步骤:
第一步:
在Tools->Compiler Options->Directories->Libraries (即工具->编译选项->目录->库) 里面设置winpcap开发包目录的Lib目录;在Tools->Compiler Options->Directories->Includes(即工具->编译选项->目录->C/C++包含文件)(C和C++两个我都设置了,方便)里面设置winpcap开发包目录的Include目录。
这里的 lib目录和include目录就是上面 zip文件解压后的 C:\WpdPack 中的文件夹。
第二步:
在Project->Project Options->Parameters->Linker(即项目->项目属性->参数->链接)下面点击“Add Library or Object”(加入库或对象)按钮,将开发包目录 Lib下的wpcap.lib文件(即 C:\WpdPack\Lib 目录下的文件)添加上去。
第三步:
在源码文件#include "pcap.h"的前面增加预处理定义——#define WPCAP和#define HAVE_REMOTE。好像我只加了“#define HAVE_REMOTE”,例子中的代码就可以运行了。但是看文档中,好像不是这样,具体好要多测试一些代码才能知道。
上面的步骤是其他 ****博客上给的,但是在实际操作的时候还需要加上 #include "winsock.h" 这句话,包含 winsock.h 头文件,不然会提示某些变量未定义的错误。此外在上面第二步中还需要加入 C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib/WS2_32.Lib 这个文件,不然也是会报一些乱七八糟的错误。
至此开放环境就配置好了,然后就是编写代码。先给出一个 winpcap中文技术文档。嗅探器的代码基本上都是这里面的原码,然后在它的基础上改一下、拼接一下就可以了。大体流程是检测网卡->选择网卡->筛选器的设置(可以只捕捉使用upd或tcp等协议的包)->将捕捉到的数据包分析。
另外DEV C++在编译运行的时候需要选择 32位的编译器,这个我也不知道为什么……自己试出来的。
再另,网络嗅探器捕捉到的大多数都是乱码,因为编码方式是多种多样的。可以使用 ICMP协议中的 ping命令,ping通某个网站,然后将捕获的数据包以 ascii码形式输出,将会是有规矩的字符。
这里要提一下的是,分析数据包的时候好像没有现成的函数或数据结构等,需要自己定义。比如要定义 IP协议的首部,根据每个字段的含义解析,这里充分利用了二进制的相与、左移、右移等操作。另,我们捕获到的数据包是完整的 MAC帧,也就是数据链路层的包,然后可以根据使用的协议确定协议首部的长度,并进一步确定数据部分的位置和大小。
运行效果如下:
最后附上上面说的用到的各种文件以及源代码的下载地址:源码及配套文件下载。