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
数据 :
********************************************
欢迎关注公众号: