基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)

这篇具有很好参考价值的文章主要介绍了基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本学期学习了《计算机网络》专业课程,老师布置了课程设计大作业,作业要求如下:

  • 使用 JPCAP或 wireshark等抓包,可以使用JAVA、PYTHON或C++写代码对数据进行分析,最后可视化显示;
    本文只实现了使用 Java语言的jpcap接口 在 IDEA环境下抓取数据包的功能

一、Java搭建 winpcap开发环境

在抓包开始前,需要在Java中搭建winpcap开发环境;

1. 名词解释

1.1 winpcap

  • winpcap就是一个更加底层的系统, 通过这个软件可以在window平台下实现直接的网络编程;
  • 但是要注意的是winpcap的实现是使用C/C++实现的, 所以我们就需要一个中间件来实现从C到Java的转化;

1.2 jpcap

  • jpcap简单来说就是对于winpcap一层封装 作为一个中间件,调用winpcap,提供一个接口,使Java实现对数据链路层的控制;
  • 这样现实了平台的无关性;

1.3 网卡

  • 无论在什么操作系统下,我们要发送数据报到网络上,就离不开这样一个东西:网卡 网卡是工作在数据链路层
  • 涉及帧的发送与接收、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等
  • 无论什么数据报从网络发送到本机,都是通过网卡再保存到本地的缓冲区上 所以我们在网络编程抓包的时候,首先要确定就是从哪块网卡上抓包

2. 搭建开发环境

2.1 安装winpcap

下载安装包
地址:https://www.winpcap.org/
完成之后,安装到Windows的电脑中即可

2.2 设置Jpcap.dll

特别注意:64位的系统要下载64位的对应的DLL;
但是官网上提供的下载是32位系统的!!
我在百度网盘上传了一份64位的:
链接:https://pan.baidu.com/s/19xiD0N2UfuV0C0VhALJqLQ 提取码:ley0
下载到本地之后,将Jpcap.dll放到JDK安装路径下的 /jre/bin 目录下;

2.3 导入jar包

使用IDEA新建一个普通的Java项目,导入Jar包
打开项目的项目结构,将刚才下载Jar包添加到项目结构的库中,如下图:

基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)
以上内容参考博客 https://blog.csdn.net/wchstrife/article/details/79922073

3. 测试demo

在进行了开发环境的搭建后,就让我们用一个简单的程序试试是否能显示网卡吧

3.1 代码实现

  • 如下图:

import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;

public class JpcapDemo {
    public static void main(String[] args) {
        /*-------第一步,显示网络设备列表-------- */
        // 获取网络接口列表,返回你所有的网络设备数组,一般就是网卡;
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        int k = -1;
        // 显示所有网络设备的名称和描述信息;
        // 要注意的是,显示出来的网络设备在不同网络环境下是不同的,可以在控制台使用 ipconfig /all命令查看;
        for (NetworkInterface n : devices) {
            k++;
            System.out.println("序号 " + k + "   " + n.name + "     |     " + n.description);
            System.out.println(------------------------------------------------);
        }
    }
}

3.2 网卡分析

  • 当使用以太网接口时,网卡序号为 0 -10,以太网对应的网卡为序号7

基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)

  • 当拔掉网线,使用无线wife网络时,网卡序号变成了 0 -9,以太网对应的网卡消失了

基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)

  • 如上,显示出来的网络设备在不同网络环境下是不同的,可以在控制台使用 ipconfig /all命令查看,如下图:

基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)

如果你也可以像上面代码一样显示出网络设备的信息,那就恭喜你搭建网络环境成功啦!接着进行下一步吧!

二、连接网卡

1. 获取网络接口列表

要想从网络中捕获数据包,第一件必须要做的事就是获取本机的网络接口列表

  • Jpcap提供了方法JpcapCaptor.getDeviceList()完成这个任务,该方法返回一组NetworkInterface对象
  • NetworkInterface接口对象包含了对应网络接口的一些信息,例如:名称、描述、IP以及MAC地址以及数据链路层名称和描述

获取网络接口的代码就是上面的JpcapDemo代码,大家可以回头看看,为了节省篇幅这里就不贴啦

2. 打开网络接口

一旦有了网络接口列表就可以从选定用于捕获数据包的网络接口,可以使用方法JpcapCaptor.openDevice()来打开指定的网络接口,注意此并未开始捕获数据包。

