📜  在Java中使用 JnetPcap 进行数据包捕获

📅  最后修改于: 2022-05-13 01:55:22.260000             🧑  作者: Mango

在Java中使用 JnetPcap 进行数据包捕获

什么是 JnetPcap?

  1. JnetPcap 是一个开源Java库。
  2. 它是所有 libpcap 库本地调用的Java包装器。
  3. 它可用于捕获实时和离线数据。
  4. 解码数据包是 Jnetpcap 的一个特殊功能。
  5. 为了处理数据包,您需要可以使用 Wireshark 生成的 pcap 文件。

JNETPCAP 安装步骤:

  • 对于 Windows:(x64)
    1. 下载并安装适用于 Windows 64 位的最新稳定版 JRE 和 JDK。
    2. 下载并安装适用于 Windows 64 位的最新稳定版 Eclipse。
    3. 从 http://jnetpcap.com/download 下载 jNetPcap 的稳定版本(用于 64 位 Windows)。
    4. 提取 .rar 文件。
    5. 解压后,将其数据链接库(jnetpcap.dll)复制到具有管理权限的system32文件夹中。
    6. 现在打开 Eclipse,创建项目。右键单击项目,转到属性,转到Java build

      路径,单击 Add External jars 并提供 jnetpcap.jar 的路径。

    7. 编写程序并运行。
  • 对于 Linux:(x64)
    1. 首选 Ubuntu 14.04 或 16, .04(稳定版)。它包含Java作为操作系统安装的默认值。
    2. 安装 eclipse-full,如果找不到,它将自动安装最新支持的Java 。 (从命令行或软件中心)
    3. 安装 g++ 和 libpcap-dev (从命令行安装,因为它不会出现在软件中心,如果它
      不是更新的)。
    4. 从 http://jnetpcap.com/download 下载 jNetPcap 的稳定版本(用于 64 位 Linux)。
    5. 提取 .rar 文件。
    6. 解压后,将 libjnetpcap.so 和 libjnetpcap-pcap100.so 复制到 /usr/lib/(作为 sudo)。
    7. 现在打开 Eclipse,创建项目。右键单击项目,转到属性,转到Java build
      路径,单击 Add External jars 并提供 jnetpcap.jar 的路径。
    8. 编写程序并运行。

什么是 .pcap 文件?

Pcap 代表数据包捕获。它用于捕获网络流量。这些 pcap 文件可以被 tcpdump、wireshark 等应用程序读取

首先,我们将使用wireshark从实时网络生成三个pcap文件

Folder_have_pcap_file

从上面的截图中,我们可以看到我们在 abc 文件夹中有 3 个 pcap 文件。

打开这些 pcap 文件,我们可以看到:

  1. 3.pcap

    3.pcap

    Total number of packets inside 3.pcap = 2330 
  2. 2.pcap

    2.pcap

    Total number of packets inside 2.pcap = 3361 
  3. 1.pcap

    1.pcap

    Total number of packets inside 1.pcap = 502 

    现在让我们在任何 IDE 中使用Java部署上述方法:

    源代码

源代码

// Counting the number of packets in pcap files.
  
// User defined package
package jnt;
  
import java.io.File;
import org.jnetpcap.Pcap;
import org.jnetpcap.packet.JPacket;
import org.jnetpcap.packet.JPacketHandler;
  
public class PacketCounter {
  
    // Path of the folder having pcap files
    // generated by Wireshark(change accordingly)
    static String folderpath
        = "/home/folder_where_you_have_pcap_files";
  
    static double count = 0;
    static double globalcount = 0;
  
    // main function starts here
    public static void main(String[] args)
    {
  
        // Making the object of a file
        // and giving that object address
        // of the pcap folder
        File file = new File(folderpath);
  
        // Making file array which is used
        // to access each file
        // inside the folder one-by-one
        File[] files = file.listFiles();
  
        // Accessing each file
        // one-by-one of files array
        for (File f : files) {
  
            // Getting each pcap file name
            String FILENAME
                = folderpath + f.getName();
  
            // StringBuilder is used to get
            // error messages in case
            // if any error occurs
            StringBuilder errbuf = new StringBuilder();
  
            // Making Pcap object an opening pcap file
            // in offline mode and passing pcap filename
            // and StringBuilder object to the function
            Pcap pcap = Pcap.openOffline(FILENAME, errbuf);
  
            // Here pcap object is used to start a loop
            // for capturing each  packet of an
            // each pcap file(as a pcap file can
            // have many packets) one at a time, here -1
            // indicates eof(end of file) i.e
            // until every packet is captured execute the
            // loop, we can also give some value
            // instead of -1 which will indicate the
            // number of packets to execute
            // in each pcap file
  
            pcap.loop(-1, new JPacketHandler() {
  
                // nextPacket is override function
                // of JPacketHandler( Handler which is
                // use to receive fully decoded packets)
                public void nextPacket(JPacket packet,
                                       StringBuilder errbuf)
                {
  
                    // counter to count the number of packet
                    // in each pcap file
                    count++;
                }
            }, errbuf);
  
            System.out.println("File : " + f.getName()
                               + " Number of Packets : "
                               + count);
  
            // Global counter to count the total number
            // of packets in all pcap file
            globalcount = globalcount + count;
  
            count = 0;
        }
  
        System.out.println("Total Packets in folder : "
                           + globalcount);
    }
}

输出: