我已经在wireshark中捕获了一些应用程序数据,(FIX消息),我想知道是否有办法将每个数据包的tcp数据层导出到一个单独的文件中,每个数据包一行/一行。
我以为曾经有一个名为tcp.data的函数,但这似乎不存在于我正在使用的wireshark版本中(v1.10.1)。
我一直计划在Wireshark首选项中添加一个额外的列,并将其设置为键入“custom”,然后将tcp.data放入字段中。然后将此列导出到文本文件。
提前感谢任何想法或建议。
PS。我的另一个想法是编写一个脚本来解析捕获文件,并有效地切断tcp层数据前面的前导头,但这需要一些时间 - 希望在wireshark本身已经存在这样做的方法。< / p>
更新1: 扩展了Isaac的解决方案,我提出了以下内容,但这实际上是打印整个tcp段,而不仅仅是段内的数据。我也尝试了tcp.segment_data但这也导致了同样的问题,即输出的tcp数据有效负载超过了。不幸的是,目前最好的选择看起来像是手动解析pcap文件。有没有其他人有任何建议,或者可能发现我在tshark命令语法中出错了什么?
tshark -r capture_chopped.pcap -c4 -2 -R "(tcp.len > 0)" -T fields -d tcp.port==2634,echo -e tcp.segment -w - > output.2
更新2 - 问题已解决: 我发现tshark的每个选项都没有提供我需要的全部信息,所以我创建了自己的Perl脚本来直接从pcap文件中删除FIX消息字符串。 Perl脚本包含在下面,以防它对使用PCAP文件的类似情况的其他人有帮助。
答案 0 :(得分:3)
您不需要脚本,可以使用名为tshark的内置wireshark工具。如果您在默认文件夹中安装wireshark,它通常位于:c:\ Program Files \ Wireshark。
然后使用以下命令行,它将执行操作:
tshark -r c:\captures\your_file.cap -R "(tcp.len > 0)" -T fields -d tcp.port=3868,echo -e echo.data
关于上述内容的几点注意事项:
它过滤没有有效负载的tcp数据包,如果要识别空的有效负载则将其删除
它假设您知道文件包含的协议端口,这通常是一个合理的假设。在上面的3868中,将其替换为您正在使用的协议。
然后将输出重定向到文件,您就完成了。
答案 1 :(得分:0)
最后我发现创建一个解析PCAP文件的perl脚本足以满足我的需求 - 主要是因为使用tshark的其他选项仍需要一些额外的清理/操作(例如将HEX转换为二进制)所以脚本对我来说似乎是最好的方法。
此处包含perl脚本,以防其他人使用。
use strict;
use warnings;
my $in_file = shift || die "must give input pcap file as argument here. \n";
my $out_file = 'fix_output.txt';
open (my $out_fh, ">", $out_file) || die "error opening output file: [$out_file]. $! \n";
open (my $in_fh , "<", $in_file) || die "error opening input file: [$in_file]. $! \n";
my $pcap_blob = do {
local $/ = undef;
<$in_fh>;
};
my @FIX_strings = $pcap_blob =~ m/(8=FIX\.4\.0.*10=\d\d\d)/g;
print "found " . scalar @FIX_strings . " FIX messages\n";
for (@FIX_strings){
print {$out_fh} $_ , "\n";
}
print "finished writing FIX messages to $out_file\n";
close $out_fh;
close $in_fh;
print "all done\n";
exit;