网络抓包数据文件(.pcap/.cap)解析工具(Java实现)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: pcap/.cap文件是常用的数据报存储格式文件,数据按照特定格式存储,普通编辑器无法正常打开该类型文件,使用Ultra Edit编辑器能够以16进制的格式查看数据,无法直观查看数据重要信息。需要特定的解析工具软件读取查看如WiresharkPortable或Microsoft Network Monitor等

前言

pcap/.cap文件是常用的数据报存储格式文件,数据按照特定格式存储,普通编辑器无法正常打开该类型文件,使用Ultra Edit编辑器能够以16进制的格式查看数据,无法直观查看数据重要信息。需要特定的解析工具软件读取查看如WiresharkPortable或Microsoft Network Monitor等。


问题


然而一些开发任务需要数据文件(.pcap/.cap)某项信息进行后续处理,无法使用软件获取信息输入到程序中,对开发任务带来一些困难。


解决


引入pcap4j库,该库通过网络接口捕获数据包并将它们转换为 Java 对象。可以通过从数据包转换而来的 Java 对象来获取/设置数据包头的每个字段。您还可以从头开始制作数据包对象。pcap4j还具有更强大的功能,有兴趣可关注微信公众号:Java烂笔头,回复:pcap4j-1,查看完整源码及说明。


示例代码

maven 依赖

<dependencies>
    <dependency>
      <groupId>org.pcap4j</groupId>
      <artifactId>pcap4j-core</artifactId>
      <version>1.8.2</version>
    </dependency>
    <dependency>
      <groupId>org.pcap4j</groupId>
      <artifactId>pcap4j-packetfactory-static</artifactId>
      <version>1.8.2</version>
    </dependency>
  </dependencies>
package org.pcap4j.sample;
import java.io.EOFException;
import java.util.concurrent.TimeoutException;
import org.pcap4j.core.NotOpenException;
import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapHandle.TimestampPrecision;
import org.pcap4j.core.PcapNativeException;
import org.pcap4j.core.Pcaps;
import org.pcap4j.packet.Packet;
@SuppressWarnings("javadoc")
public class ReadPacketFile {
  private static final int COUNT = 5;
  private static final String PCAP_FILE_KEY = ReadPacketFile.class.getName() + ".pcapFile";
  private static final String PCAP_FILE =
      System.getProperty(PCAP_FILE_KEY, "src/main/resources/echoAndEchoReply.pcap");
  private ReadPacketFile() {}
  public static void main(String[] args) throws PcapNativeException, NotOpenException {
    PcapHandle handle;
    try {
      handle = Pcaps.openOffline(PCAP_FILE, TimestampPrecision.NANO);
    } catch (PcapNativeException e) {
      handle = Pcaps.openOffline(PCAP_FILE);
    }
    for (int i = 0; i < COUNT; i++) {
      try {
        Packet packet = handle.getNextPacketEx();
        System.out.println(handle.getTimestamp());
        System.out.println(packet);
      } catch (TimeoutException e) {
      } catch (EOFException e) {
        System.out.println("EOF");
        break;
      }
    }
    handle.close();
  }
}
2012-09-12 13:27:27.609228
[Ethernet Header (14 bytes)]
  Destination address: 00:01:8e:f9:a7:60
  Source address: 04:7d:7b:4c:2f:0a
  Type: 0x0800 (IPv4)
