2.winpcap的实现方法:-----------------------------------------------------------------------
winpcap驱动包,是我们玩转数据包不可或缺的好东东,winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报,主要为我们提供了四大功能:
功能:
1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3> 在网络上发送原始的数据报;
4> 收集网络通信过程中的统计信息
1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3> 在网络上发送原始的数据报;
4> 收集网络通信过程中的统计信息
如果环境允许的话(比如你做的不是木马程序),我还是推荐大家用winpcap来截获数据包,因为它的功能更强大,工作效率更高,唯一的缺点就是在运行用winpcap开发的程序以前,都要在主机上先安装winpcap的driver。
而且一会我们就会发现它比raw socket功能强大的多,而且工作得更为底层,最明显的理由就是raw socket捕获的数据包是没有以太头的,此乃后话。
至于怎么来安装使用,请参考本系列的系列一《手把手教你玩转ARP包中的》,里面有详细的加载winpcap驱动的方法^_^
废话不多说了,让我们转入正题, 具体用winpcap来截获数据包需要做如下的一些工作:
A . 枚举本机网卡的信息(主要是获得网卡的名称)
其中要用到pcap_findalldevs函数,它是这样定义的
|
B. 打开相应网卡并设置为混杂模式:
在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。
我们主要是要用到 pcap_open_live 函数,不过这个函数winpcap的开发小组已经建议用pcap_open 函数来代替,不过因为我的代码里面用的就是pcap_open_live,所以也不便于修改了,不过pcap_open_live使用起来也是没有任何问题的,下面是pcap_open_live的函数声明:
|
功能:
根据网卡名字打开网卡,并设置为混杂模式,然后返回其句柄
参数:
Device : 就是前前面我们获得的网卡的名字;
Snaplen : 我们从每个数据包里取得数据的长度,比如设置为100,则每次我们只是获得每个数据包 100 个长度的数据,没有什么特殊需求的话就把它设置为65535最大值就可以了;
Promisc:这个参数就是设置是否把网卡设置为“混杂模式”,设置为 1 即可;
to_ms : 超时时间,毫秒,一般设置为 1000即可。
返回值:
pcap_t : 类似于一个网卡“句柄”之类的,不过当然不是,这个参数是后面截获数据要用到的。
虽然看起来比较复杂,不过用起来还是非常简单的,其实 1 行就OK了:
|
C. 截获数据包并保存为文件:------------------------------------------------------
当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据包的那一瞬间进行分析,转眼就没了^_^
所以,为了便于日后分析,所以高手以及我个人经常是把数据包保存下来的慢慢分析的。