实验3《IP数据包捕获及数据分析》
一、实验目的
JPCAP是一个能够捕获、发送网络数据包的java类库包。这个包用到了Winpcap/Libpcap和原始套接字API,目前,JPCAP在FreeBSD 3.x、Linux RedHat 6.1、Solaris 和Microsoft Windows 2000/XP系统上已经做过测试,并且支持Ethernet, IPv4, IPv6, ARP/RARP, TCP, UDP, ICMPv4协议。JPCAP是由在美国加利福尼亚大学Irvine分校(UCI)攻读博士学位的日本人Keita Fujiiy研制发布的,其主页为http://netresearch.ics.uci.edu/kfujii/ 。
JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用Winpcap/Libpcap,给JAVA语言提供一个公共的接口,从而实现了平台无关性,并能够捕获、发送网络数据包。
通过本次实验熟悉使用JPCAP捕获数据包,并从捕获的数据了解ip数据包包含的信息。
二、实验内容
- 使用Keita Fujiiy编写的基于JPCAP 的JPCAPDumper软件捕获网络数据,了解JPCAP能实现的功能。JPCAPDumper为英文程序,可参考反编译和汉化后的程序数据包捕获器,功能一致;
- 熟悉JPCAP API的常用类(ARPPacket、DatalinkPacket、IPAddress、IPPacket等);
- 熟悉JPCAP环境的安装步骤;
- 使用JPCAP编写简单的ip数据包捕获程序;
- 参考反编译和汉化的数据包捕获器代码,实现可视化ip数据包捕获程序(选作)。
三、实验方法
利用Intellij IDEA开发工具实现IP抓包实验,利用JpcapDumper可演示Jpcap功能(JpcapDumper是Keita Fujiiy编写的基于Jpcap的网络分析软件)。
四、实验步骤
- 阅读资料里提供的JPCAP API,熟悉JPCAP常用类和方法。
(1) Jpcap0.4版本共有1个分析器接口14个分析器类,分别简介如下:
(2) JpcapHandler :这个接口用来定义分析被捕获数据包的方法
(3) ARPPacket :这个类描述了ARP/RARP包,继承了Packet类
(4) DatalinkPacket :这个抽象类描述了数据链路层
(5) EthernetPacket :这个类描述了以太帧包,继承DatalinkPacket类
(6) ICMPPacket :这个类描述了ICMP包,继承了IPPacket类
(7) IPAddress :这个类描述了IPv4和IPv6地址,其中也包含了将IP地址转换为域名的方法
(8) IPPacket :这个类描述了IP包,继承了Packet类,支持IPv4和IPv6
(9) IPv6Option :这个类描述了IPv6选项报头
(10) Jpcap :用来捕获数据包
(11) Jpcap.JpcapInfo :Jpcap的内部类, 它包含被捕获数据包的信息 (在jpcap0.4修改部分BUG之后不再使用这个类)
(12) JpcapSender :它用来发送一个数据包
(13) JpcapWriter :它用来将一个被捕获的数据包保存到文件
(14) Packet :这个类是所有被捕获的数据包的基类
(15) TCPPacket :这个类描述TCP包,继承了IPPacket类
(16) UDPPacket :这个类描述了UDP包,继承了IPPacket类 - 运行JpcapDumper演示Jpcap功能;
- 利用Intellij IDEA编程实现Jpcap抓包;
3.1 下载安装配置jdk;
3.2 下载安装WinPcap4.1.3,WinPcap4.1.3可以为win32应用程序提供访问网络底层的能力。它用于windows系统下的直接的网络编程。
3.3 下载Jpcap.dll,复制到系统的jre环境下,用于后续实验,本次实验存放在C:\Program Files\Java\jre1.8.0_211\bin目录下。
3.4 下载Jpcap.jar包,用于抓包实验运行,下载官网为http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html,但是官网目前没用了,后来我在网上找到的最新的存放在github中,可以在此下载(https://github.com/zz2summer/jpcap),Jpcap.dll也存放在这里。
下载完成后复制到jre的相关目录下,本次实验存放目录为C:\Program Files\Java\jre1.8.0_211\lib\ext。
3.5 利用Intellij IDEA创建java工程,先导入Jpcap.jar包;
3.6 根据Jpcap.jar包的相关类与方法进行实验编写,编写代码如下所示:
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import java.io.IOException;
public class IPPacketTest {
public static void main(String[] args) throws IOException {
//-----------第一步绑定网卡设备---------------
//返回一个网络设备列表
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
for(NetworkInterface n : devices){
System.out.println(n.name + " | " + n.description );
}
System.out.println("-------------------------------------");
JpcapCaptor jpcap = null;
int caplen = 1514;
boolean promiscCheck = true;
//caplen限制每一次收到一个数据,只提取该数据包中前多少字节
//Promise:设置是否混杂模式。处于混杂模式将接受所有数据包,若之后又调用了包过滤函数setFilter()将不在起任何作用
//50这个参数主要用于processPacket()方法,指定超时的时间
jpcap = JpcapCaptor.openDevice(devices[0],caplen, promiscCheck,20);
//--------------------第二步抓包------------------
int i=0;
while( i < 10 ){
Packet packet = jpcap.getPacket();
String protocol = null;
if(packet instanceof IPPacket && ((IPPacket)packet).version==4){
i++;
IPPacket ip = (IPPacket)packet; //将包强制转为IP包
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("MF:More Fragment:" + ip.more_frag);
System.out.println("片偏移:" + ip.offset);
System.out.println("生存时间:" + ip.hop_limit);
switch (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("----------------------------------------------");
}
}
}
}
- 运行程序,分析结果。
五、实验结果
- 运行JpcapDumper.jar,观察Jpcap演示效果;
1.1 运行程序,显示抓包结果;
1.2 选择获取结果中任一个,点击后即可在下方获取该IP包的详细信息;
1.3 查看本次实验的整体信息;
1.4 查看网络层协议图形信息;
1.5 查看连续的网络层协议图形统计信息;
1.6 通过Statistics功能可以查看更多的统计信息。
- 运行Intellij IDEA编写的抓包程序,获取结果如下所示:
六、实验小结
通过本次主要学会和了解了Jpacap的使用,加深了对IP包的熟悉程度,实验过程中要多多注意Jpcap.dll和Jpcap.jar包的版本问题,一个是32位还是64位,还要一个问题是要尽可能用最新版,一些老版本有部分方法不包含,比如我之前一直遇到报错java.lang.NoSuchMethodError: setPacketValue,导致getPacket一直获得结果为null,最后发现是Jpcap.jar包的问题,换了最新版就没问题了。
参考文章:【1】Jpcap获得网卡信息
【2】安装配置Jpcap,使用jpcap抓包
【3】Jpcap包的安装与配置
【4】jovigb/jpcap-x64
【5】jpcap实验中报错java.lang.NoSuchMethodError: setPacketValue,getPacket一直获得结果为null