使用 JPCAP抓包,可以使用JAVA写代码对数据进行分析,最后可视化显示;

本文只实现了使用 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代码接口,使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/1bec0NZMQGJtMBrzdbaeYvQ?pwd=nmdf

提取码:nmdf

下载到本地之后,将Jpcap.dll复制到JDK安装路径下的bin 目录下;

2.3 导入jar包

使用IDEA新建一个普通的Java项目,导入Jar包

打开项目的项目结构,将刚才下载Jar包添加到项目结构的库中,如下图:

3. 测试demo

在进行了开发环境的搭建后,就让我们来一段代码尝试监听

3.1 获取本机网卡

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

3.2 网卡分析

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

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

3.3 监听网卡流量数据

import jpcap.NetworkInterface;
import jpcap.PacketReceiver;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;import java.io.IOException;public class JpcapSimple {public static void main(String[] args) throws IOException {/*-------第一步,显示网络设备列表----------------------------------------- */NetworkInterface[] devices = JpcapCaptor.getDeviceList();/*--------第二步,选择网卡并打开网卡连接------------------------------------*/NetworkInterface network_interface = devices[0];/*--------第三步,捕获数据包-----------------------------------------------*/JpcapCaptor captor = JpcapCaptor.openDevice(network_interface, 65535, false, 20);captor.loopPacket(-1, new ReceiverSimple());}
}class ReceiverSimple implements PacketReceiver {public void receivePacket(Packet packet){if (packet instanceof TCPPacket) {// tcp数据包的解析//源ip地址, 目的ip地址TCPPacket tcp_packet = (TCPPacket)packet;System.out.print("ip地址----");System.out.print("源--" +tcp_packet.src_ip);System.out.print("   ");System.out.println("目的--" + tcp_packet.dst_ip);//源端口地址, 目的端口地址System.out.print("端口----");System.out.print("源--" +tcp_packet.src_port);System.out.print("   ");System.out.println("目的--" + tcp_packet.dst_port);}System.out.println();}
}

二、连接网卡

1. 获取网络接口列表

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

Jpcap提供了方法JpcapCaptor.getDeviceList()完成这个任务,该方法返回一组NetworkInterface对象

NetworkInterface接口对象包含了对应网络接口的一些信息,例如:名称、描述、IP以及MAC地址以及数据链路层名称和描述

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

2. 打开网络接口

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

2.1 代码实现

代码如下:

       /*-------第一步,显示网络设备列表----------------------------------------- */// 获取网络接口列表,返回你所有的网络设备数组,一般就是网卡;NetworkInterface[] devices = JpcapCaptor.getDeviceList();/*--------第二步,选择网卡并打开网卡连接------------------------------------*/// 选择网卡序号;// 注意!每台设备连接网络的网卡不同,选择正确的网卡才能捕获到数据包;NetworkInterface network_interface = devices[0];// 打开网卡连接,此时还未开始捕获数据包;// 参数一:选择一个网卡,调用 JpcapCaptor.openDevice()连接,返回一个 JpcapCaptor类的对象 jpcap;// 参数二:限制每一次收到一个数据包,只提取该数据包中前65535个字节;// 参数三:设置为非混杂模式,才可以使用下面的捕获过滤器方法;// 参数四:指定超时的时间;JpcapCaptor captor = JpcapCaptor.openDevice(network_interface, 65535, false, 20);/*--------第三步,捕获数据包-----------------------------------------------*///第一个参数为需要捕获的IP包个数,-1表示一直捕获。//第二个参数表示需要注册的处理器。captor.loopPacket(-1, new Receiver());

2.2 方法解释

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

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 捕获数据包

由于使用了新的抓包方法,所以重新贴了一个全部的实现代码,过程和上面是一样的;

*部分代码如下,为节省篇幅

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.loopPacket(-1, new Receiver());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("抓取数据包时出现异常!!");}}
}

三. 将监听数据发送到kafka中

    • 添加依赖
        <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.12</artifactId><version>3.2.1</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency>

2. 封装流量数据的实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class WuYuan {private String srcIp;private Integer srcPort;private String dstIp;private Integer dstPort;}

3.重写Receiver

class ReceiverSimple implements PacketReceiver {public KafkaProducer kafkaProducer;public ObjectMapper objectMapper = new ObjectMapper();public ReceiverSimple(){
//        0. 配置文件Properties properties = new Properties();properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "81.70.199.213:9092");properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());//        1. KafkaProducer对象  执行者-数据发送的执行者this.kafkaProducer = new KafkaProducer(properties);}//数据包  网络包  包public void receivePacket(Packet packet){if (packet instanceof TCPPacket) {// tcp数据包的解析TCPPacket tcp_packet = (TCPPacket)packet;WuYuan wuYuan = new WuYuan(tcp_packet.src_ip.getHostAddress(), tcp_packet.src_port, tcp_packet.dst_ip.getHostAddress(), tcp_packet.dst_port);try {String jsonWuYuan = objectMapper.writeValueAsString(wuYuan);System.out.println(jsonWuYuan);kafkaProducer.send(new ProducerRecord<>("test-topic", jsonWuYuan));} catch (JsonProcessingException e) {throw new RuntimeException(e);}}}
}

4.kafka控制台测试数据是否接收到

运行流量捕获程序后, 在kafka控制台中运行命令

./kafka-console-consumer.sh --bootstrap-server 81.70.199.213:9092 --from-beginning --topic test

控制台显示成功接收数据

使用Java监听网络流量相关推荐

