用于分析 pcap 文件的代码
Code to analyze pcap file
我正在尝试分析包含使用 tcpdump 捕获的数据包的文件。我首先想使用 5 元组将数据包分类为流。然后,我需要获取每个流中每个数据包的大小和到达间隔时间。我尝试了 wireshark 中的对话列表,但它只给出了流中的数据包数量,而不是有关流中每个数据包的信息。对可以完成这项工作的任何代码(c ++或shell脚本)的建议?谢谢
UmNyobe,
如果你还没有听说过Scapy,我相信你想做的事情将是一个近乎完美的选择。例如,我写了这个小片段来解析一个pcap字段,并给我一些类似于你正在使用Scapy谈论的东西。
#!/usr/bin/python -tt
from scapy import *
import sys
from datetime import datetime
'''Parse PCAP files into easy to read NETFLOW like outputn
Usage:n
python cap2netflow.py <[ pcap filename or -l ]>n
-l is live capture switchn
ICMP packets print as source ip, type --> dest ip, code'''
def parse_netflow(pkt):
# grabs 'netflow-esqe' fields from packets in a PCAP file
try:
type = pkt.getlayer(IP).proto
except:
pass
snifftime = datetime.fromtimestamp(pkt.time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[1]
if type == 6:
type = 'TCP'
if type == 17:
type = 'UDP'
if type == 1:
type = 'ICMP'
if type == 'TCP' or type == 'UDP':
print( ' '.join([snifftime, type.rjust(4, ' '), str(pkt.getlayer(IP).src).rjust(15, ' ') , str(pkt.getlayer(type).sport).rjust(5, ' ') , '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' ') , str(pkt.getlayer(type).dport).rjust(5, ' ')]))
elif type == 'ICMP':
print(' '.join([snifftime, 'ICMP'.rjust(4, ' '), str(pkt.getlayer(IP).src).rjust(15, ' ') , ('t: '+ str(pkt.getlayer(ICMP).type)).rjust(5, ' '), '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' '), ('c: ' + str(pkt.getlayer(ICMP).code)).rjust(5, ' ')]))
else:
pass
if '-l' in sys.argv:
sniff(prn=parse_netflow)
else:
pkts = rdpcap(sys.argv[1])
print(' '.join(['Date: ',datetime.fromtimestamp(pkts[0].time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[0]]))
for pkt in pkts:
parse_netflow(pkt)
安装 Python 和 Scapy,然后使用它来帮助您入门。如果您需要任何帮助来弄清楚这一切,请告诉我,如果您知道C++这对您来说已经很有意义了。
在这里得到斯卡皮
http://www.secdev.org/projects/scapy/
此页面上有大量指向有用教程的链接,请记住,Scapy 做得更多,但专注于讨论 pcap 解析的领域。
我希望这有帮助!
直流
我在一个库上工作来分析 tcp 转储,但它是为了一项业务,所以我不能只给你。 如果您没有找到所需的内容,那么我的答案会有所帮助。tcpdump 只是嵌套的网络数据,如 Matryoshka 娃娃,其中 pcap 层由 tcpdump 添加。
如果只想处理捕获,则转储的格式以 Libpcap 文件格式指定。要获取每个数据包的大小和到达时间,您需要使用此规范处理转储。
如果您必须更深入地分析,这些是以下层,按顺序排列
- 链接层
- 互联网层
- 传输层
- 应用层
每个层都有一个标头定义。因此,您需要查找 pcap 数据包含的协议堆栈,并解析标头以获取信息。
5元组的成员是什么? 如果流是 TCP 或 UDP,则源和目标 IP 地址和端口号,以及可能用于区分两个终结点之间随时间推移的多个流的数字将起作用;对于 SCTP,它将是类似的,但如果流是流,则可能需要更多。
如果 5 元组的成员都是 Wireshark 中的"命名字段",您可以将 TShark 与 -T fields
选项一起使用,并使用 -e
选项指定要打印的字段,然后选择一个带有时间戳的字段(frame.time_epoch
会给你自 UN*X 纪元以来秒和几分之一秒的时间), 适当大小的字段(frame.len
为您提供链路层数据包中的原始字节数以及任何元数据,例如 802.11 无线电信息的 radiotap 标头)和其他字段,然后将 TShark 的输出馈送到执行您想要执行的处理的脚本或程序。 这让 TShark 可以处理协议层,这样你的程序只需要处理结果数据。
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 此代码编译良好,但文件未创建?请指出错误
- 找不到Linux Visual Studio代码C++文件
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- Visual Studio代码文件未输出
- 是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
- 如何从ifstream加载LLVM比特代码文件
- 在同一代码文件中包括 Directx 9 和 10
- 如果我只想要架构良好的工作区,但不一定是分开的编译,如何在C++中组织头/代码文件
- 使用 Eclipse 运行.exe C 代码文件
- 是否可以稍后在代码(C++ I/O 文件)中使用输出文件作为输入文件
- 匿名命名空间-在头文件和代码文件中都有意义
- 代码文件外的代码文档
- 在静态库中硬编码的代码文件和头路径
- 更快地解析代码文件
- 为什么有些代码文件使用 close() 而不包含 unistd.h
- 在代码(.c文件)我如何找到linux发行版名称版本
- 在一个代码文件中使用头文件,反之亦然
- SonarQube未分析带有警告的C++代码文件不在项目目录下
- Qt 创建器代码文件重构