<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手把手教你利用jnetpcap進行Java抓包分析!

          共 4680字,需瀏覽 10分鐘

           ·

          2022-03-18 15:20

          你知道的越多,不知道的就越多,業(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中可能就束手無策了。

          各種協(xié)議

          相關(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語言庫。

          Java使用libpcap流程

          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。

          libpcap/winpcap

          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)如下:

          jnetpcap

          環(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芯片。

          X86芯片

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

          windows11專業(yè)版本

          安裝winpcap

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

          安裝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項目

          SpringBoot項目

          引入jnetpcap依賴

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

          引入jnetpcap依賴

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

          jnetpcap依賴

          我們單獨引入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,那就來這兒下載吧。

          非maven集成jnetpcap

          安裝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ù)庫。」

          安裝jnetpcap函數(shù)庫
          jnetpcap.dll

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

          函數(shù)庫復制

          至此,windows開發(fā)環(huán)境搭建完畢。

          獲取網(wǎng)卡

          為了顯示查看方便,我們先把其他不用的網(wǎng)卡給禁用掉。

          獲取網(wǎng)卡

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

          ipconfig /all

          然后我們用代碼的方式來獲取我們的網(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>]
          網(wǎng)卡信息

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

          至此,成功基于 jnetpcap 進行抓包!

          瀏覽 443
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色电影亚洲 | 国产亚洲无码在线观看 | 国产精品无码卡一卡二 | 日韩三级电影在线播放 | 国人老骚B |