  1. 监听网络流量命令——tcpdump

    监听网络流量命令--tcpdump 一.tcpdump简介 二.格式 三.常用参数 四.示例 一.tcpdump简介 tcpdump命令是一款sniffer工具,是linux上的抓包工具,嗅探器:它可 ...

  2. 在linux中使用tcpdump命令 – 监听网络流量

    tcpdump命令 – 监听网络流量 tcpdump命令是一款sniffer工具,是linux上的抓包工具,嗅探器:它可以打印出所有经过网络接口的数据包的头信息. tcpdump命令工作时先要把网卡的 ...

  3. 10.22 tcpdump:监听网络流量

    [功能说明] tcpdump命令是一个截获网络数据包的包分析工具.tcpdump可以将网络中传送的数据包的"头"完全截获下来以提供分析.它支持针对网络层.协议.主机.端口等的过滤, ...

  4. java监听网络连接_Android RxJava 之网络链接监听示范

    RxJava在stream events处理上真的是一个利器.下面的示范代码显示如何用它来监听android设备的网络连接状况,实时接收change信息. IntentFilter filter = ...

  5. Linux 命令之 tcpdump -- 监听网络流量

    文章目录 命令介绍 参考文档 命令介绍 tcpdump 命令是一款 sniffer 工具,是 Linux 上的抓包工具,嗅探器:它可以打印出所有经过网络接口的数据包的头信息. tcpdump 命令工作 ...

  6. linux监控某个端口流量抓包,tcpdump命令 – 监听网络流量

    tcpdump命令是一款sniffer工具,是linux上的抓包工具,嗅探器:它可以打印出所有经过网络接口的数据包的头信息. tcpdump命令工作时先要把网卡的工作模式切换到混杂模式.所以tcpdu ...

  7. 初识广播机制(监听网络状态的改变,监听网络是否可以使用)

    Android系统中的广播机制比较灵活,因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应 ...

  8. Android通过使用系统广播监听网络状态的改变

    Android通过使用广播监听网络状态的改变 得先添加权限 //查看网络状态<uses-permission android:name="android.permission.ACCE ...

  9. IOS-网络(监听网络状态)

    1 // 2 // BWNetWorkTool.h 3 // IOS_0131_检测网络状态 4 // 5 // Created by ma c on 16/1/31. 6 // Copyright ...

最新文章

  1. 你管这破玩意叫 CPU ?
  2. 帆软填报增加记录提交成功后没有_大病医疗填报图解
  3. SAP MM 史上最偷懒的盘点事务代码MI10
  4. Windows PE导出表编程4(重构导出表实现私有函数导出)
  5. 解析远程服务器响应错误,远程服务器返回一个意外的响应:(400)错误的请求,WCF...
  6. ios之UISegmentedcontol
  7. kafka介绍和集群环境搭建
  8. Bootstrap是什么
  9. .net core 文件流保存图片_如何将图片打包成PDF文件进行保存?
  10. 参数化登陆防止SQL注入攻击
  11. linux 编译 连接失败,编译linux-3.15.5时遇到的几个错误
  12. linux服务端口加密,linux – 如何通过单个端口处理加密和未加密的http连接
  13. WINDOWS SERVER 2003 R2 AD域控安装过程实践
  14. 远程协同网络架构photon cloud
  15. 自然语言处理入门新手上路
  16. HiC软件安装篇之Lachesis
  17. 论文阅读:《Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neu》
  18. android客户端与pc服务器实现socket通信(wifi),Android客户端与PC服务器实现Socket通信(wifi)...
  19. 玩家访问网站自动弹窗加QQ群方法以及详细代码
  20. 双边功率谱密度和单边功率谱密度_以高斯信号为例,计算幅度谱、相位谱、双边功率谱、双边功率谱密度、单边功率谱、单边功率谱密度。...

热门文章

  1. 安卓代码怎么设置省电模式_Android 5.0开启省电模式的方法 Android 5.0省电介绍
  2. ARM V8A体系结构-第五章 ARMv8指令集简介
  3. JAVA——token理解
  4. 车辆运动控制(7)考虑道路倾角和曲率
  5. 三校生计算机模拟试题1,三校生高考计算机模拟试卷一
  6. 新店淘宝怎么提高流量
  7. bond4 交换机配置_网卡bonding模式 - bond0、1、4配置
  8. input 属性hidden 的作用
  9. VB.NET通过OleDbConnection连接oracle查询数据示例
  10. Ubuntu16.04安装“搜狗输入法 for linux”