关闭

安装配置Jpcap,使用jpcap抓包

标签: eclipsewinpcapjavaJpcap数据包
3911人阅读 评论(0) 收藏 举报

由于网络课程的原因,要完成使用jpcap抓包的实验,所以学习了一下jpcap的相关包导入配置的问题。写下来免得自己忘记了。

首先得要有java编译环境,也就是jdk什么的,就不赘述了。我这里是用的Eclipse进行这个实验。

其次需要安装Winpcap,Winpcap是windows平台下的一个免费的,公共的网络访问系统(Linux系统是Libpcap),Jpcap就是调用Winpcap给java提供一个公共的接口,从而实现平台无关性,并能够捕获发送数据包。Winpcap在这里下载:Winpcap下载地址

之后我们还需要下载Jpcap,Jpcap包括Jpcap.jar和Jpcap.dll,两者需要版本一致,并且区分32位和64位。将Jpcap.jar导入你的Eclipse项目,并且把Jpcap.dll复制到java的jdk的bin目录下,就ok了。


一切都准备好了之后,我们就可以使用Jpcap编程进行ip数据包的捕获了。


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

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

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

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

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

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

IPPacket :这个类描述了IP包,继承了Packet类,支持IPv4IPv6

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;
		
		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("----------------------------------------------");
			}
		}
		
		
		
		
	}

}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4850次
    • 积分:70
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档