如何从我捕获的一些数据包中导出tcp数据?

时间:2014-01-31 05:28:27

标签: regex perl wireshark

我已经在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文件的类似情况的其他人有帮助。

2 个答案:

答案 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

关于上述内容的几点注意事项:

  1. 它过滤没有有效负载的tcp数据包,如果要识别空的有效负载则将其删除

  2. 它假设您知道文件包含的协议端口,这通常是一个合理的假设。在上面的3868中,将其替换为您正在使用的协议。

  3. 然后将输出重定向到文件,您就完成了。

答案 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;