添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1.Java网络编程的局限性

首先我们先抛出一个问题,那就是Java怎么在网络层面进行编程?很多小伙伴肯定会说,Java不是有网络编程么?其实Java本身对网络编程是不够底层的,就如我们现在要进行抓包分析的话肯定是不够。因为Java本身所实现的网络编程是在应用层进行操作的,如果我们需要进行抓包的话,就需要深入到底层的协议去了。如下图中的各种协议,应用层之下的协议,在Java中可能就束手无策了。
在这里插入图片描述

2.相关使用技术介绍

2.1.Java使用libpcap流程介绍

本章节我们将使用Jnetpcap来进行学习,在此之前我们需要了解如下一个流程,我们Java本身是不支持直接使用libpcap,因此需要一个JNI技术来作为桥梁,使得我们Java语言可以调用C语言的库,然后jnetpcap中,然后是的Java使用jnetpcap进行开发的时候,直接使用Java方式就可以了,不用关心Java怎么集成JNI调用C语言库。
在这里插入图片描述

2.2.libpcap/winpcap

libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。

当前最流行的包嗅探和分析工具(tcpdump,Wireshark,Snort,nmap,ngrep等许多工具),都是基于libpcap函数库的。
而winpcap就是windows下的libpcap。
在这里插入图片描述

2.3.JNI

SUN公司发布的Java 本地接口(JNI)提供了将Java与C/C++、汇编等本地代码集成的方案,该规范使得在 Java 虚拟机内运行的 Java 代码能够与其它编程语言互相操作,包括创建本地方法、更新Java对象、调用Java方法,引用 Java类,捕捉和抛出异常等,也允许 Java代码调用 C/C++或汇编语言编写的程序和库。

因此,我们可以通过Java——》JNI——》libpcap的方式来调用C语言库。

2.4.jnetpcap

jNetPcap是 libpcap的一个Java完整封装。jNetPcap使 用与libpcap相同风格的API。libpcap是unix/linux平台下的网络数据包捕获函数库,大多数网络监控软件都以它为基础。 Libpcap可以在绝大多数类unix平台下工作。Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。

同时jnetpcap中,集成了JNI,因此在Java应用程序中,使用jnetpcap你就不需要在去额外使用jni了,就像你使用SpringBoot开发时,SpringBoot已经集成了tomcat。

目前版本jnetpcap-1.4.r1425-1g所支持的操作系统如下
在这里插入图片描述

3.环境安装

这里我们主要以windows环境进行搭建为主。我们需要如下几个步骤

3.1.操作系统

这一步至关重要,因为这将确定你的项目到底能不能做。
不管目前我们用什么技术,我们必须认识到一点,那就是我们不管做了什么集成或者封装,底层还是用libpcap,因此如果libpcap不支持我们的服务器环境的话,说啥都没用。

因为不同操作系统使用不同的C语言函数库,并不是所有的操作系统都支持的,如上文中提到的,支持X86芯片的windows系统,amd64芯片的linux等,但是限制不仅仅是操作系统,还有你的CPU处理芯片。这个需要你先确定好贵公司的服务器芯片。

一般公司来说,X86芯片和amd芯片居多,但是对于国产化要求高的企业单位,可能要求服务器是国产化的,因此可能使用一些龙芯,飞腾系列的芯片,则是不支持的。毕竟现阶段libpcap是不太可能去适配这些国产芯片的。

希望未来有一天我们的国产芯片能发展到让老外的软件及代码来适配我们的硬件基础设施。
希望未来能更多的企业投入到芯片的研究中,让中国芯片走向世界!

本人电脑X86芯片
在这里插入图片描述
系统为windows11专业版本
在这里插入图片描述

3.2.安装winpcap

具体安装winpcap这里我就不细说了,如果不知道winpcap从哪儿获取,最简单的方式就是安装一个 wireshark ,因为wireshark是基于winpcap的。
在这里插入图片描述
如果你的系统是linux,则你需要安装的是libpcap。

3.3.maven/SpringBoot集成jnetpcap

3.3.1.创建Maven或者SpringBoot项目

