借助WireShark解析PCAP包

本文介绍了pcap包的概念,如何使用Wireshark查看pcap包,并详细说明了如何在Java程序中借助WireShark库进行后台pcap包的解析和查看。

本文主要分为以下几点:
1.什么是pcap包?
2.pcap包内容如何查看?
3.在java程序中借助WireShark进行解析,在后台查看

1.什么是pcap包

什么是pcap抓包
PCAP是一个数据包抓取库, 很多软件都是用它来作为数据包抓取工具的。 WireShark也是用PCAP库来抓取数据包的。PCAP抓取出来的数据包并不是原始的网络字节流,而是对其进行从新组装,形成一种新的数据格式。

2.pcap包如何打开查看

在window系统上直接用Wireshark就可以进行pcap包的查看以及在线进行pcap的抓取。
默认打开显示的时间是以微秒形式进行显示,查看起来不是很直观,所以需要对时间一列进行格式化。时间显示格式化

  • 通过frame.time>="2017-10-20 11:16:47.053237" and frame.time<="2017-10-20 11:16:48.168048"进行时间过滤

  • 过滤源ip、目的ip。过滤目标地址ip.dst==192.168.101.111;查找源地址为ip.src==192.168.101.111

  • 端口过滤。tcp.port==8080,把源端口和目的端口为8080的都过滤出来。tcp.dstport==8080只过滤目的端口为8080的,tcp.srcport==8080只过滤源端口为80的包[更多过滤规则]

pcap包解析内容和过滤方式

3.在java程序中借助WireShark进行解析,在后台查看

由于公司里面的测试环境是window环境,所以我采用的是在Java中使用Runtime和Process类运行WireShark程序进行pcap的解析。
linux环境运行WireShark

cmdPacp = "tshark -r  localFilePath  -T fields  -o gui.column.format:\"No.,%m,Time,%Yt,Source,%s,Destination,%d,Protocol,%p,Info,%i\" -e _ws.col.No. -e _ws.col.Time -e _ws.col.Source -e _ws.col.Destination -e _ws.col.Protocol -e _ws.col.Info -E header=y -E separator=, -E quote=d -E occurrence=f ";
process = Runtime.getRuntime().exec("cmd /c " + cmdPacp, null, new File(Constant.getPcapDiskLoc()));
注释
-r 指定要分析的.pcap文件
-T fields 说明要对.pcap文件中的fields进行提取
-T:输出到命令行界面
gui.column.format:对待打印的字段进行格式化
-T,-e: 指的是打印No、Time、Source、Destination、Protocol、Info;
-E: 当-T字段指定时,设置输出选项,header=y意思是头部要打印;
header=y :打印列表的字段名称使用
separator= :各个字段之间的分隔符
quote=d : d使用双引号,s的单引号,n没有引号(默认)
occurrence=f :择使用哪个发生多次出现的字段。如果f将使用第一次出现,如果l最后出现将使用如果出现将使用所有(这是默认的)

localFilePath 代表pcap包文件位置
new File(Constant.getPcapDiskLoc())代表WireShark在pc中的目录位置

cmdPacp = "tshark -r  " + localFilePath
                        + "  -T fields  -o gui.column.format:\"No.,%m,Time,%Yt,Source,%s,Destination,%d,Protocol,%p,Info,%i\" -e _ws.col.No. -e _ws.col.Time -e _ws.col.Source -e _ws.col.Destination -e _ws.col.Protocol -e _ws.col.Info -E header=y -E separator=, -E quote=d -E occurrence=f ";
                stopWatch.start();
                process = Runtime.getRuntime().exec("cmd /c " + cmdPacp, null, new File(Constant.getPcapDiskLoc()));
                BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
                while ((s = br.readLine()) != null) {
                    pcap = createPcap(s);
                    //根据解析时间和样例指标时间归类
                    pcapToQuotaType(testingResultTime, pcap);
                    if (pcap != null) {
                        pcap.setTimetamp(timetamp);
                        save(pcap);
                    }
                    // System.out.println(s);
                }
                process.waitFor();
                stopWatch.stop();
private Pcap createPcap(String string) {
        String[] pacpInfos = string.split(",");
        if (StringUtil.isEmpty(StringUtil.removeQuotes(pacpInfos[2]))
                || StringUtil.isEmpty(StringUtil.removeQuotes(pacpInfos[3])))
            return null;
        if (string.contains("_ws"))
            return null;
        Pcap pcap = new Pcap();
        pcap.setNoIndex(Integer.parseInt(StringUtil.removeQuotes(pacpInfos[0])));
        pcap.setTime(StringUtil.removeQuotes(pacpInfos[1]));
        pcap.setSource_address(StringUtil.removeQuotes(pacpInfos[2]));
        pcap.setTarget_address(StringUtil.removeQuotes(pacpInfos[3]));
        pcap.setAgreement(StringUtil.removeQuotes(pacpInfos[4]));
        pcap.setInfos(StringUtil.removeQuotes(pacpInfos[5]));
        return pcap;
    }
/**
     * 获取pcap解析结果细节中的frame 编号
     * @param targertStr
     * @return
     */
    private  String extractNoIndex(String targertStr){
        String firstLineStr = targertStr.substring(0,30);
        String freameStr = firstLineStr.split(":")[0];
        String templeteStr = "Frame ";
        return freameStr.substring(templeteStr.length(), freameStr.length());
    }

后台效果如下图显示:

1.列表展示效果图
这里写图片描述

2.列表中某条的详细解析细节信息
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值