使用C ++提取包信息

时间:2013-11-20 14:30:01

标签: c++ linux sockets networking wireshark

我一直在搞乱Wireshark,我想知道是否有人可以帮助我。我用它记录了随机浏览,然后将其保存到pcap文件中。我想创建一个C / C ++ 程序(我知道很多存在但我想练习)从数据包中提取每个信息,如源和目标IP,使用的端口,数据等。我在学习中的目标是从流中提取图像或Youtube视频或任何内容(我知道,我必须对数据包进行分组并对它们进行排序等),但这是我猜的后续项目。 :)

我正在使用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

1 个答案:

答案 0 :(得分: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),你和# 39;得到DLT_IEEE802_11;如果你还有"无线电元数据"在802.11标头之前的标头中,您会收到诸如DLT_IEEE802_11_RADIODLT_IEEE802_11_RADIO_AVSDLT_PRISM_HEADER之类的内容。

NOT 假设您将从libpcap获取的数据包的链路层标头类型。 始终 调用pcap_datalink()以确定链路层标头类型,并使用它来解析数据包;如果您的代码不知道如何解析特定DLT_值的数据包,它应报告错误并退出。

  

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

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

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

在一天结束时,Wireshark是一个开源程序,可以完成您想要做的大部分练习。这意味着您始终可以download源代码,查看它的作用并从中学习。

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