[IPv4 Header (20 bytes)]
  Version: 4 (IPv4)
  IHL: 5 (20 [bytes])
  TOS: [precedence: 0 (Routine)] [tos: 0 (Default)] [mbz: 0]
  Total length: 60 [bytes]
  Identification: 18814
  Flags: (Reserved, Don't Fragment, More Fragment) = (false, false, false)
  Fragment offset: 0 (0 [bytes])
  TTL: 128
  Protocol: 1 (ICMPv4)
  Header checksum: 0x0000
  Source address: /192.168.2.101
  Destination address: /192.168.2.1
[ICMPv4 Common Header (4 bytes)]
  Type: 8 (Echo)
  Code: 0 (No Code)
  Checksum: 0x4c5b
[ICMPv4 Echo Header (4 bytes)]
  Identifier: 256
  SequenceNumber: 1
[data (32 bytes)]
  Hex stream: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69
2012-09-12 13:27:27.609965
[Ethernet Header (14 bytes)]
  Destination address: 04:7d:7b:4c:2f:0a
  Source address: 00:01:8e:f9:a7:60
  Type: 0x0800 (IPv4)
[IPv4 Header (20 bytes)]
  Version: 4 (IPv4)
  IHL: 5 (20 [bytes])
  TOS: [precedence: 0 (Routine)] [tos: 0 (Default)] [mbz: 0]
  Total length: 60 [bytes]
  Identification: 30935
  Flags: (Reserved, Don't Fragment, More Fragment) = (false, false, false)
  Fragment offset: 0 (0 [bytes])
  TTL: 64
  Protocol: 1 (ICMPv4)
  Header checksum: 0x7c33
  Source address: /192.168.2.1
  Destination address: /192.168.2.101
[ICMPv4 Common Header (4 bytes)]
  Type: 0 (Echo Reply)
  Code: 0 (No Code)
  Checksum: 0x545b
[ICMPv4 Echo Reply Header (4 bytes)]
  Identifier: 256
  SequenceNumber: 1
[data (32 bytes)]
  Hex stream: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69
2012-09-12 13:27:28.611932
[Ethernet Header (14 bytes)]
  Destination address: 00:01:8e:f9:a7:60
  Source address: 04:7d:7b:4c:2f:0a
  Type: 0x0800 (IPv4)
[IPv4 Header (20 bytes)]
  Version: 4 (IPv4)
  IHL: 5 (20 [bytes])
  TOS: [precedence: 0 (Routine)] [tos: 0 (Default)] [mbz: 0]
  Total length: 60 [bytes]
  Identification: 18815
  Flags: (Reserved, Don't Fragment, More Fragment) = (false, false, false)
  Fragment offset: 0 (0 [bytes])
  TTL: 128
  Protocol: 1 (ICMPv4)
  Header checksum: 0x0000
  Source address: /192.168.2.101
  Destination address: /192.168.2.1
[ICMPv4 Common Header (4 bytes)]
  Type: 8 (Echo)
  Code: 0 (No Code)
  Checksum: 0x4c5a
[ICMPv4 Echo Header (4 bytes)]
  Identifier: 256
  SequenceNumber: 2
[data (32 bytes)]
  Hex stream: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69
2012-09-12 13:27:28.61251
[Ethernet Header (14 bytes)]
  Destination address: 04:7d:7b:4c:2f:0a
  Source address: 00:01:8e:f9:a7:60
  Type: 0x0800 (IPv4)
[IPv4 Header (20 bytes)]
  Version: 4 (IPv4)
  IHL: 5 (20 [bytes])
  TOS: [precedence: 0 (Routine)] [tos: 0 (Default)] [mbz: 0]
  Total length: 60 [bytes]
  Identification: 30936
  Flags: (Reserved, Don't Fragment, More Fragment) = (false, false, false)
  Fragment offset: 0 (0 [bytes])
  TTL: 64
  Protocol: 1 (ICMPv4)
  Header checksum: 0x7c32
  Source address: /192.168.2.1
  Destination address: /192.168.2.101
[ICMPv4 Common Header (4 bytes)]
  Type: 0 (Echo Reply)
  Code: 0 (No Code)
  Checksum: 0x545a
[ICMPv4 Echo Reply Header (4 bytes)]
  Identifier: 256
  SequenceNumber: 2
[data (32 bytes)]
  Hex stream: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69
2012-09-12 13:27:29.611909
[Ethernet Header (14 bytes)]
  Destination address: 00:01:8e:f9:a7:60
  Source address: 04:7d:7b:4c:2f:0a
  Type: 0x0800 (IPv4)
[IPv4 Header (20 bytes)]
  Version: 4 (IPv4)
  IHL: 5 (20 [bytes])
  TOS: [precedence: 0 (Routine)] [tos: 0 (Default)] [mbz: 0]
  Total length: 60 [bytes]
  Identification: 18816
  Flags: (Reserved, Don't Fragment, More Fragment) = (false, false, false)
  Fragment offset: 0 (0 [bytes])
  TTL: 128
  Protocol: 1 (ICMPv4)
  Header checksum: 0x0000
  Source address: /192.168.2.101
  Destination address: /192.168.2.1
[ICMPv4 Common Header (4 bytes)]
  Type: 8 (Echo)
  Code: 0 (No Code)
  Checksum: 0x4c59
[ICMPv4 Echo Header (4 bytes)]
  Identifier: 256
  SequenceNumber: 3
[data (32 bytes)]
  Hex stream: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69

完整源码


示例源码关注微信公众号:Java烂笔头,回复:pcap4j


应用场景

需求:当数据块比较大时,数据块会被压缩,当需要通过抓包来查看数据包内容时,无法直接通过软件查看。给实际工程问题排查带来不便,需要开发一个工具,判断数据是否被压缩,如果压缩进行解压。

              功能:解析报文,报文协议如下:提取出压缩的报文,并解压其中的数据,输出解压后的二进制数据。

               输入:抓取的设备的报文文件。

               输出:将解压的二进制数据输出。

                       格式:

                               时间:

                               源ip:

                               宿ip:

                               数据:


思路:通过pcap4j解析库可以直接读取每条数据的时间、源地址、宿地址、十六进制数据,其次通过Microsoft Network Monitor软件查看报文数据,找出表示是否压缩的十六进制数据位,找出每条数据的表示压缩位的位置规律,将该位转为二进制的最后一位表示是否压缩,1表示压缩,0表示未压缩。然后将压缩的数据转为二进制输出即可。

image.png


image.pngimage.png

相关文章
|
5天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
2天前
|
Java 程序员 开发者
Java中的异常处理机制深度解析
本文旨在深入探讨Java中异常处理的核心概念与实际应用,通过剖析异常的本质、分类、捕获及处理方法,揭示其在程序设计中的关键作用。不同于常规摘要,本文将直接切入主题,以简明扼要的方式概述异常处理的重要性及其在Java编程中的应用策略,引导读者快速把握异常处理的精髓。
|
1天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
13 3
|
1天前
|
安全 Java 开发者
Java并发编程中的锁机制解析
本文深入探讨了Java中用于管理多线程同步的关键工具——锁机制。通过分析synchronized关键字和ReentrantLock类等核心概念,揭示了它们在构建线程安全应用中的重要性。同时,文章还讨论了锁机制的高级特性,如公平性、类锁和对象锁的区别,以及锁的优化技术如锁粗化和锁消除。此外,指出了在高并发环境下锁竞争可能导致的问题,并提出了减少锁持有时间和使用无锁编程等策略来优化性能的建议。最后,强调了理解和正确使用Java锁机制对于开发高效、可靠并发应用程序的重要性。
9 3
|
1天前
|
监控 安全 网络安全
网络安全的盾与剑:漏洞防御与加密技术解析
【9月更文挑战第17天】在数字时代的浪潮中,网络安全成为保护数据和隐私的关键防线。本文深入浅出地探讨了网络安全的两大支柱:漏洞防御和加密技术,旨在提升公众的安全意识并分享防护策略。我们将从基础概念出发,逐步深入到技术细节,不仅阐释原理,还提供实际案例分析,帮助读者构建起一道坚固的数字防御墙。
12 3
|
4天前
|
存储 监控 算法
Java中的内存管理与垃圾回收机制解析
本文深入探讨了Java编程语言中的内存管理策略和垃圾回收机制。首先介绍了Java内存模型的基本概念,包括堆、栈以及方法区的划分和各自的功能。进一步详细阐述了垃圾回收的基本原理、常见算法(如标记-清除、复制、标记-整理等),以及如何通过JVM参数调优垃圾回收器的性能。此外,还讨论了Java 9引入的接口变化对垃圾回收的影响,以及如何通过Shenandoah等现代垃圾回收器提升应用性能。最后,提供了一些编写高效Java代码的实践建议,帮助开发者更好地理解和管理Java应用的内存使用。
|
6天前
|
存储 安全 算法
网络安全与信息安全的全方位解析
在现代社会,随着信息技术的飞速发展,网络安全和信息安全问题日益凸显。本文将通过浅显易懂的语言和具体的实例,全面解析网络安全漏洞、加密技术以及安全意识等方面的知识,帮助读者提升对网络安全与信息安全的认知和应对能力。
|
5天前
|
Java 开发者
深入解析Java中的异常处理机制
本文将深入探讨Java中异常处理的核心概念和实际应用,包括异常的分类、捕获、处理以及最佳实践。我们将通过具体示例展示如何有效使用try-catch块、throws关键字和自定义异常类,以帮助读者更好地理解和应用Java异常处理机制。
10 1
|
5天前
|
Java 程序员 开发者
Java中的异常处理机制深度解析
本文旨在深入探讨Java中异常处理的机制,包括异常的分类、如何捕获和处理异常,以及自定义异常的最佳实践。通过实例讲解,帮助读者更好地理解如何在Java编程中有效管理和利用异常处理来提高代码的健壮性和可维护性。
|
6天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
20 2

推荐镜像

更多