2.1 代码实现

  • 代码如下:
		/*--------第二步,选择网卡并打开网卡连接--------*/
        // 选择网卡序号;
        // 注意!每台设备连接网络的网卡不同,选择正确的网卡才能捕获到数据包;
        System.out.println("请输入你想要监听的网卡序号: ");
        Scanner sc = new Scanner(System.in);
        int index = sc.nextInt();
        
		JpcapCaptor jpcap = null;// 声明一个JpcapCaptor全局实例变量 jpcap;
        // 打开网卡连接,此时还未开始捕获数据包;
        try {
            jpcap = JpcapCaptor.openDevice(devices[index], 1512, true,5000);// 捕获时间为5s
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("抓取数据包时出现异常!!");
        }

2.2 方法解释

静态方法 static JpcapCaptor openDevice (NetworkInterface interface, int snaplen, boolean promisc, int to_ms):
创建一个与指定设备的连接并返回该连接。调用该方法必须指定下列参数:

  • interface:要打开连接的设备的实例;
  • snaplen:这个是比较容易搞混的一个参数。其实这个参数不是限制只能捕捉多少数据包,而是限制每一次收到一个数据包,只提取该数据包中前多少字节;
  • promisc:设置是否混杂模式。处于混杂模式将接收所有数据包,若之后又调用了包过滤函数 setFilter() 将不起任何作用 (后面会介绍);
  • to_ms:指定捕获数据包超时的时间;这个参数主要用于 processPacket()方法 (后面会介绍);

三. 捕获数据包

  • 上面的第二步结束后,我们获得了JpcapCaptor类的对象 jpcap,这是我们连接的网卡;
  • 一旦获得了JpcapCaptor实例就可以用来捕获来自网络接口的数据包;
  • 使用 JpcapCaptor实例来捕获数据包主要有两种方法:回调(callback)以及逐个捕获(one-by-one);

1. 逐个捕获(one-by-one)

  • 使用 JpcapCaptor.getPacket()方法来捕获数据包;这是 JpcapCaptor实例中四种捕捉包的方法之一;
  • 每次调用 getPacket()只是简单返回一个捕获的数据包,可以循环使用 getPacket()方法连续捕获的数据包;
  • 受到 to_ms参数影响, 超时则停止抓包, 若未抓到包则返回 null;
  • 源码放在 我的Github仓库

1.1 只捕获一次

  • 部分代码如下:
	/*--------第三步,捕获数据包--------*/
  	// Packet getPacket() 捕捉并返回一个数据包。这是 JpcapCaptor实例中四种捕捉包的方法之一;
  	// 受到 to_ms参数影响,但一次只抓一个包并返回,或者超时返回 null;
  	// 将抓到的包传给 Packet类的一个对象 packet;
  	Packet packet = jpcap.getPacket();
  	System.out.println(packet);
  • 我选择的序号是4,因为我是该网卡连接了网络,; 捕获结果如下:

基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)

注意!上面的捕获可能会返回 null,是因为 to_ms参数设置太小,导致未捕获到数据包;

1.2 连续捕获

  • 代码如下:
   	// 捕获四个数据包;
   	int i = 0;
   	while (i < 4) {
    Packet packet = jpcap.getPacket();
    System.out.println(packet);
    i++;// 捕获四个数据包
    }
  • 捕获结果如下:

基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)
好啦!到这一步你就可以成功的捕获数据包了,但是只能逐个捕获数据包;
那如何进行一段时间的捕获呢,那就要使用下面的 回调啦!

2. 回调(callback)

2.1 实现的细节:

(1) 首先定义一个实现 PacketReceiver接口的类;

  • PacketReceiver 接口中只定义了一个 receivePacket()方法;
  • Void receivePacket (Packet p):
    * 实现类中的处理接收到的 Packet对象的方法。每个Packet对象代表从热指定网络接口上抓取到的数据包;
    * 开始接收数据包后,当接收到数据包时就会回调实现 PacketReceiver接口的类的 receivePacket的方法,使之处理接收到的数据包;

