【发布时间】:2013-11-20 14:30:01
【问题描述】:
我一直在搞 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
【问题讨论】:
-
如果您在问题中添加一些代码以及有关您拥有的捕获文件的一些信息,您将有更高的机会获得合理的答案。特别是问题 2 听起来像是您的代码的问题。
-
(从上面继续..),一旦你有了框架,你就可以提取ip头,然后从那里提取tcp/udp头,每个级别都会暴露一些特定的信息位..
-
我想我会推荐查看
tshark、tcpdump和其他此类工具的源代码。基本上,您需要了解您感兴趣的每种类型的数据包的每一层协议头/尾的结构,也就是说,嗯……相当多的信息……
标签: c++ linux sockets networking wireshark