这里我们使用maven的方式进行环境集成,就不再使用导入jnetpcap.jar的方式进行集成了,毕竟网上到处的找包也不方便。当然你可以使用maven的方式集成了jnetpcap,然后在maven仓库中找到jnetpcap,导入到非maven项目中也可以。
这里我采用Spring tool sute进行开发
使用你的IDE创建一个maven项目或者SpringBoot项目
在这里插入图片描述

3.3.2.引入jnetpcap依赖

获取你需要jnetpcap依赖,如下我们使用的是目前
https://mvnrepository.com/artifact/jnetpcap/jnetpcap/1.4.r1425-1g
在这里插入图片描述
当然你也可以选择使用其他的版本,我们可以看到目前最新的版本是2018年1月进行更新的
在这里插入图片描述
我们单独引入jnetpcap是不够的,因为jnetpcap目前还没上传到maven仓库中,或许是因为我用的阿里云仓库,国际仓库是否有,这个不清楚。

		<!-- jnetpcap抓包 -->
		<dependency>
            <groupId>jnetpcap</groupId>
            <artifactId>jnetpcap</artifactId>
            <version>1.4.r1425-1g</version>
        </dependency>
<!-- jnetpcap抓包的maven配置 -->
	<repositories>
  		<repository>
    		<id>Clojars</id>
    		<name>Clojars</name>
   	 		<url>https://clojars.org/repo/</url>
  		</repository>
	</repositories>

完整maven配置如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.10.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>jnetpcap_capture</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>jnetpcap_capture</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- jnetpcap抓包 -->
		<dependency>
            <groupId>jnetpcap</groupId>
            <artifactId>jnetpcap</artifactId>
            <version>1.4.r1425-1g</version>
        </dependency>
	</dependencies>
	<!-- jnetpcap抓包的maven配置 -->
	<repositories>
  		<repository>
    		<id>Clojars</id>
    		<name>Clojars</name>
   	 		<url>https://clojars.org/repo/</url>
  		</repository>
	</repositories>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

3.4.非maven集成jnetpcap

非maven环境集成jnetpcap时,比较简单,其实就是找到jnetpcap包,然后将jnetpcap导入项目即可,但是存在一个问题,就是如果我们仅仅导入jnetpcap包,是不够的,因为我们还需要与这个依赖包保持版本的jnetpcap函数库,这块反正网上到处找也费劲。所以如果你的项目是非maven项目,这里建议你创建一个maven或者springBoot项目,然后用maven的方式集成,然后在maven仓库中去找jnetpcap包。这样有个好处,就是maven中集成进来的jnetpcap包中就包含了jnetpcap的函数库。

如果你不想折腾maven,那就来这儿下载吧
在这里插入图片描述

3.5.安装jnetpcap函数库

从哪里获取jnetpcap函数库函数库嗯?网上到处下载,反正够折腾人的,jnetpcap依赖有几个版本,然后函数库也有几个版本,各版本之间是不能混合用的。主要现在jnetpcap官网也打不开,不知道是不是要科学访问还是什么的,反正到目前位置也快3年没更新了。jnetpcap最后一版是2018年1月更新的(楼主目前时间2021年9月)

首先找到我们的通过maven集成的jnetpcap包依赖。
1.将windows系统中的X86芯片 64位系统的jnetpcap.dll拷贝出来,这就是函数库。
在这里插入图片描述
在这里插入图片描述
2.将函数库复制到jdk/bin目录下
在这里插入图片描述
至此,windows开发环境搭建完毕。

4.获取网卡

为了显示查看方便,我们先把其他不用的网卡给禁用掉
在这里插入图片描述
然后在cmd中,输入ipconfig /all查看我们的网卡信息
在这里插入图片描述
然后我们用代码的方式来获取我们的网卡信息,和上面我们的网卡信息做对比。

