循序渐进学习使用WINPCAP(六)

来源:互联网 发布:淘宝店铺能换支付宝吗 编辑:程序博客网 时间:2024/05/17 01:03

解析数据包

现在经过上几节的学习能够进行数据报的捕获和过滤了,我们想用一个简单的"real world"程序将我们所学的知识应用于实际。

这一节里我们将利用以前的代码建立一个更实用的程序。该程序的主要目的是显示所捕获的数据报的协议头是如何解析和解释的。这个程序名叫UDPdump,它将在屏幕上显示出我们网络上UDP数据的信息。

在此我们选择解析UDP是因为它比TCP简单更加的直观明了,容易理解。下面让我们来看看源代码。

 

首先我们设置UDP过滤器为“ip and udp”,用这种方法我们确保packet_handler()只接受到基于IPV4的UDP数据。这样我们简化了解析并且提高了程序的效率。

我们同样定义了两个数据结构来描述IP 和UDP的头部信息,packet_handler()用这两个结构来定位头部的各种字段。

packet_handler()虽然只是限于处理单一的协议解析器(IPv4里的UDP)但却显示了复杂的嗅探器如tcpdump/WinDump的工作原理。既然我们对MAC地址的头部并不感兴趣所以我们跳过它。为了简单,我们在开始捕获之前用pcap_datalink()来检查MAC层,确保我们的操作在Ethernet networks上,再次我们确保MAC头为14 bytes。

MAC头之后是IP头,我们从中提取出源地址和目的地址。

IP之后是UDP,在确定UDP的位置时有点复杂,因为IP头的长度不是定长。因此我们用头长字段来定位UDP,一旦我们确定了UDP的起始位置,我们就可以解析出原端口和目的端口。

附原文:

Now that we are able to capture and filter network traffic, we want to put our knowledge to work with a simple "real world" application.

In this lesson we will take code from the previous lessons and use these pieces to build a more useful program. the main purpose of the current program is to show how the protocol headers of a captured packet can be parsed and interpreted. The resulting application, called UDPdump, prints a summary of the UDP traffic on our network.

We have chosen to parse and display the UDP protocol because it is more accessible than other protocols such as TCP and consequently is an excellent initial example. Let's look at the code:

/* codes */

First of all, we set the filter to "ip and udp". In this way we are sure that packet_handler() will receive only UDP packets over IPv4: this simplifies the parsing and increases the efficiency of the program.

We have also created a couple of structs that describe the IP and UDP headers. These structs are used by packet_handler() to properly locate the various header fields.

packet_handler(), although limited to a single protocol dissector (UDP over IPv4), shows how complex "sniffers" like tcpdump/WinDump decode the network traffic. Since we aren't interested in the MAC header, we skip it. For simplicity and before starting the capture, we check the MAC layer with pcap_datalink() to make sure that we are dealing with an Ethernet network. This way we can be sure that the MAC header is exactly 14 bytes.

The IP header is located just after the MAC header. We will extract the IP source and destination addresses from the IP header.

Reaching the UDP header is a bit more complicated, because the IP header doesn't have a fixed length. Therefore, we use the IP header's length field to know its size. Once we know the location of the UDP header, we extract the source and destination ports.

The extracted values are printed on the screen, and the result is something like:

1. /Device/Packet_{A7FD048A-5D4B-478E-B3C1-34401AC3B72F} (Xircom t 10/100 Adapter)

Enter the interface number (1-2):1

listening on Xircom CardBus Ethernet 10/100 Adapter...

16:13:15.312784 len:87 130.192.31.67.2682 -> 130.192.3.21.53

16:13:15.314796 len:137 130.192.3.21.53 -> 130.192.31.67.2682

16:13:15.322101 len:78 130.192.31.67.2683 -> 130.192.3.21.53

Each of the final 3 lines represents a different packet.

#end

原创粉丝点击