(2) 然后在主方法中调用 processPacket() 方法捕获数据包;

  • processPacket()或 loopPacket()方法可以指定捕获的数据包的数量,两种方法非常相似;
  • 通常建议使用 processPacket(),因为它支持超时以及非阻塞模式,而 loopPacket()并不支持,不受 to_ms参数影响;
  • int processPacket(int count, PacketReceiver handler):
    * 参数1: 解释 一次接收包的个数(个数到时到产生回调)捕捉指定数目的数据包,并交由实现了 PacketReceiver接口的类的实例(第二个参数)处理; 如果设置为 -1,则表示永远抓下去—方法不会返回;
    * 参数2: 解释 (回调者)事件临听者,必须是实现了 PacketReceiver接口的一个实例对象,抓到的包将调用这个对象中的 receivePacket(Packet packet)方法处理;

注意! processPacket()方法收到to_ms 参数的影响,超时会结束该方法;

2.2 捕获数据包

由于使用了新的抓包方法,所以重新贴了一个全部的实现代码,过程和上面是一样的;
*部分代码如下,为节省篇幅,源码统一放在 我的Github仓库

import ...

// 类 Receiver实现了 PacketReceiver接口的 receivePacket()方法;
class Receiver implements PacketReceiver {
    @Override
    // 重写 PacketReceiver接口中的 receivePacket()方法;
    // 实现类中的处理接收到的 Packet 对象的方法,每个 Packet对象代表从指定网络接口上抓取到的数据包;
    // 抓到的包将调用这个 PacketReceiver对象中的 receivePacket(Packet packet)方法处理;
    public void receivePacket(Packet packet) {
        System.out.println(packet);// 直接将捕获的包输出,不做任何处理;
    }
}
// 主方法;
public class JpcapProcess {
    public static void main(String[] args) {

		......

        //第二步,监听选中的网卡;
        try {
            // 参数一:选择一个网卡,调用 JpcapCaptor.openDevice()连接,返回一个 JpcapCaptor类的对象 jpcap;
            // 参数二:限制每一次收到一个数据包,只提取该数据包中前1512个字节;
            // 参数三:设置为非混杂模式,才可以使用下面的捕获过滤器方法;
            // 参数四:指定超时的时间;

            JpcapCaptor jpcap = JpcapCaptor.openDevice(devices[index], 1512, true, 6000);

        //第三步,捕获数据包;
            /* 调用 processPacket()方法, count = -1对该方法无影响,主要受 to_ms控制,
            	改成其他数值则会控制每一次捕获包的数目;*/
            // 换而言之,影响 processPacket()方法的因素有且只有两个,分别是count 和 to_ms;
            // 抓到的包将调用这个 new Receiver()对象中的 receivePacket(Packet packet)方法处理;
            jpcap.processPacket(5, new Receiver());
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("抓取数据包时出现异常!!");
        }
    }
}

需要注意的是,如果使用上面代码未捕获到数据包,则需要检查网卡是否选择正确;
或者检查to_ms参数是否太小,导致还没开始捕获就超时了;

  • 输出结果如下:

基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)

  • 解释,在源码中,设置count = 5, to_ms = 6000,在正常情况下,6000ms 可以捕捉到很多的数据包,但控制台只输出了5个,是因为count = 5 限制了只能捕获5个;
  • 同理,如果设置 count = -1,理论上可以无限制的捕获数据包,但是因为有to_ms参数的限制,并不可以无限制的捕获数据包;

四. 过滤数据包

1. 设置捕获过滤器:

  • 在Jpcap中可以设置过滤器使得 Jpcap不捕获不需要的数据包;
  • 例如:如果仅仅只需捕获TCP/IPv4数据包,就可以设置过滤器,其方法如下例所示:
	// 注意!混杂模式要设置为false, setFilter()方法才能有效;
	JpcapCaptor jpcap = JpcapCaptor.openDevice(devices[index], 65535, false, 20);
	// 在捕获前先设置过滤;
	jpcap.setFilter("ip and tcp", true);
	jpcap.processPacket(5, new Receiver());
  • 过滤器表达式 “ip and tcp” 表示 “只保留 IPv4并且 TCP数据包,并将其交付给应用” ;
  • 过滤器的设置可以减少所需要处理的数据包并且提高应用的性能;

2. 输出结果

  • 将setFilter()方法 添加到上面的源码中后,输出结果如下图:

基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)

  • 显示的就只有协议字段为6的TCP数据包,说明过滤成功;

总结

