网络编程学习日记(2)_利用WinPcap实现ARP的发送和接受

网络编程学完以太网帧的结构,就开始正式进入IP层的学习了,在学习编程之前,对网络协议的有一定的了解,而且还要知道每个数据包,或者是报文,或者是帧他们每个字节 的含义

玩ARP么,肯定得知道他的原理,我就不做什么说明了,书上一大堆的

首先是ARP的接收,来看一下程序的流程

获取网络设备列表

pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf)

然后人机交互一下,获得需要工作的网卡

打开需要的网卡

(adhandle= pcap_open(d->name, // 设备名

65536, // 要捕捉的数据包的部分

// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容

PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式

1000, // 读取超时时间

NULL, // 远程机器验证

errbuf // 错误缓冲池

)

检查数据链路层,我们只考虑以太网

pcap_datalink(adhandle) != DLT_EN10MB

编译过滤器

pcap_compile(adhandle, &fcode, packet_filter, 1, netmask)

设置过滤器

pcap_setfilter(adhandle, &fcode)

开始捕捉数据包

pcap_loop(adhandle, 0, packet_handler, NULL)

packet_hanler回调函数,就是每次接收到过滤之后的数据包使用的函数

/* 回调函数,当收到每一个数据包时会被libpcap所调用 */

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const
u_char *pkt_data)

这就是整个流程了,程序只监控,所以是没有结束的,除非用户结束

我不喜欢在这里贴出很多代码,只是简单说一下写时候的注意点

源代码我发到了CSDN,后面会给出网址,如果不能下,可以在Baidu联系我,小弟能帮上忙就一定帮的

整个程序的注意点

  1. 结构的定义,写完整个程序,包括ARP接受,发送,欺骗,我最大的感觉就是关于数据长度的重要性,以前不以为意,只是觉得可以省空间,也不觉得64位和32位有 什么区别,不过写完网络数据包的分析,就觉得数据长度控制很重要,所以就算有指针,也是需要定义被指向目标的长度。因为指针的出现,数据的转换实在是变得太方便了。可 以直接把WinPcap捕捉到的数据直接往后移动14个单位长度,获得ip头,而忽略前面14字节的以太网头部。

  2. unsigned char, unsigned short, unsigned int等非负数据的使用和转换必须非常小心,因为插入断电看到的数据未必就 是真实的数据,压根看不出真实数据,我后来使用Ethereal来进行数据包的监控,非常有效,Ethereal是一款GUI界面的网络数据包监控软件,非常好用,他 本身也是基于WinPcap的。

  3. 安全性的控制,程序的框架,其实我是使用的WinPcap自带代码的框架,安全控制几乎是步步为营,刚开始我认为有点大题小做,后来把程序移植到别的机子上运行 ,真的发现安全控制做的真好,每一步都可以知道问题出在哪里,防止更多错误出现。

  4. 有一个MacToStr()的函数写的非常巧妙,是课本上面的事例程序,使用了位运算,本来还有一个IpToStr(),不过似乎出现了一些问题,于是我的Ma c地址存储在u_char[6]里面,而Ip地址存储在ip_address里面,自定义了一个结构,这个也是学习WinPcap示例代码的。我觉得自定义结构使用更 方便高效。

  5. 网络存储字节高地位和本地存储高地位是相反的,有几个函数专门用来转换的,我直接使用的自己人工把那几个自己转换的

  6. printf使用很方便,这点要感谢暑假Acm训练…

接受数据包其实非常简单,几乎就是简单的把WinPcap使用了一下

本程序源代码的下载地址([http://download.csdn.net/source/647852](http://download.csdn.net/ source/647852))其实很简单,如果有WinPcap开发文档,自己写也差不多

我现在已经写完了欺骗了,会逐渐把自己的心的经验拿上来分享一下

这几天看MFC图形界面,网络编程方面在看使用WinAPI来发送数据包,这样就可以不用装WinPcap了

想不适用WinPcap就直接使用WinPcap的函数,我正在尝试,光考出几个dll还不够,还要一个npf.sys支持,我也是今天刚看到资料,待会儿在机房做完 测试会写个帖子的。

呼呼,就写这么点了,晚上图形实验课在机房做ARP欺骗,老师的防火墙一直叫,嘿嘿,不过大家都有360防火墙,倒没什么事故。

系统重装了,打好多补丁啊,还有好多软件重装…郁闷…

老系统用了2年没重装了,也到寿命了…


原文链接: 网络编程学习日记(3)_利用WinPcap实现ARP的发送和接受 | Log4D

3a1ff193cee606bd1e2ea554a16353ee

欢迎关注我的微信公众号:窥豹

窥豹