2013-11-20 53 views
1

我一直在使用Wireshark,我想知道有没有人可以帮助我。我记录了随机浏览,并将其保存到pcap文件。我想创建一个从数据包中提取每个信息的程序(我知道许多存在但我想要练习),比如源和目标IP,使用的端口,数据等。我的学习目标是完成的就是从流中提取图像或Youtube视频或任何东西(我知道,我将不得不对数据包进行分组和排序等),但这是我猜想的后期项目。 :)使用C++提取数据包信息

我正在使用libpcap(在Linux上),我的代码到目前为止可以读取脱机文件数据包的数据包,并且 - 因为我知道他们是PPP数据包在我的情况下 - 如果我加载自定义结构来自数据包第20个字节的信息,我可以查看MAC地址和IP地址。

我的问题:

1)我怎么知道/确定没有Wireshark的是什么样的数据链路类型的,用的? (以太网,WiFi,PPP等)

2)如何读取数据包的更多数据?如果我只读了一个字节,我的程序不会做什么,每个变量都是空的。

我有一个ppphdr结构,其中包含:

u_int16_t htype; 
u_int16_t ptype; 
u_char hplen; 
u_char plen; 
u_int16_t oper; 
u_char sha[6]; 
u_char spa[4]; 
u_char tha[6]; 
u_char tpa[4]; 

,我称这种为每个数据包:

pppheader = (struct ppphdr*)(packet+20); 

因为PPP帧从20字节开始。它给出了发件人和目标MAC和IP地址。

在我继续读取接下来的几个字节后,使用相同的调用只是不同的结构,它回到空白,程序在1个数据包后停止。我正在尝试使用本指南:http://www.tcpipguide.com/free/t_PPPGeneralFrameFormat.htm

+0

从这里开始:http://en.wikipedia.org/wiki/Ethernet_frame – Nim

+0

如果您在问题中添加了一些代码,以及关于捕获什么的一些信息,您将有更高的获得合理答案的机会你有的文件,确切地说。特别是问题2听起来像是代码中的问题。 – hyde

+0

http://en.wikipedia.org/wiki/Pcap – hyde

回答

1

如何在不使用Wireshark的情况下知道/确定使用哪种数据链接类型? (以太网,WiFi,PPP等)

Wireshark本身可以使用不同的文件格式。其中你可能感兴趣的其中两个是“pcap”和“pcap-ng”。

如果以“pcap”格式记录数据,则链接类型存储在pcap文件标题的“链接层标题类型”字段中;见the pcap-savefile man page

如果使用“pcap-ng”格式记录了数据,则链接类型存储在Interface Description Block中。

你可以阅读更多关于这两种格式herethere

如果您正在读取包含libpcap的pcap或pcap-ng文件,pcap_datalink()例程将返回DLT_值,指定链接层标题类型。有关DLT_值和与其对应的标头的说明,请参阅the list of link-layer header typesDLT_EN10MB用于以太网(“10MB”为历史 - 用于所有以太网速度); DLT_PPP是PPP最可能的类型。如果您的Wi-Fi数据包带有Wi-Fi标头(如果您未在监视模式下捕获,您可能会获得以太网标头,并且在Wi-Fi适配器上使用DLT_EN10MB),您将获得DLT_IEEE802_11;如果802.11标头之前还有“无线电元数据”标头,则会得到诸如DLT_IEEE802_11_RADIODLT_IEEE802_11_RADIO_AVSDLT_PRISM_HEADER之类的东西。

执行不是假设您将从libpcap获得的数据包的链路层报头类型是什么。 总是调用pcap_datalink()来确定链路层报头类型,并用它来解析数据包;如果您的代码不知道如何解析某个特定DLT_值的数据包,则应报告错误并退出。

如何读取数据包的更多数据?如果我只读了一个字节,我的程序不会做任何事情,每个变量都是空的。

假设您记录以太网数据,您需要根据标准规范解析/处理数据。例如,首先解析Ethernet frame。即使在那时,以太网帧也可以是可变长度的。例如,假设tcpdump/wireshark不记录Preamble字段,则需要读取15个八位字节以确定您可以阅读多少内容。

在完成以太网帧之后,您需要解析IP,然后可能需要UDP和/或TCP。其他一些数据可以采用其他格式,但在每种情况下,您都必须认真研究格式规范并相应地解析数据。读一个字节不会让你在任何地方。所以我建议你首先学习基本的网络层 - 以太网,IP,UDP,然后回到解析它们的问题。

在这一天结束时,Wireshark是一个开源程序,可以完成大部分你想做的练习。意思是你可以始终使用download的源代码,看看它做了什么,并从中学习。

希望它有帮助。祝你好运!

+0

是的,谢谢,它帮助了很多。 :) – Peter

+0

查看我对Vlad的发布的更新,修复了一些错误(它不是真的,pcap文件不包含链接层标题类型!)并添加了更多信息。 – 2013-11-21 21:23:42

+0

@GuyHarris:是的,我错过了那里的字段。感谢更新! – 2013-11-21 21:25:03