以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 安全理论 』  (http://bbs.xml.org.cn/list.asp?boardid=65)
----  [原创]Winpcap学习第五天  (http://bbs.xml.org.cn/dispbbs.asp?boardid=65&rootid=&id=33468)


--  作者:binaryluo
--  发布时间:6/1/2006 9:26:00 AM

--  [原创]Winpcap学习第五天
处理离线的存储文件(offline dump file)

    Winpcap提供了一些函数把网络通信保存到文件并且可以读取这些文件的内容。dump文件的格式跟libpcap是一样的。它以二进制形式保存了被捕获的数据包的数据并且其他网络工具(包括WinDump,Ethereal,Snort)也以此为标准。

处理dump文件的程序结构跟前面的程序结构大致是一样的,只是这里出现了几个新的函数:(试验代码略)

函数1:

pcap_dumper_t* pcap_dump_open(pcap_t*    p,

                                                  const char* fname)

    打开一个保存数据包的文件。“-”的含义跟stdout是一样的。发生错误时返回NULL。p是一个由pcap_open_offline()或pcap_open_live()返回的pcap结构体;fname指定了文件的名字。你也可以调用pcap_dump_fopen()把数据包保存到一个已存在的流fp中,在Windows中,这个流必须以二进制方式打开。如果返回NULL,pcap_geterr()会显示错误信息。

函数2:

void pcap_dump(u_char*                          user,

const struct pcap_pkthdr* h,

const u_char*                   sp)

    把数据包保存到硬盘。pcap_dump()把数据包输出到pcap_dump_open()打开的文件中。注意,它的参数要跟pcap_dispatch()或pcap_loop()的回调函数的参数一致。如果直接被调用,则user这个参数的类型应该是pcap_dumper_t,也就是pcap_dump_open()的返回值类型。

在读取dump文件的内容时,用pcap_open_offline()来打开dump文件,然后用pcap_loop()来顺序读取数据包。读数据包跟接收数据包的过程是一样的。

函数3:

int pcap_live_dump(pcap_t*     p,

                            char*         filename,

                            int             maxsize,

                            int             maxpacks)

    保存数据包到文件。pcap_live_dump()把网络通信从一个接口保存到一个文件中。这个函数将运行在核心态(kernel level),因此它的效率比pcap_dump()的更高。它的参数是一个用pcap_open_live()获得的接口描述符,一个dump文件名的字符串,文件的最大尺寸(maxsize,以字节为单位)和文件能容纳的数据包的最大个数(maxpcaks)。把maxsize或maxpacks设置为0意味着没有限制。当达到maxsize或maxpacks时,存储结束。注意,当两个限制(maxsize,maxpacks)中的一个到达时,存储将停止,但是文件仍然是被打开的。为了正确的保存数据并且使文件处于一致状态,必须用pcap_close()关闭适配器。

      pcap_live_dump()和pcap_ dump()的区别是设置限制和性能。pcap_live_dump()使用Winpcap NPF驱动在核心态进行转储,最大限度的降低了上下文的交换次数和内存副本数。pcap_live_dump()在其他操作系统上是不可用的,它是Winpcap特定的函数,只能在Win32上使用。

函数4:

pcap_t* pcap_open_offline(const char*           fname,

char*               errbuf)

    为读数据包打开一个tcpdump/libpcap格式的文件。Fname指定了要打开的文件名,“-”的含义与stdin是一样的。你也可以调用pcap_fopen_offlline()从一个已经存在的流fp中读取数据。注意,在Windows中,这个流必须以二进制方式打开。errbuf保存pcap_open_offline()出错是返回的错误信息。


--  作者:jiaozi1216
--  发布时间:8/10/2006 9:34:00 AM

--  
顶一下
--  作者:qqcszrzr
--  发布时间:8/15/2006 1:53:00 PM

--  
还不错!!!!!!!
看你写的这些我也真是想学啊~~~~~~~
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms