简单网络嗅探器编写--------java
功能设计:
在设计之初,本设计被期望实现下面功能:
①有一个对用户友好的操作界面,使用户对软件上手快和操作简单;
②能对网卡进行选择,选择用户自己需要进行监听抓包的网卡;
③能够侦听所有进出本主机的数据包,完整显示数据包网络层和传输层的头信息。比如,对IP头而言,需要显示版本、头长度、服务类型、数据包长度、标识、DF/MF标志、段内偏移、生存期、协议类型、源目的IP地址、选项内容,并且要求显示数据的实际含义;
④能够设置过滤规则,比如说侦听来源于指定IP地址的数据;
⑤显示接受到的TCP数据包的全部实际内容,并且要考虑一个TCP包划分为多个IP包传输的情况;
⑥功能验证手段,比如说,在运行网络嗅探器的同时,执行标准的Ping、Telnet和浏览网页等操作,检查网络嗅探器能否返回预期的结果。
具体实现:
1.选择网卡进行抓包:
(1)通过JpcapCaptor类的getDevices()函数获取主机的网卡信息:
public static NetworkInterface[] getDevices() {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
return devices;
}
(2)将每个网卡添加到“网卡”菜单的菜单项中:
menuFile1 = new JMenu(" 网卡 ");
NetworkInterface[] devices = new NetworkCard().getDevices();
item = new JMenuItem[devices.length];
for (int i = 0; i < devices.length; i++) {
item[i] = new JMenuItem(i + ": " + devices[i].name + "("
+ devices[i].description + ")");
menuFile1.add(item[i]);
(3)对每个菜单项添加指定的动作侦听器,进行监听,当用户点击此处时将该网卡设为抓包网卡,并打开线程,使用JpcapCaptor.openDevice()打开网络接口,用captor.getPacket()进行抓包:
①添加动作侦听器:
item[i].addActionListener(
new CardActionListener(devices[i]));
②动作响应:
public void actionPerformed(ActionEvent e) {
allpackets.setDevice(device);
allpackets.setFilter("");
Thread myThread = new Thread(allpackets);
myThread.start(); //开启抓包线程
}
③开始抓包:
Packet packet;
try {
JpcapCaptor captor = JpcapCaptor.openDevice(device, 65535,true, 20);
//System.out.println(device.name);
while(!this.flag){
long startTime = System.currentTimeMillis();
while (startTime + 600 >= System.currentTimeMillis()) {
//captor.setFilter(FilterMess, true);
packet = captor.getPacket();
2.对捕获包进行分析
(1)分析:通过调用jpcap库中相应API对捕获的包进行分析,如:IPanalyze()、ICMPanalyze()等,并将分析的结果按一定格式进行封装。
(2)简要信息显示:将捕获的包添加到packetlist中,通过showTable()按一定格式显示出来。
public static void showTable(Packet packet){
String[] rowData = getObj(packet);
tablemodel.addRow(rowData);
}
(3)详细信息显示:该包分析的结果按一定格式显示出来,如:分为IP头部分、上层协议部分等。
(4)保存至本地:添加动作侦听器,监听“保存到本地”按钮。当用户点击此处时,调用FileOutputStream的API将文件保存至D盘。
save.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e3) {
String text = info.getText();
int name = (int)System.currentTimeMillis();
try {
FileOutputStream fos = new FileOutputStream("d://"+name+".txt");
fos.write(text.getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
3.统计数量与暂停抓包
(1)数量统计:对包进行过滤时,每次有一个包符合过滤规则,就让count+1,然后用text.setText(String.valueOf(allpackets.count))把它显示到相应的按钮上。
count = 0;
packetlist.clear();
for(Packet p : bak) {
if(TestFilter(p)) {
packetlist.add(p);
showTable(p);
count++;
}
if(packet!=null&&TestFilter(packet)){
count++;
// System.out.println(packet);
packetlist.add(packet);
bak.add(packet);
showTable(packet);
}
(2)暂停抓包:设置一个动作侦听器,当动作发生时,将标记值flag的值设置为true,使得抓包的循环结束,从而起到暂停抓包的作用。
endButton = new JButton("结束");
endButton.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
allpackets.setFlag(true);
}
}
);
4.对捕获的包进行过滤
(1)设置相应的过滤按钮,如协议(tcp、udp、icmp)、源IP、目的ip等,并设置相应的动作侦听器。
sipButton = new JButton(" 源IP ");
sipButton.addActionListener(
new ActionListener(){
(2)当动作发生时,将过滤的值设置到PacketCapture类的allpackets对象相应的值上,并清除当前显示的值。
public void actionPerformed(ActionEvent e) {
String fsip = JOptionPane.showInputDialog("请输入源IP,以筛选数据包:");
allpackets.setFilter("sip "+fsip);
while(tableModel.getRowCount()>0){
tableModel.removeRow(tableModel.getRowCount()-1);
}
allpackets.clearpackets();
}
(3)由于抓包时有进行备份,所以清除packetlist的数据时并不会导致原有的数据丢失;接着将备份列表bak与过滤则进行对比,如果符合规则,则将其添加到packetlist,并将其显示出来。
public void clearpackets(){
count = 0;
packetlist.clear();
for(Packet p : bak) {
if(TestFilter(p)) {
packetlist.add(p);
showTable(p);
count++;
}
}
}
(4)过滤规则:通过设置的过滤值,让过滤值与packet(捕获的包)相应的值进行对比,如果相等,则符合规则。
public static boolean TestFilter(Packet packet){
if(FilterMess.contains("sip")){
String sip = FilterMess.substring(4, FilterMess.length());
if(new PacketAnalyze(packet).packetClass().get("源IP").equals(sip)){
return true;
}
}else if(FilterMess.contains("dip")){
String dip = FilterMess.substring(4, FilterMess.length());
if(new PacketAnalyze(packet).packetClass().get("目的IP").equals(dip)){
return true;
}
}else if(FilterMess.contains("ICMP")){
if(new PacketAnalyze(packet).packetClass().get("协议").equals("ICMP")){
return true;
}
}
else if(FilterMess.contains("UDP")){
if(new PacketAnalyze(packet).packetClass().get("协议").equals("UDP")){
return true;
}
}else if(FilterMess.contains("TCP")){
if(new PacketAnalyze(packet).packetClass().get("协议").equals("TCP")){
return true;
}
}else if(FilterMess.contains("keyword")){
String keyword = FilterMess.substring(8, FilterMess.length());
if(new PacketAnalyze(packet).packetClass().get("数据").contains(keyword)){
return true;
}
}else if(FilterMess.equals("")){
return true;
}
return false;
}
具体代码:https://download.csdn.net/download/weixin_40789841/12116012
简单网络嗅探器编写--------java相关推荐
- java简单手机脚本编写,Java认证:Java平台上更简单的脚本编写方法
本文向各位介绍一下Java性能监控小技巧:"JDK附带分析器.远程连接进程.跟踪统计.为离线分析创建一个堆转储.JConsole并不是高深莫测的." 现在,许多 Java 开发人员 ...
- java编写简单计算器_编写java程序简单计算器
展开全部 主要涉及的知识点: 类的e69da5e887aa3231313335323631343130323136353331333365653863写法, 以及方法的调用 .建议多做练习. 如果有看 ...
- Java实现简单的个人网络嗅探器
一.实验题目 简单的个人网络嗅探器 二.实验目的 加深对 TCP/IP 协议的理解 三.实验环境 环境:Windows 10+Myeclipse+Jdk1.6+Wincap+Jpcap 语言:Java ...
- socket编程之DEV C++配置winpcap开发环境并编写网络嗅探器sniffer
欢迎关注我的个人博客:www.zuzhiang.cn 期末计算机网络课程设计让做一个网络嗅探器,要求可以检测和选择网卡,并打开到混杂模式,监听局域网中的所有数据包并解析出所用网络协议以及首部各个字段的 ...
- 编写Java网络爬虫代码
好的,我会用中文来回答你的问题. 首先,在编写Java网络爬虫代码之前,你需要了解一些基本的Java知识,并确保你已经安装了Java开发工具包(JDK). 在编写Java爬虫代码时,你可以使用Java ...
- java之通信之初接触之小感,附上及其简单网络画板的代码
通信,指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递,从广义上指需要信息的双方或多方在不违背各自意愿的情况下无论采用何种方法,使用何种媒质,将信息从某方准确安全传送到另方.[百科释义] ...
- 编写运行最简单的java程序——使用记事本编写java程序
编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...
- python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...
- 【练习题】构造方法 编写Java程序,模拟简单的计算器。
package day09; /*1.[练习题]构造方法 编写Java程序,模拟简单的计算器. 定义名为Number的类,其中有两个整型数据成员n1和n2,应声明为私有.编写构造方法,赋予n1和n2初 ...
最新文章
- 哈希分布与一致性哈希算法简介
- zencart分类页产品页去掉url中的id号
- [译] 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击
- 《金色梦乡》金句摘抄(二)
- java socket 传送进度_java-★-Socket文件上传/进度条
- java visitor_java11教程--接口FileVisitor用法
- python 判断字符串开头_python 怎么判断字符串开头
- Spring Data Jpa的@Temporal注解
- DataGraph for Mac v4.3.0 强大的统计分析软件
- PMP第六版5个过程组49个活动
- 51单片机学习笔记(一)软件及驱动安装
- python 残差图_利用matplotlib绘制多元自变量的回归残差
- 如何制作一个可控制的人体骨骼模型
- SQL学习之now()函数
- 让荣之学告诉你Shopee选品思路及运营方法!
- VsCode同步配置到另一台设备
- Qt SQL:QSqlField、QSqlRecord、QSqlIndex、QSqlError
- 常见的 App 渠道追踪方法
- Leetcode刷题06-位运算
- 运用计算机辅助设计的药物实例,计算机辅助设计在药物研发中的应用现状探究...
热门文章
- Python写一个自动发送直播弹幕的工具,非常简单
- 找一个好的副业确实有点难
- 学计算机每天都没时间,大学里“苦不堪言”的5大专业,忙到没有时间谈恋爱,学生累成狗...
- Python基础篇学习感悟:学如不及,犹恐失之
- ggplot2-图形语法
- 室内导航应用程序,基于自研引擎开发3D地图+导航应用-采用蓝牙定位方案
- 使用ES6写更好的JavaScript
- 有关BPSK、QPSK调制信号的通信链路仿真,以及误码分析
- 职业学校计算机竞赛,广东省中等职业学校计算机技能竞赛-20210607211419.doc-原创力文档...
- Datalog初步理解