前言

本学期计算机网络要求写一个抓包程序,我通过网上查阅资料,如何实现抓包,实现了一个较为简单的抓包程序。


文章目录

  • 前言
  • 项目准备
  • 一、抓包功能的基本实现
  • 二、完整项目实现
    • 1.界面布局
    • 2.抓包功能管理类
    • 3.主界面及功能实现
  • 总结

项目准备

1.首先得有java编译环境,安装并配置好jdk;
2.需要安装Winpcap,Winpcap是windows平台下的一个免费的,公共的网络访问系统(Linux系统是Libpcap);
3.还需要下载Jpcap,Jpcap就是调用Winpcap给java提供一个公共的接口,从而实现平台无关性,并能够捕获发送数据包。Jpcap包括Jpcap.jar和Jpcap.dll,两者需要版本一致,并且区分32位和64位。将Jpcap.jar导入你的idea或者Eclipse项目,并且把Jpcap.dll复制到java的jdk的bin目录下,就ok了。


注:我的项目是用idea开发的。

一、抓包功能的基本实现

前面的准备工作完成后,我们就可以使用Jpcap编程进行ip数据包的捕获了。

  • JpcapHandler :这个接口用来定义分析被捕获数据包的方法;

  • ARPPacket:这个类描述了ARP/RARP包,继承了Packet类;

  • DatalinkPacket :这个抽象类描述了数据链路层;

  • EthernetPacket :这个类描述了以太帧包,继承DatalinkPacket类;

  • ICMPPacket:这个类描述了ICMP包,继承了IPPacket类;

  • IPAddress:这个类描述了IPv4和IPv6地址,其中也包含了将IP地址转换为域名的方法;

  • IPPacket:这个类描述了IP包,继承了Packet类,支持IPv4和IPv6;

  • IPv6Option :这个类描述了IPv6选项报头;

  • Jpcap:用来捕获数据包;

  • Jpcap.JpcapInfo :Jpcap的内部类,它包含被捕获数据包的信息(在jpcap0.4修改部分BUG之后不再使用这个类);

  • JpcapSender :它用来发送一个数据包;

  • JpcapWriter :它用来将一个被捕获的数据包保存到文件;

  • Packet :这个类是所有被捕获的数据包的基类;

  • TCPPacket:这个类描述TCP包,继承了IPPacket类;

  • UDPPacket :这个类描述了UDP包,继承了IPPacket类;

    以抓取ip数据包为例,JPCAP抓包基本步骤为:绑定网络设备、抓包、分析。
    以下附上基本功能实现的代码(无界面,能够基本实现抓包功能):