这份大作业需要挺多的时间去完成的,只能一部分一部分去啃。
这篇博客也只是解决了如何从网卡中捕捉并过滤数据包,但还未能对捕获到的数据包进行分析和可视化。
剩下的这些内容就等下一篇博客吧!
最后,如果这篇博客对你有帮助的话,就给我点赞吧!如果有我表述的不清楚或者错误的地方,欢迎在评论区一起讨论、批评指正。拜拜!文章来源地址https://www.toymoban.com/news/detail-412758.html

到了这里,关于基于Java_使用Jpcap进行网络抓包并分析(6千字保姆级教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Charles进行网络抓包截取数据

    如何使用Charles进行网络抓包截取数据 最近遇上一个需求,通过逆向网络抓包的方式去截取某个网站的数据,此时我想到了Charles Charles是一款流行的网络调试和分析工具,它可以用于监控、记录和分析网络通信数据。它提供了一个代理服务器,可以让开发者捕获设备与服务器

    2024年02月09日
    浏览(45)
  • 使用tcpdump和wireshark进行服务器抓包分析

    目录 前言 1.tcpdump简介 2.Wireshark简介 3.实际案例 4.代码示例 5.总结 服务器抓包分析是一种非常常见和有效的网络故障排查和性能优化手段。通过捕获服务器上的网络流量,可以帮助我们深入了解服务器与其它设备之间的通信情况,发现问题并进行相应的优化。 tcpdump是一款非

    2024年04月11日
    浏览(46)
  • flutter dio使用proxyman抓包进行网络调试

    证书 wifi 手机和电脑连上同一个wifi,并且手机wifi使用代理,代理地址为电脑的ip和proxyman设置的监听端口 代码 使用方式 proxyIP 为电脑ip

    2024年02月03日
    浏览(45)
  • 基于Wireshark的ARP协议分析和IP报文、ICMP报文的分析|网络数据抓包|课程设计|traceroute|ping|

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482 目录 ​编辑前言 Wireshark软

    2024年02月10日
    浏览(49)
  • 【linux命令讲解大全】045.网络数据分析利器:深度解读 tcpdump 抓包工具的使用方法

    tcpdump是一款在Linux上的抓包工具,用于嗅探网络数据。 补充说明 tcpdump命令是一款抓包、嗅探器工具。它可以打印所有经过网络接口的数据包的头信息,并可使用-w选项将数据包保存到文件中,以便以后进行分析。 语法 选项 -a:尝试将网络和广播地址转换成名称 -c 数据包数

    2024年02月10日
    浏览(51)
  • Java + Jpcap实现监控 IP包流量

    说明:本设计是计算机网络课程的课设,因为代码是提前实现的,本博客于后期补上,又因为代码没写注释自己也看不懂了,所以,仅供参考,就当提供一种实现方式。 文中提供的《Jpcap中文API文档》来源于网络,本文仅用于学习交流,如有侵权,可联系我进行删除。 效果图

    2023年04月14日
    浏览(25)
  • 对微信小程序进行抓包分析

    最近要对微信小程序的接口做一些分析,所以需要寻找一个可以对https进行抓包的工具,综合对比了一下,有以下几种工具可供选择: Fiddler Windows平台有破解版本,可以使用 charles 收费,不想花钱,用不了 Fiddler Everywhere Mac平台,收费,而且网络不稳定,总是登陆不上 Byteas

    2024年02月14日
    浏览(33)
  • 基于爬虫+词云图+Kmeans聚类+LDA主题分析+社会网络语义分析对大唐不夜城用户评论进行分析

      🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 一、项目简介 二、实验过程 2.1获取数据 2.2情感分析 2.3TF-IDF+Kmeans聚类分析 2.4LDA主题

    2024年02月08日
    浏览(54)
  • 如何使用Wireshark进行网络流量分析?

    如何使用Wireshark进行网络流量分析。Wireshark是一款强大的网络协议分析工具,可以帮助我们深入了解网络通信和数据流动。 1. 什么是Wireshark? Wireshark是一个开源的网络协议分析工具,它可以捕获并分析网络数据包,帮助用户深入了解网络通信过程,识别潜在的问题和安全威

    2024年02月11日
    浏览(41)
  • 计算机网络管理 实验4(二) SNMP报文管理信息结构SMI及其规定的ASN.1分析并使用Wireshark抓包分析sysContact的相关信息

    ⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 🙉联系作者🙈by QQ:813942269🐧 🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包