现在的位置: 首页 > 综合 > 正文

【笔记】wincap处理脱机堆文件

2013年12月24日 ⁄ 综合 ⁄ 共 7568字 ⁄ 字号 评论关闭

 

  WinPcap提供了很多函数来将网络数据流保存到文件并读取它们。堆文件的格式是libpcap的一种。这种格式中,包含了被捕捉到的包的二进制数据,并且,这种格式是许多网络工具所使用的一种标准,这些工具包括WinDump,Etheral和Snort。

  一、保存数据包到堆文件
  首先,如何将一个数据包写成libpcap的格式。接下来的例子讲从一个选定的接口捕获数据包,并且将它们保存到用户指定的文件中。
 

说明:

  1、只有当接口打开时,调用 pcap_dump_open() 才是有效的。 这个调用将打开一个堆文件,并将它关联到特定的接口上。 
  2、数据包将会通过pcap_dump()函数写入堆文件中,这个函数是packet_handler()的回调函数。pcap_dump()的参数和pcap_handler()函数中的参数是一一对应的。

  二、

从堆文件中读取数据包
  既然有了可用的堆文件,那就能读取它的内容了。以下代码将打开一个WinPcap/libpcap的堆文件,并显示文件中每一个包的信息。文件通过pcap_open_offline()打开,然后使用 pcap_loop() 来有序获取数据包。你可以看到,从脱机文件中读取数据包和从物理接口中接收它们是很相似的。
  这个例子还会介绍另一个函数:pcap_createsrcsrc()。这个函数用于创建一个源字符串,这个源字符串以一个标志开头,这个标志会告诉WinPcap这个源的类型。比如,使用"rpcap://"标志来打开一个适配器,使用"file://"来打开一个文件。如果 pcap_findalldevs_ex() 已经被使用,那么这部是不需要的,因为其返回值已经包含了这些字符串。然而,在这个例子中需要它。因为文件的名字来自于用户的输入。
  程序源代码:
 

  下面的代码具有一样的作用,只不过是用pcap_next_ex()来代替pcap_loop()循环读取数据而已。

 

  三、使用pcap_live_dump将包写入堆文件
  

注意: 此时,由于新内核缓冲的一些问题,这个特性可能不可用。 

  WinPcap的最近几个版本提供了一个更好的途径,将数据流保存到磁盘,那就是pcap_live_dump()函数。pcap_live_dump()函数有3个参数:文件名,文件最大的大小(字节为单位)和文件可以允许存储的数据包的最大数量。0表示没有限制。注意,在调用pcap_live_dump()将数据流保存下来之前,程序可以设置过滤器(使用pcap_setfilter(),详情请参见 过滤数据包这部分),这样,就可以定义要保存的那部分数据流了。
  pcap_live_dump()不会被阻塞,因此,它开始堆处理后会立即返回。堆处理以异步的方式进行,直到文件达到最大大小或者存储的数据包达到最大数量。 
  应用程序可以使用pcap_live_dump_ended()来检查数据是否存储完毕。 

  特别注意: sync 参数必须是非零的,如果它们是0,那么程序将永远被阻塞。
  代码如下:
 

  pcap_live_dump()和pcap_dump()的不同从设置的最大极限来说就是性能的问题。pcap_live_dump()采用WinPcap NPF驱动来从内核级的层次上向文件中写数据,从而使内存拷贝最小化。
  显然,这些特点当前在其他的操作系统下是不能够实现的,pcap_live_dump()是WinPcap所特有的,而且只能够应用于Win32环境。

 

抱歉!评论已关闭.