import java.io.IOException;import jpcap.*;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;public class JpcapPacket {public static void main(String[] args){/*--------------    第一步绑定网络设备       --------------*/ NetworkInterface[] devices = JpcapCaptor.getDeviceList();for(NetworkInterface n : devices){System.out.println(n.name + "     |     " + n.description);}System.out.println("-------------------------------------------");JpcapCaptor jpcap = null;int caplen = 1512;boolean promiscCheck = true;/*devices[ ]中的数字需要注意,这里的数字根据你的网卡而定,你选择抓包的网卡正确才能抓到数据包,不同设备在使用有线网和无线网时的都不一样,具体的需要自己去试验。*/try{jpcap = JpcapCaptor.openDevice(devices[1], caplen, promiscCheck, 50);}catch(IOException e){e.printStackTrace();}/*----------第二步抓包-----------------*/int i = 0;while(i < 10){Packet packet  = jpcap.getPacket();if(packet instanceof IPPacket && ((IPPacket)packet).version == 4){i++;IPPacket ip = (IPPacket)packet;//强转System.out.println("版本:IPv4");System.out.println("优先权:" + ip.priority);System.out.println("区分服务:最大的吞吐量: " + ip.t_flag);System.out.println("区分服务:最高的可靠性:" + ip.r_flag);System.out.println("长度:" + ip.length);System.out.println("标识:" + ip.ident);System.out.println("DF:Don't Fragment: " + ip.dont_frag);System.out.println("NF:Nore Fragment: " + ip.more_frag);System.out.println("片偏移:" + ip.offset);System.out.println("生存时间:"+ ip.hop_limit);String protocol ="";switch(new Integer(ip.protocol)){case 1:protocol = "ICMP";break;case 2:protocol = "IGMP";break;case 6:protocol = "TCP";break;case 8:protocol = "EGP";break;case 9:protocol = "IGP";break;case 17:protocol = "UDP";break;case 41:protocol = "IPv6";break;case 89:protocol = "OSPF";break;default : break;}System.out.println("协议:" + protocol);System.out.println("源IP " + ip.src_ip.getHostAddress());System.out.println("目的IP " + ip.dst_ip.getHostAddress());System.out.println("源主机名: " + ip.src_ip);System.out.println("目的主机名: " + ip.dst_ip);System.out.println("----------------------------------------------");}}}
}

二、完整项目实现

具有界面,能够实现基本功能(查看网卡信息,开始抓包,暂停抓包(开始抓包后“开始”按钮变为“暂停”,清空界面内容,退出,以及过滤器功能的简单实现)),界面如下图:

注:界面使用swing实现(现在swing基本很少用了,不过做个简单界面还是不错)

1.界面布局

JpCapFrame代码如下:

package packetCapture;import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.*;/*** 流式布局*/
public class JpCapFrame extends JFrame {private static DefaultTableModel model;private static JTextField filterField;private JTextArea showArea;private JButton startBtn;private JButton checkBtn;private JButton exitBtn;private JButton clearBtn;public JpCapFrame() {super();initGUI();}public static DefaultTableModel getModel() {return model;}public JTextArea getShowArea() {return showArea;}public JButton getStartBtn() {return startBtn;}public JButton getCheckBtn() {return checkBtn;}public JButton getExitBtn() {return exitBtn;}public JButton getClearBtn() {return clearBtn;}public static JTextField getFilterField() {return filterField;}private void initGUI() {Font font1 = new Font("宋体", Font.BOLD, 15);Font font4 = new Font("宋体", Font.BOLD, 14);Font font2 = new Font("宋体", Font.PLAIN, 16);Font font3 = new Font("微软雅黑", Font.PLAIN, 16);//界面setSize(1550, 1000);setVisible(true);setTitle("Captor");Container container = this.getContentPane();//顶部JPanel pane = new JPanel();pane.setBounds(0, 0, 775, 150);pane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0));pane.setPreferredSize(new Dimension(775, 27));checkBtn = new JButton("查看网卡信息");checkBtn.setFont(font4);checkBtn.setBounds(0, 0, 50, 0);pane.add(checkBtn);startBtn = new JButton("开始");startBtn.setFont(font4);startBtn.setBounds(0, 0, 50, 0);pane.add(startBtn);clearBtn = new JButton("清空");clearBtn.setFont(font4);clearBtn.setBounds(0, 0, 50, 0);pane.add(clearBtn);exitBtn = new JButton("退出");exitBtn.setFont(font4);exitBtn.setBounds(0, 0, 50, 0);pane.add(exitBtn);JPanel panelTest = new JPanel();panelTest.setBounds(775, 0, 775, 150);panelTest.setPreferredSize(new Dimension(775, 27));panelTest.setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 0));JLabel filter = new JLabel("Filter:");filter.setFont(font1);filter.setBounds(0, 0, 500, 0);filterField = new JTextField(50);filterField.setBounds(200, 0, 500, 0);panelTest.add(filter);panelTest.add(filterField);//中部主体内容显示区String[] name = {"No.", "Time", "Source", "Destination", "Protocol", "Length", "Info"};//model = new DefaultTableModel();//model.setColumnIdentifiers(name);JTable table = new JTable(model);JTableHeader tableHeader = table.getTableHeader();tableHeader.setFont(font1);table.setFont(font2);table.setRowHeight(20);model = (DefaultTableModel) table.getModel();model.setColumnIdentifiers(name);table.setEnabled(false);JScrollPane jScrollPane = new JScrollPane(table);jScrollPane.setBounds(0, 300, 1550, 600);//底部JPanel pane2 = new JPanel();pane2.setLayout(new BorderLayout());pane2.setPreferredSize(new Dimension(1550, 300));showArea = new JTextArea(5, 5);//showArea.setBounds(0,0,1200,300);//showArea.setText("Test");showArea.setEditable(false);showArea.setLineWrap(false);showArea.setFont(font3);//showArea.setBackground(Color.GRAY);//pane2.add(showArea);pane2.setSize(10, 10);pane2.setBounds(0, 0, 1, 1);//给textArea添加滚动条JScrollPane scrollPane = new JScrollPane(showArea);scrollPane.setBounds(0, 0, 1, 1);scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);pane2.add(scrollPane, BorderLayout.CENTER);scrollPane.setViewportView(showArea);container.add(jScrollPane, BorderLayout.CENTER);container.add(pane, BorderLayout.NORTH);container.add(panelTest, BorderLayout.NORTH);container.add(pane2, BorderLayout.SOUTH);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
}

2.抓包功能管理类

JpCapPacket代码如下:

package packetCapture;import jpcap.JpcapCaptor;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;import java.sql.Timestamp;
import java.util.Vector;public class JpCapPacket {private JpcapCaptor jpcap;public JpCapPacket(JpcapCaptor jpcap) {this.jpcap = jpcap;}void capture() throws InterruptedException {int i = 0;while (true) {synchronized (JpCapMain.getThread()) {if (JpCapMain.isPause()) {JpCapMain.getThread().wait();}}Packet packet = jpcap.getPacket();if (packet instanceof IPPacket && ((IPPacket) packet).version == 4) {i++;IPPacket ip = (IPPacket) packet;//强转//                System.out.println("版本:IPv4");
//                System.out.println("优先权:" + ip.priority);
//                System.out.println("区分服务:最大的吞吐量: " + ip.t_flag);
//                System.out.println("区分服务:最高的可靠性:" + ip.r_flag);
//                System.out.println("长度:" + ip.length);
//                System.out.println("标识:" + ip.ident);
//                System.out.println("DF:Don't Fragment: " + ip.dont_frag);
//                System.out.println("NF:Nore Fragment: " + ip.more_frag);
//                System.out.println("片偏移:" + ip.offset);
//                System.out.println("生存时间:" + ip.hop_limit);String protocol = "";switch (new Integer(ip.protocol)) {case 1:protocol = "ICMP";break;case 2:protocol = "IGMP";break;case 6:protocol = "TCP";break;case 8:protocol = "EGP";break;case 9:protocol = "IGP";break;case 17:protocol = "UDP";break;case 41:protocol = "IPv6";break;case 89:protocol = "OSPF";break;default:break;}
//                System.out.println("协议:" + protocol);
//                System.out.println("源IP " + ip.src_ip.getHostAddress());
//                System.out.println("目的IP " + ip.dst_ip.getHostAddress());
//                System.out.println("源主机名: " + ip.src_ip);
//                System.out.println("目的主机名: " + ip.dst_ip);
//                System.out.println("----------------------------------------------");String filterInput = JpCapFrame.getFilterField().getText();if (filterInput.equals(ip.src_ip.getHostAddress()) ||filterInput.equals(ip.dst_ip.getHostAddress()) ||filterInput.equals(protocol) ||filterInput.equals("")) {Vector dataVector = new Vector();Timestamp timestamp = new Timestamp((packet.sec * 1000) + (packet.usec / 1000));dataVector.addElement(i + "");//dataVector.addElement(new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss").format(new Date()));dataVector.addElement(timestamp.toString());//数据包时间dataVector.addElement(ip.src_ip.getHostAddress());dataVector.addElement(ip.dst_ip.getHostAddress());dataVector.addElement(protocol);dataVector.addElement(packet.data.length);String strtmp = "";for (int j = 0; j < packet.data.length; j++) {strtmp += Byte.toString(packet.data[j]);}dataVector.addElement(strtmp); //数据内容JpCapFrame.getModel().addRow(dataVector);}}}}
}

3.主界面及功能实现

JpCapMain代码如下:

package packetCapture;import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;import java.io.IOException;public class JpCapMain implements Runnable {JpCapFrame frame;JpcapCaptor jpcap = null;private static Thread thread = null;private static boolean pause = true;public JpCapMain() {//创建界面frame = new JpCapFrame();frame.setVisible(true);//绑定网络设备NetworkInterface[] devices = JpcapCaptor.getDeviceList();int caplen = 1512;boolean promiscCheck = true;/*WIFI:3有线:1(不同设备对应的不一样)*/int device = 1;try {jpcap = JpcapCaptor.openDevice(devices[device], caplen, promiscCheck, 50);} catch (IOException e) {e.printStackTrace();}frame.getCheckBtn().addActionListener(e -> {frame.getShowArea().append("当前设备全部网络设备信息为: \n");for (NetworkInterface n : devices) {System.out.println(n.name + "     |     " + n.description);frame.getShowArea().append(n.name + "     |     " + n.description + "\n");}//System.out.println("-------------------------------------------");frame.getShowArea().append(printSeparator(110, 0));frame.getShowArea().append("\n当前使用网卡信息: " + devices[device].name + "     |     " + devices[device].description + "\n");frame.getShowArea().append(printSeparator(110, 1));});frame.getStartBtn().addActionListener(e -> {if (pause) {if (thread == null) {frame.getShowArea().append("   开始抓包,抓取范围为:" + JpCapFrame.getFilterField().getText() + " ……\n");thread = new Thread(this);thread.setPriority(Thread.MIN_PRIORITY);//thread.sleep(100);thread.start();pause = false;frame.getStartBtn().setText("暂停");} else {frame.getStartBtn().setText("暂停");pause = false;frame.getShowArea().append("   继续抓包,抓取范围为:" + JpCapFrame.getFilterField().getText() + " ……\n");synchronized (thread) {thread.notify();}}} else {pause = true;frame.getStartBtn().setText("开始");frame.getShowArea().append("    暂停抓包\n");}});frame.getClearBtn().addActionListener(e -> {frame.getShowArea().setText("");frame.getModel().setRowCount(0);});frame.getExitBtn().addActionListener(e -> {System.exit(0);});}public static void main(String[] args) {new JpCapMain();}@Overridepublic void run() {try {new JpCapPacket(jpcap).capture();thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}/*** @param separator "-"的数量* @param line      "\n"的数量* @return*/public String printSeparator(int separator, int line) {String s = "";String l = "";for (int i = 0; i < separator; i++) {s += "-";}for (int i = 0; i < line; i++) {l += "\n";}return s + l;}public static Thread getThread() {return thread;}public static boolean isPause() {return pause;}
}

项目完整代码如上。


总结

本项目基本实现了抓包的功能,但是因为做的比较赶,所以还有很多功能没有完善。比如演示的时候发现有的同学有选择网卡的功能,我这里只做了查看网卡的功能,但是实现这个功能还是不难的,就是在devices[device]中想办法能够通过选择网卡与device(int)值对应。另外存在的问题就是界面比较简单,不是很美观,然后没有实现点开每一个数据包能够查看具体信息的功能,均还有待完善。

Java实现抓包程序(网络协议分析程序)相关推荐

  1. 网络安全:WireShark 抓包及常用协议分析

    WireShark 抓包及常用协议分析 打开kali终端进入wireshark 进入到wireshark点击选项 勾选选项混杂模式开始抓包 进入终端打开火狐,打开百度进行抓包 这时我们抓到了很多类型的 ...

  2. (44.1)【APP应用漏洞发现】抓包工具、协议分析、逆向工程

    目录 APP应用漏洞发现 一.抓包工具: 1.1.http/https 1.1.1.Burpsuite: 1.1.2.Charies: 1.1.3.Fiddler: 1.1.4.抓包精灵(安卓): 1 ...

  3. Wireshark网络抓包(三)——网络协议

    一.ARP协议 ARP(Address Resolution Protocol)地址解析协议,将IP地址解析成MAC地址. IP地址在OSI模型第三层,MAC地址在OSI第二层,彼此不直接通信: 在通 ...

  4. 【转】Wireshark网络抓包(三)——网络协议

    转自:https://www.cnblogs.com/strick/p/6262284.html 一.ARP协议 ARP(Address Resolution Protocol)地址解析协议,将IP地 ...

  5. 计算机网络实验: 使用Wireshark抓包工具进行网络层和链路层网络协议分析(IP部分)

    目录 实验名称: 实验介绍: 实验目的: 背景知识和准备: 实验过程: 一. IP协议分析 二. Ethernet & ARP 协议分析 实验名称: 网络层和链路层网络协议分析 实验介绍: 本 ...

  6. 网络协议分析(仅供参考,后面的wireshark抓包内容最好自己看书研究)

    必须掌握ARP协议的格式.工作原理和过程.功能,arp命令主要参数等 Arp协议被称为地址解析协议,功能是在同一局域网中,进行mac寻址完成ip到mac的映射,因为局域网中,信息的交流要通过mac地址 ...

  7. 网络协议分析小程序exe制作 python

    网络协议分析小程序exe制作 问题描述: 近期在周报上讲述网络协议分析时,老师让我用代码将数据直接呈现出来,类似输入数据, 然后直接分析出基本的网络协议. 思路描述: 首先用代码将所需要求的MAC.I ...

  8. Https/Tcp抓包工具Charles、fiddler,ping (网络诊断工具),Android平台HTTPS抓包解决方案及问题分析HttpCanary

    市面上已经有一些弱网络模拟工具,比如微软的Network Emulator for Windows Toolkit(NEWT),Facebook的Augmented Traffic Control(A ...

  9. PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析

    Python黑帽编程1.5  使用Wireshark练习网络协议分析 1.5.0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...

最新文章

  1. nodejs mysql 异步_Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步
  2. java设置缓存机制
  3. Python之xml文件处理(一)——使用ElementTree遍历xml
  4. hubbledotnet 远程连接提示:无法从传输连接中读取数据:远程主机强迫关闭一个现有的连接...
  5. 如何优雅处理 async await 错误——解读小而美的 await-to-js 库
  6. 史上最全近百条Oracle DBA日常维护SQL脚本指令
  7. SpringSecurity系列(三) Spring Security 表单登录
  8. ElastcSearch的Mapping映射建立
  9. markdown引入代码_Markdown 插入代码
  10. 对于“ …不需要安装.NET Framework 4.0 ” 以及 “已在此计算机上安装相同或更高版本的 .NET Framework 4 ” 等问题 的解决办法
  11. 电力系统通信与网络技术/智能变电站个人总结
  12. 通讯录管理软件Cardhop for Mac
  13. 正态分布(Normal Distribution)
  14. 计算机mod函数,MOD函数的公式语法及使用方法实例
  15. 动态规划—1.2 买卖股票的最佳时机
  16. 使用VMware安装Ubuntu虚拟机 - 完整教程
  17. 签电子合同的流程是怎样的
  18. homeassistant core安装方式无HACS插件成功解决(记录)
  19. 【Codeforces301E】Yaroslav and Arrangements
  20. iphone描述文件

热门文章

  1. 定积分证明题例题_定积分证明题.doc
  2. 【真人手势动画制作软件】万彩手影大师教程 | 调整元素对象图层
  3. 余额宝利息是多少对余额宝有何风险吗?
  4. jquery validate初上手
  5. R 语言载入包时不显示包的信息
  6. linux prime,Linux – Prime95 (MPrime)
  7. C++类与对象(中)
  8. 10-231 查询选修课程超过2门且成绩都在80分以上的学生
  9. 路由器设置实现DDoS防御详解
  10. android实现发送成功,安卓发送发外代码(三星NOTE3测试成功,华为荣耀成功)