【问题标题】:How can I export the tcp data from some packets I have captured?如何从我捕获的一些数据包中导出 tcp 数据?
【发布时间】:2014-02-23 17:35:42
【问题描述】:

我在 Wireshark 中捕获了一些应用程序数据,(FIX 消息),我想知道是否有一种方法可以将每个数据包的 tcp 数据层导出到一个单独的文件中,每个数据包一行/一行。

我以为曾经有一个名为 tcp.data 的函数,但在我使用的 wireshark 版本(v1.10.1)中似乎不存在。

我一直计划在 Wireshark 首选项中添加一个额外的列,并将其设置为键入“自定义”,然后将 tcp.data 放入该字段。然后将此列导出到文本文件。

提前感谢您的任何想法或建议。

PS。我的另一个想法是编写一个脚本来解析捕获文件并有效地切断 tcp 层数据前面的前导标头,但这需要一些时间 - 希望在 Wireshark 本身中已经存在一种方法来执行此操作。


更新 1: 扩展艾萨克的解决方案,我想出了以下内容,但这实际上是打印整个 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 文件有所帮助。

【问题讨论】:

    标签: regex perl wireshark


    【解决方案1】:

    您不需要脚本,可以使用名为 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中,替换成你正在使用的协议即可。

    然后将输出重定向到一个文件,你就完成了。

    【讨论】:

    • 非常感谢 - 但是这只是将 tcp 数据输出为十六进制。是否可以修改为只输出二进制格式的tcp数据?
    【解决方案2】:

    最后我发现创建一个 perl 脚本来解析 PCAP 文件就足以满足我的需求 - 主要是因为使用 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2012-12-02
      相关资源
      最近更新 更多