手把手教你利用jnetpcap進行Java抓包分析!
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
你來,我們一起精進!你不來,我和你的競爭對手一起精進!
編輯:業(yè)余草
blog.csdn.net/m0_37892044
推薦:https://www.xttblog.com/?p=5319
Java網(wǎng)絡(luò)編程的局限性
首先我們先拋出一個問題,那就是Java怎么在網(wǎng)絡(luò)層面進行編程?很多小伙伴肯定會說,Java不是有網(wǎng)絡(luò)編程么?其實Java本身對網(wǎng)絡(luò)編程是不夠底層的,就如我們現(xiàn)在要進行抓包分析的話肯定是不夠。因為Java本身所實現(xiàn)的網(wǎng)絡(luò)編程是在應(yīng)用層進行操作的,如果我們需要進行抓包的話,就需要深入到底層的協(xié)議去了。如下圖中的各種協(xié)議,應(yīng)用層之下的協(xié)議,在Java中可能就束手無策了。

相關(guān)使用技術(shù)介紹
Java使用libpcap流程介紹
本章節(jié)我們將使用Jnetpcap來進行學習,在此之前我們需要了解如下一個流程,我們Java本身是不支持直接使用libpcap,因此需要一個JNI技術(shù)來作為橋梁,使得我們Java語言可以調(diào)用C語言的庫,然后jnetpcap中,然后是的Java使用jnetpcap進行開發(fā)的時候,直接使用Java方式就可以了,不用關(guān)心Java怎么集成JNI調(diào)用C語言庫。

libpcap/winpcap
libpcap(Packet Capture Library)即數(shù)據(jù)包捕獲函數(shù)庫,是Unix/Linux平臺下的網(wǎng)絡(luò)數(shù)據(jù)包捕獲函數(shù)庫。它是一個獨立于系統(tǒng)的用戶層包捕獲的API接口,為底層網(wǎng)絡(luò)監(jiān)測提供了一個可移植的框架。
當前最流行的包嗅探和分析工具(tcpdump,Wireshark,Snort,nmap,ngrep等許多工具),都是基于libpcap函數(shù)庫的。
而winpcap就是windows下的libpcap。

JNI
SUN公司發(fā)布的Java 本地接口(JNI)提供了將Java與C/C++、匯編等本地代碼集成的方案,該規(guī)范使得在 Java 虛擬機內(nèi)運行的 Java 代碼能夠與其它編程語言互相操作,包括創(chuàng)建本地方法、更新Java對象、調(diào)用Java方法,引用 Java類,捕捉和拋出異常等,也允許 Java代碼調(diào)用 C/C++或匯編語言編寫的程序和庫。
因此,我們可以通過 Java ——> JNI ——> libpcap的方式來調(diào)用C語言庫。
jnetpcap
jNetPcap是 libpcap的一個Java完整封裝。jNetPcap使 用與libpcap相同風格的API。libpcap是unix/linux平臺下的網(wǎng)絡(luò)數(shù)據(jù)包捕獲函數(shù)庫,大多數(shù)網(wǎng)絡(luò)監(jiān)控軟件都以它為基礎(chǔ)。Libpcap可以在絕大多數(shù)類unix平臺下工作。Libpcap提供了系統(tǒng)獨立的用戶級別網(wǎng)絡(luò)數(shù)據(jù)包捕獲接口,并充分考慮到應(yīng)用程序的可移植性。
同時jnetpcap中,集成了JNI,因此在Java應(yīng)用程序中,使用jnetpcap你就不需要在去額外使用jni了,就像你使用SpringBoot開發(fā)時,SpringBoot已經(jīng)集成了tomcat。
目前版本jnetpcap-1.4.r1425-1g所支持的操作系統(tǒng)如下:

環(huán)境安裝
這里我們主要以windows環(huán)境進行搭建為主。我們需要如下幾個步驟
操作系統(tǒng)
這一步至關(guān)重要,因為這將確定你的項目到底能不能做。
不管目前我們用什么技術(shù),我們必須認識到一點,那就是我們不管做了什么集成或者封裝,底層還是用libpcap,因此如果libpcap不支持我們的服務(wù)器環(huán)境的話,說啥都沒用。
因為不同操作系統(tǒng)使用不同的C語言函數(shù)庫,并不是所有的操作系統(tǒng)都支持的,如上文中提到的,支持X86芯片的windows系統(tǒng),amd64芯片的linux等,但是限制不僅僅是操作系統(tǒng),還有你的CPU處理芯片。這個需要你先確定好貴公司的服務(wù)器芯片。
一般公司來說,X86芯片和amd芯片居多,但是對于國產(chǎn)化要求高的企業(yè)單位,可能要求服務(wù)器是國產(chǎn)化的,因此可能使用一些龍芯,飛騰系列的芯片,則是不支持的。畢竟現(xiàn)階段libpcap是不太可能去適配這些國產(chǎn)芯片的。
希望未來有一天我們的國產(chǎn)芯片能發(fā)展到讓老外的軟件及代碼來適配我們的硬件基礎(chǔ)設(shè)施。
希望未來能更多的企業(yè)投入到芯片的研究中,讓中國芯片走向世界!
本人電腦X86芯片。

系統(tǒng)為windows11專業(yè)版本。

安裝winpcap
具體安裝winpcap這里我就不細說了,如果不知道winpcap從哪兒獲取,最簡單的方式就是安裝一個「wireshark」,因為wireshark是基于winpcap的。

