一、实验目的及要求
学生在熟悉网络数据通信原理以及TCP/IP协议结构原理的基础上,运用套接字编程实现的网络封包监视技术,有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。要求:
以及TCP/IP协议结构原理。
2.掌握Ip包发送和接收过程。
3.在所学知识的基础上自己确定实验方案,画出流程图,独立编程,实现网络监听程序。
4.对获取的数据包进行简单分析。
二、实验内容
将网卡的工作模式设置为混合模式。获取局域网内的某台(多台)主机的MAC地址,捕获到所有经过网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号以及数据包长度等信息。
三、实验环境
运行windows的PC机,具有JAVA、VC(windows)等语言编译环境。
四、实验步骤及结果分析
好多人都会在winpcap和jpcap上面出现在问题,所以接下来就讲一下如何操作,这里用到的软件是eclipse,源代码放在了文章结尾处。
1、搭配开发环境,首先下载winpcap和jpcap.
winpcap就是一个更加底层的系统, 通过这个软件可以在window平台下实现直接的网络编程;但是要注意的是winpcap的实现是使用C/C++实现的, 所以我们就需要一个中间件来实现从C到Java的转化;
jpcap简单来说就是对于winpcap一层封装 作为一个中间件,调用winpcap,提供一个接口,使Java实现对数据链路层的控制;这样现实了平台的无关性;
直接将winpcap下载好即可,jpcap中有两个文件,将jpcap.dll放在Java的bin目录下。
图1.1部署jpcap.dll
将jpcap.jar部署在eclipse中。具体操作是将jpcap.jar复制在创建文件的src下,然后右击jpcap.jar,Build Path—Add to Build Path.
图1.2jpcap的部署
2、显示网络设备列表
public static void main(String[] args) {
/*-- 第一步绑定网络设备 --*/
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
int m = -1;
for (NetworkInterface n : devices) {
m ++;
System.out.println("序号 " + m + " " +n.name + " | " + n.description);
}
System.out.println("---------------------------------------------------");
2.1网卡分析
图2.1网卡分析
目前电脑没有连接以太网,所以没有以太网对应的网卡序号,序号7、8是使用无线wi-fi网络的网卡序号。
3、打开网络接口
静态方法 static JpcapCaptor openDevice (NetworkInterface interface, int snaplen, boolean promisc, int to_ms):
创建一个与指定设备的连接并返回该连接。
/*--------第二步,选择网卡并打开网卡连接--------*/
// 选择网卡序号;
// 注意!每台设备连接网络的网卡不同,选择正确的网卡才能捕获到数据包;
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("抓取数据包时出现异常!!");
}
4、抓包分析
/*-- 第二步抓包 --*/
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.d_flag);
System.out.println("服务设置-是否有最高的可靠性:"+ip.r_flag);
System.out.println("长度:"+ip.length);
System.out.println("标识:"+ip.ident);
System.out.println("数据偏移设置-有无碎片标识:"+ip.rsv_frag);
System.out.println("数据偏移设置-末尾碎片标识:"+ip.dont_frag);
System.out.println("数据偏移设置-有碎片标识:"+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: protocol="Other"; 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("----------------------------------");
}
}
}
图4.1抓包分析
源码:
package 信息安全;
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import java.io.IOException;
import java.util.Scanner;
public class JpcapPacket {
public static void main(String[] args) {
/*-- 第一步绑定网络设备 --*/
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
int m = -1;
for (NetworkInterface n : devices) {
m ++;
System.out.println("序号 " + m + " " +n.name + " | " + n.description);
}
System.out.println("---------------------------------------------------");
/*--------第二步,选择网卡并打开网卡连接--------*/
// 选择网卡序号;
// 注意!每台设备连接网络的网卡不同,选择正确的网卡才能捕获到数据包;
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("抓取数据包时出现异常!!");
}
/*-- 第二步抓包 --*/
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.d_flag);
System.out.println("服务设置-是否有最高的可靠性:"+ip.r_flag);
System.out.println("长度:"+ip.length);
System.out.println("标识:"+ip.ident);
System.out.println("数据偏移设置-有无碎片标识:"+ip.rsv_frag);
System.out.println("数据偏移设置-末尾碎片标识:"+ip.dont_frag);
System.out.println("数据偏移设置-有碎片标识:"+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: protocol="Other"; 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("----------------------------------");
}
}
}
}