使用Libpcap库捕获局域网中的IP包
实验要求
- 打印数据包的源与目的物理地址;
- 打印源IP与目的IP地址;
- 打印出上层协议类型;
- 如果上层协议为TCP或UDP协议,打印目的与源端口信息;
- 如果上层协议为TCP或UDP协议,将数据以16进制与ASCII的两种方式同时打印出来,不可打印字符以‘.’代替;
00000 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1…
实验环境
Red Hat 9
代码
控制单句输出格式控制数据包数据的输出格式
打印MAC地址的函数
打印IP地址的函数
对捕获到的数据包进行处理判断网络层协议
判断传输层协议
主函数控制运行输入的参数个数,运行时除了输入可执行文件名,还需输入一个参数网卡
pcap_open_live获得用于捕获网络数据包的数据包捕获描述字,参数依次为【指定打开的网络设备名】,【捕获数据的最大字节数】,【是否将网络接口置于混杂模式】,【指定超时时间】,【函数出错时传递错误信息】
pcap_lookupnet获得指定网络设备的网络号和掩码,参数分别为【指定打开的网络设备名】,【bpf_u_int32指针】,【bpf_u_int32指针】,【出错时保存错误消息】
pcap_compile将字符串参数指定的字符串编译到过滤程序中,这里指定过滤条件为source IP为虚拟机IP:192.168.xxx.xxx,pcap_setfilter指定一个过滤程序
pcap_loop参数分别为【winpcap的句柄】,【指定捕获的数据包个数,若为-1则无限循环捕获】,【回调函数】,【可供用户使用的参数】
安装好libpcap后,编译写好的程序gcc -o lpcaptest lpcaptest.c -lpcap
运行输入命令./lpcaptest eth0,部分结果如下,通过观察,抓取到的数据包的source IP都是192.168.xxx.xxx,dest IP都是192.168.xxx.x