如果你的系統(tǒng)是linux,則你需要安裝的是libpcap。
maven/SpringBoot集成jnetpcap
創(chuàng)建Maven或者SpringBoot項目
這里我們使用maven的方式進行環(huán)境集成,就不再使用導入jnetpcap.jar的方式進行集成了,畢竟網(wǎng)上到處的找包也不方便。當然你可以使用maven的方式集成了jnetpcap,然后在maven倉庫中找到j(luò)netpcap,導入到非maven項目中也可以。
這里我采用Spring tool sute進行開發(fā)。
使用你的IDE創(chuàng)建一個maven項目或者SpringBoot項目

引入jnetpcap依賴
獲取你需要 jnetpcap依賴,如下我們使用的是目前https://mvnrepository.com/artifact/jnetpcap/jnetpcap/1.4.r1425-1g

當然你也可以選擇使用其他的版本,我們可以看到目前最新的版本是2018年1月進行更新的。

我們單獨引入jnetpcap是不夠的,因為jnetpcap目前還沒上傳到maven倉庫中,或許是因為我用的阿里云倉庫,國際倉庫是否有,這個不清楚。
<dependency>
????<groupId>jnetpcapgroupId>
????<artifactId>jnetpcapartifactId>
????<version>1.4.r1425-1gversion>
dependency>
<repositories>
????<repository>
????<id>Clojarsid>
????<name>Clojarsname>
????????<url>https://clojars.org/repo/url>
????repository>
repositories>
完整maven配置如下
<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.0modelVersion>
?<parent>
??<groupId>org.springframework.bootgroupId>
??<artifactId>spring-boot-starter-parentartifactId>
??<version>2.3.10.RELEASEversion>
??<relativePath/>?
?parent>
?<groupId>com.examplegroupId>
?<artifactId>jnetpcap_captureartifactId>
?<version>0.0.1-SNAPSHOTversion>
?<name>jnetpcap_capturename>
?<description>Demo?project?for?Spring?Bootdescription>
?<properties>
??<java.version>1.8java.version>
?properties>
?<dependencies>
??<dependency>
???<groupId>org.springframework.bootgroupId>
???<artifactId>spring-boot-starter-webartifactId>
??dependency>
??
??<dependency>
????????????<groupId>jnetpcapgroupId>
????????????<artifactId>jnetpcapartifactId>
????????????<version>1.4.r1425-1gversion>
????????dependency>
????????
?dependencies>
?
?
?<repositories>
????<repository>
??????<id>Clojarsid>
??????<name>Clojarsname>
???????<url>https://clojars.org/repo/url>
????repository>
?repositories>
?<build>
??<plugins>
???<plugin>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-maven-pluginartifactId>
???plugin>
??plugins>
?build>
project>
非maven集成jnetpcap
非maven環(huán)境集成jnetpcap時,比較簡單,其實就是找到j(luò)netpcap包,然后將jnetpcap導入項目即可,但是存在一個問題,就是如果我們僅僅導入jnetpcap包,是不夠的,因為我們還需要與這個依賴包保持版本的jnetpcap函數(shù)庫,這塊反正網(wǎng)上到處找也費勁。所以如果你的項目是非maven項目,這里建議你創(chuàng)建一個maven或者springBoot項目,然后用maven的方式集成,然后在maven倉庫中去找jnetpcap包。這樣有個好處,就是maven中集成進來的jnetpcap包中就包含了jnetpcap的函數(shù)庫。
如果你不想折騰maven,那就來這兒下載吧。

安裝jnetpcap函數(shù)庫
從哪里獲取jnetpcap函數(shù)庫函數(shù)庫嗯?網(wǎng)上到處下載,反正夠折騰人的,jnetpcap依賴有幾個版本,然后函數(shù)庫也有幾個版本,各版本之間是不能混合用的。主要現(xiàn)在jnetpcap官網(wǎng)也打不開,不知道是不是要科學訪問還是什么的,反正到目前位置也快3年沒更新了。jnetpcap最后一版是2018年1月更新的(樓主目前時間2021年9月)
首先找到我們的通過maven集成的jnetpcap包依賴。
「1.將windows系統(tǒng)中的X86芯片 64位系統(tǒng)的jnetpcap.dll拷貝出來,這就是函數(shù)庫。」


「2.將函數(shù)庫復制到j(luò)dk/bin目錄下」

至此,windows開發(fā)環(huán)境搭建完畢。
獲取網(wǎng)卡
為了顯示查看方便,我們先把其他不用的網(wǎng)卡給禁用掉。

然后在cmd中,輸入ipconfig /all查看我們的網(wǎng)卡信息

然后我們用代碼的方式來獲取我們的網(wǎng)卡信息,和上面我們的網(wǎng)卡信息做對比。
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?devs?=?new?ArrayList();
?????????StringBuilder?errsb?=?new?StringBuilder();
?????????int?r?=?Pcap.findAllDevs(devs,?errsb);
?????????if?(r?==?Pcap.NOT_OK?||?devs.isEmpty())?{
?????????????System.err.println("未獲取到網(wǎng)卡");
?????????}?else?{
?????????????System.out.println("獲取到網(wǎng)卡:");
?????????????System.out.println(devs);
?????????}
?}
}
獲取到網(wǎng)卡:
[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>]

剛開始的時候我電腦是正常運行的,然后系統(tǒng)自動更新以后,就發(fā)現(xiàn)獲取不到網(wǎng)卡,然后以管理員啟動IDE在運行代碼時,就能成功了。因此這里,防止權(quán)限不夠的情況,建議以管理員方式啟動。
至此,成功基于 jnetpcap 進行抓包!
