java抓包工具及配置

1、所需工具 jpcap.jar和jpcap.dll

  java抓包程序,使用jpcpa.jar包

  

  下载地址:http://download.csdn.net/detail/moshenglv/8315223

 

  java的JPCAP.jar,不过一直调用的都是winpcap(jpcap.dll)实现的许多接口。

  用winpcap  底层采用的是c写的一些可以直接控制网卡的东东。

2、配置

  首先下载需要的两个包 jpcap.jar和jpcap.dll

  将jpcap.dll复制到 %jdk安装路径%jre/bin 下面

  然后将jpcap.jar引入java工程,build path-->add jars

3、代码

 

package netPackage;

/*******************
 * JpcapTip.java
 */

//import java.net.NetworkInterface;
//import java.net.InetAddress;
//import java.net.UnknownHostException;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.nio.charset.Charset;

import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
import jpcap.PacketReceiver;
import jpcap.packet.ARPPacket;
import jpcap.packet.ICMPPacket;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;
import jpcap.packet.UDPPacket;

public class NetPackage implements PacketReceiver {

	String result="";
	int dst_port;
	String dst_ip =null;
	String src_ip =null;
	int src_port;
	
	public void receivePacket(Packet packet) {
		/* 分析源IP地址和目的IP地址 */
		/* 分析协议类型 */
		if (packet.getClass().equals(IPPacket.class)) {
			System.out.println("协议类型 :IP协议");
			IPPacket ipPacket = (IPPacket) packet;
			byte[] iph = ipPacket.option;
			String iphstr = new String(iph);
			System.out.println(iphstr);
		}

		if (packet.getClass().equals(ARPPacket.class)) {
			readHead(packet);
			System.out.println("协议类型 :ARP协议");
			try {
				ARPPacket arpPacket = (ARPPacket) packet;
				System.out.println("源网卡MAC地址为 :"
						+ arpPacket.getSenderHardwareAddress());
				System.out.println("源IP地址为 :"
						+ arpPacket.getSenderProtocolAddress());
				src_ip = ""+arpPacket.getSenderProtocolAddress();
				System.out.println("目的网卡MAC地址为 :"
						+ arpPacket.getTargetHardwareAddress());
				System.out.println("目的IP地址为 :"
						+ arpPacket.getTargetProtocolAddress());
                dst_ip = ""+arpPacket.getTargetProtocolAddress();
                result+="协议类型 :ARP协议 \n";
                result+="源网卡MAC地址为 :"
						+ arpPacket.getSenderHardwareAddress()+"\n";
                result+="目的网卡MAC地址为 :"
						+ arpPacket.getTargetHardwareAddress()+"\n";
                result+="源ip:"+src_ip+"\n"+"目的ip:"+dst_ip+"\n";
                
                readData(packet);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else if (packet.getClass().equals(UDPPacket.class)) {
			readHead(packet);
			System.out.println("协议类型 :UDP协议");
			try {
				UDPPacket udpPacket = (UDPPacket) packet;
				System.out.println("源IP地址为 :" + udpPacket.src_ip);
				src_port = udpPacket.src_port;
				System.out.println("源端口为:" + src_port);
				System.out.println("目的IP地址为 :" + udpPacket.dst_ip);
				dst_port = udpPacket.dst_port;
				System.out.println("目的端口为:" + dst_port);
				
				dst_ip = ""+udpPacket.dst_ip;
				src_ip = ""+udpPacket.src_ip;
				
				result+="协议类型 :UDP协议 \n";
				result+="源IP地址为 :" + udpPacket.src_ip+"\n"
				+"源端口为:" + src_port+"\n"
				+"目的IP地址为 :" + udpPacket.dst_ip+"\n"
				+"目的端口为:" + dst_port+"\n";
				
				readData(packet);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else if (packet.getClass().equals(TCPPacket.class)) {
			readHead(packet);
			System.out.println("协议类型 :TCP协议");
			try {
				TCPPacket tcpPacket = (TCPPacket) packet;
				src_port = tcpPacket.src_port;
				System.out.println("源IP地址为 :" + tcpPacket.src_ip);
				System.out.println("源端口为:" + src_port);
				System.out.println("目的IP地址为 :" + tcpPacket.dst_ip);
				dst_port = tcpPacket.dst_port;
				System.out.println("目的端口为:" + dst_port);
				
				result+="协议类型 :TCP协议 \n";
				result+="源IP地址为 :" + tcpPacket.src_ip+"\n"
				+"源端口为:" + src_port+"\n"
				+"目的IP地址为 :" + tcpPacket.dst_ip+"\n"
				+"目的端口为:" + dst_port+"\n";
				
				readData(packet);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else if (packet.getClass().equals(ICMPPacket.class))
			{
			readHead(packet);
			  System.out.println("协议类型 :ICMP协议");
			  result+="协议类型 :ICMP协议"+"\n";
			  readData(packet);
		}
		
		write(result);
		result="";
	}

	public void readHead(Packet packet){
		System.out.println("********************************************");
		result+="********************************************"+"\n";
		/* IP数据报报文头 */
		byte[] l = packet.header;
		String str = "";
		System.out.print("报文头 : ");
		for (int i = 0; i < l.length; i++) {
			int m = 0;
			m = l[i];
			m = m << 24;
			m = m >>> 24;
			str = str + Integer.toHexString(m);
		}
		System.out.println(str);
		int d = l.length;
		System.out.println("首部长度 :" + (d * 8) + "bit");
		
		result+="报文头 : "+str+"\n";
        result+="首部长度 :" + (d * 8) + "bit"+"\n";
	}
	
	public void readData(Packet packet){
		/* IP数据报文数据 */
		byte[] k = packet.data;
		String str1 = "", str2 = "";
		System.out.print("数据 : ");
		for (int i = 0; i < k.length; i++) {
			try {
				str1 = new String(k, "utf-8");
			} catch (UnsupportedEncodingException e) {
			}
		}
		try {
			str2 =new String(k, "gb2312");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println(str1);
		String s = " " + packet.getClass();
		System.out.println("数据报类型 :" + s.substring(s.lastIndexOf(".") + 1));

		result+="数据报类型 :" + s.substring(s.lastIndexOf(".") + 1)+"\n";
		result+="数据 : "+str1+"\n";
		result+="******************************************** \n";
	}
	
	private void write(String result) {
		try {
			FileOutputStream fis = new FileOutputStream("F:\\result.txt",true);
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fis));
			writer.write(result);
			
			writer.flush();
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {

		NetworkInterface[] devices = JpcapCaptor.getDeviceList(); 
		// for (int i =0; i<devices.length;i++) {
		int a = 0;
		// try {
		/* 本地网络信息 */
		byte[] b = devices[1].mac_address; // 网卡物理地址
		// }
		// catch() {}
		System.out.print("网卡MAC : 00");
		for (int j = 0; j < b.length; j++) {
			// a=a<<8;
			a = b[j];
			a = a << 24;
			a = a >>> 24;
			System.out.print(Integer.toHexString(a));
		}
		System.out.println();
		NetworkInterfaceAddress[] k = devices[1].addresses;

		for (int n = 0; n < k.length; n++) {
			System.out.println("本机IP地址 : " + k[n].address); // 本机IP地址
			System.out.println("子网掩码   : " + k[n].subnet); // 子网掩码
		}
		System.out.println("网络连接类型 : " + devices[1].datalink_description);
		// }
		
		//0:无线网卡   1:有线网卡
		NetworkInterface deviceName = devices[0];
		
		/* 将网卡设为混杂模式下用网络设备deviceName */
		JpcapCaptor jpcap = null;
		try {
			jpcap = JpcapCaptor.openDevice(deviceName, 2000, false, 1); 

		} catch (Exception e) {
		}
		System.out.println(jpcap);
		jpcap.loopPacket(-1, new NetPackage());
		
	}

}

 

 

 

 

 

  运行结果:

********************************************
报文头 : 105e7ffffa64273719b650804500a13610001114b1fa3f3de4effffffaff876c08d1a58
首部长度 :336bit
协议类型 :UDP协议 
源IP地址为 :/10.63.61.228
源端口为:65288
目的IP地址为 :/239.255.255.250
目的端口为:1900
数据报类型 :UDPPacket
数据 : M-SEARCH * HTTP/1.1
Host:239.255.255.250:1900
ST:urn:schemas-upnp-org:device:InternetGatewayDevice:1
Man:"ssdp:discover"
MX:3




******************************************** 
********************************************
报文头 : ffffffffffff74258a78270860180640174258a78270a3f02000000a3f030
首部长度 :336bit
协议类型 :ARP协议 
源网卡MAC地址为 :74:25:8a:78:02:70
目的网卡MAC地址为 :00:00:00:00:00:00
源ip:/10.63.0.2
目的ip:/10.63.0.48
数据报类型 :ARPPacket
数据 : 
******************************************** 
********************************************
报文头 : cda41b4fe5764273719b6508045003436114004068f1da3f3de4adc27fb019fb1bb51438840000802200803200245b413321142
首部长度 :528bit
协议类型 :TCP协议 
源IP地址为 :/10.63.61.228
源端口为:6651
目的IP地址为 :/173.194.127.176
目的端口为:443
数据报类型 :TCPPacket
数据 : 
******************************************** 
********************************************
报文头 : cda41b4fe5764273719b6508045003436124004068f1ca3f3de4adc27fb019fd1bbc38de736000080220013400245b413321142
首部长度 :528bit
协议类型 :TCP协议 
源IP地址为 :/10.63.61.228
源端口为:6653
目的IP地址为 :/173.194.127.176
目的端口为:443
数据报类型 :TCPPacket
数据 : 
******************************************** 

欢迎关注公众号:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值