import java.util.ArrayList;
import java.util.List;
import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class JnetApp {
	public static void main(String[] args) {
		SpringApplication.run(JnetApp.class, args);
		 List<PcapIf> devs = new ArrayList<PcapIf>();
	        StringBuilder errsb = new StringBuilder();
	        int r = Pcap.findAllDevs(devs, errsb);
	        if (r == Pcap.NOT_OK || devs.isEmpty()) {
	            System.err.println("未获取到网卡");
	        } else {
	            System.out.println("获取到网卡:");
	            System.out.println(devs);
获取到网卡:
[<flags=0, 
 addresses=[
  [addr=[INET4:192.168.1.233], 
    mask=[INET4:255.255.255.0], 
    broadcast=[INET4:255.255.255.255], 
    dstaddr=null], 
  [addr=[INET6:FE80:0000:0000:0000:A069:D7CC:E18D:CEE1], 
    mask=[0], 
    broadcast=[0], 
    dstaddr=null]], 
    name=\Device\NPF_{BE377809-60C5-49AD-A224-0F6C3B355EFB}, 
    desc=Intel(R) Ethernet Connection (2) I219-LM>]

在这里插入图片描述
刚开始的时候我电脑是正常运行的,然后系统自动更新以后,就发现获取不到网卡,然后以管理员启动IDE在运行代码时,就能成功了。因此这里,防止权限不够的情况,建议以管理员方式启动。
至此,本章节结束!

通过Fiddler可以嗅探Http协议网络数据包, 如何在Java平 台下通过第三方包来进行底层网络嗅探。 Java平台本身不支持底层网络操作,需要第三方包利用JNI封装不同系统的C库来提供Java的上层接口。常用的类库包括 JPcapJNetPcap等,他们都是基于TcpDump/LibPcapJava封装。其中JPcap已经一年多没更新了,而JNetPca 使用 JPCAP或 wireshark等抓包,可以使用JAVA、PYTHON或C++写代码对数据进行分析,最后可视化显示;本文只实现了使用 Java语言的jpcap接口 在 IDEA环境下抓取数据包的功能这份大作业需要挺多的时间去完成的,只能一部分一部分去啃。这篇博客也只是解决了如何从网卡中捕捉并过滤数据包,但还未能对捕获到的数据包进行分析和可视化。剩下的这些内容就等下一篇博客吧!如果有我表述的不清楚或者错误的地方,欢迎在评论区一起讨论、批评指正。拜拜! 我不是很清楚java如何写一个将网络流量保存为pcap文件的实现,但是我可以提供一些建议:首先,您可以使用Java的socket API来捕获网络流量;其次,您可以使用libpcap库来将网络流量保存为pcap文件。 (内附github地址)此程序是由自己编写的个人网络嗅探器,相当于著名的包捕获软件Wireshark的简化版,界面参考至别人的博客,由JFrame编写,主要业务逻辑基于JnetPcap开发,程序框架为MVC。主要功能如下: 实现了运行主机网卡选择进行抓包 实现了IOS五层模型下所有数据包的捕获及显示 实现了抓取的数据包从链路层到应用层的逐层包头的信息展示及分析 实现了Ethernet、IP、ARP、ICMP、UDP、TCP、HTTP七种数据包的过滤及分析 在上篇文章中Java抓包分析三(基于jnetpcap进行抓包)——抓取Http请求数据包,我们讲解了TCP三次握手的过程和如何抓取Http数据包,但是我们并没有进行一个数据分析,接下来这篇文章我们将要开始对Http抓取的数据报进行深入的分析。 文章目录1.预备知识1.1.OSI七层网络模型1.1.TCP/IP四层网络模型2.分析wireshark抓取的Http数据包3.分析jnetpcap抓取的Http数据包 1.预备知识 1.1.OSI七层网络模型 1.1.TCP/IP四层网络模型 2.分析wiresha 前言本学期计算机网络要求写一个抓包程序,我通过网上查阅资料,如何实现抓包,实现了一个较为简单的抓包程序。项目准备1. 首先得有 java 编译环境,安装并配置好 jdk;2. 需要安装 W... java本身是不支持处理网络层及以下的协议(用的java8,可能我了解的少,但好像是这个样子)。如果想用java做相关的网络嗅探开发,需要使用一些库,比如jpcapJNetPcap。推荐JNetPcap,原因是jpcap很早不维护了,功能上也不如jNetPcap。 本文会介绍在windows下配置jNetPcap开发环境,如果是linux会再单写一篇文章说明一些问题。 jNetPcap简介 jNetPcap是对libcap或WinPcapjava封装,通过JNI调用。jNetPcap可以看 安装libpcapjnetpcap,将jnetpcap配置到IDEA中,在安装过程中遇到please port gnulib freadahead.c to your platform等问题,在程序运行时遇到libjnetpcap.so: libpcap.so.0.9:无法连接到共享文件,找不到文件或目录问题,及解决方法