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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 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

相关文章
|
8天前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
15 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
13 6
|
1天前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
9 2
|
3天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。
【10月更文挑战第14天】从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。本文深入探讨Set的核心理念,并通过示例代码展示了HashSet和TreeSet的特点和应用场景。
8 2
|
4天前
|
Java
Java开发如何实现文件的移动,但是在移动结束后才进行读取?
【10月更文挑战第13天】Java开发如何实现文件的移动,但是在移动结束后才进行读取?
14 2
|
4天前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
12 1
|
4天前
|
监控 Java
Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
【10月更文挑战第13天】Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
17 1
|
4天前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较
|
6天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
13 2
|
8天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
21 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用

热门文章

最新文章

推荐镜像

更多