主要原理是利用网卡的混杂模式,和以太网自身的特点进行的。
java写的话用 JPACAP
Jpcap是一个能够抓取与发送网络数据包的Java组件。可以使用Jpcap从一个网络接口获取数据包,然后在Java中对它们进行分析和显示。同样也可以通过一个网络接口发送任意数据包。Jpcap当前能够 捕获以太网,IPv4,IPv6,ARP/RARP,TCP,UDP和ICMPv4数据包。
Jpcap实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,Jpcap调用wincap/libcap,而给Java语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,Jpcap支持FreeBSD3.x,Linux RedHat6.1, Fedora Core4,Solaris,and Microsoft Windows 2000/XP等系统。
Jpcap的整个结构大体上跟wincap/libpcap是很相像的,例如NetworkInterface类对应wincap的 typedef struct_ADAPTER ADAPTER,getDeviceList()对应pcap_findalldevs()等等。
Jpcap主要的类有如下几个:
1.NetworkInterface
该类的每一个实例代表一个网络设备,一般就是网卡。这个类只有一些数据成员,除了继承自java.lang.Object的基本方法以外,没有定义其它方法。
2.JpcapCaptor
该类提供了一系列静态方法实现一些基本的功能。该类一个实例代表建立了一个与指定设备的链接,可以通过该类的实例来控制设备,例如设定网卡模式、设定过滤关键字等等。
3.JpcapSender
该类专门用于控制数据包的发送。
4.Packet
这个是所有其它数据包类的父类。Jpcap所支持的数据包有:
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket。
java获取固定IP发来所有的数据包,需要实现网络嗅探的部分功能:
代码如下
/******************** JpcapTip.java
*/
package m
import jpcap.PacketReceiver
import jpcap.JpcapCaptor
import jpcap.packet.*
import jpcap.NetworkInterface
import jpcap.NetworkInterfaceAddress
//import java.net.InetAddress
//import java.net.UnknownHostException
public class JpcapTip implements PacketReceiver {
public void receivePacket(Packet packet) {
System.out.println("********************************************")
/*IP数据报报文头*/
byte[] l=packet.header
/*
for (int t=0t<21t++){
System.out.print(l[t]+" *** ")
}
*/
String str=""
System.out.print("报文头 : ")
for (int i=0i<l.lengthi++) {
//str=str+l
int m=0
m=l[i]
m=m<<24
m=m>>>24
str=str+Integer.toHexString(m)
//System.out.print(" *** "+l[i])
}
System.out.println(str)
int d=l.length
System.out.println("首部长度 :"+(d*8)+"bit")
/*分析协议类型*/
/**
if(packet.getClass().equals(IPPacket.class)) {
IPPacket ipPacket=(IPPacket)packet
byte[] iph=ipPacket.option
String iphstr=new String(iph)
System.out.println(iphstr)
}
*/
if(packet.getClass().equals(ARPPacket.class))
{
System.out.println("协议类型 :ARP协议")
try {
ARPPacket arpPacket = (ARPPacket)packet
System.out.println("源网卡MAC地址为 :"+arpPacket.getSenderHardwareAddress())
System.out.println("源IP地址为 :"+arpPacket.getSenderProtocolAddress())
System.out.println("目的网卡MAC地址为 :"+arpPacket.getTargetHardwareAddress())
System.out.println("目的IP地址为 :"+arpPacket.getTargetProtocolAddress())
} catch( Exception e ) {
e.printStackTrace()
}
}
else
if(packet.getClass().equals(UDPPacket.class))
{
System.out.println("协议类型 :UDP协议")
try {
UDPPacket udpPacket = (UDPPacket)packet
System.out.println("源IP地址为 :"+udpPacket.src_ip)
int tport = udpPacket.src_port
System.out.println("源端口为:"+tport)
System.out.println("目的IP地址为 :"+udpPacket.dst_ip)
int lport = udpPacket.dst_port
System.out.println("目的端口为:"+lport)
} catch( Exception e ) {
e.printStackTrace()
}
}
else
if(packet.getClass().equals(TCPPacket.class)) {
System.out.println("协议类型 :TCP协议")
try {
TCPPacket tcpPacket = (TCPPacket)packet
int tport = tcpPacket.src_port
System.out.println("源IP地址为 :"+tcpPacket.src_ip)
System.out.println("源端口为:"+tport)
System.out.println("目的IP地址为 :"+tcpPacket.dst_ip)
int lport = tcpPacket.dst_port
System.out.println("目的端口为:"+lport)
} catch( Exception e ) {
e.printStackTrace()
}
}
else
if(packet.getClass().equals(ICMPPacket.class))
System.out.println("协议类型 :ICMP协议")
else
System.out.println("协议类型 :GGP、EGP、JGP协议或OSPF协议或ISO的第4类运输协议TP4")
/*IP数据报文数据*/
byte[] k=packet.data
String str1=""
System.out.print("数据 : ")
for(int i=0i<k.lengthi++) {
//int m=0
//m=k[i]
//m=m<<24
//m=m>>>24
//str1=str+Integer.toHexString(m)
str1 = new String(k)
//str1=str1+k[i]
//System.out.print(" *** "+k[i])
}
System.out.println(str1)
System.out.println("数据报类型 : "+packet.getClass())
System.out.println("********************************************")
}
public static void main(String[] args) throws Exception{
// TODO 自动生成方法存根
NetworkInterface[] devices = JpcapCaptor.getDeviceList() //.getDeviceList().
//for (int i =0 i<devices.lengthi++) {
int a=0
//try {
/*本地网络信息*/
byte[] b=devices[1].mac_address //网卡物理地址
//}
//catch() {}
System.out.print("网卡MAC : 00")
for (int j=0j<b.lengthj++){
//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
//System.out.println("网卡MAC : "+Integer.toHexString(a))
for(int n=0n<k.lengthn++) {
System.out.println("本机IP地址 : "+k[n].address) //本机IP地址
System.out.println("子网掩码 : "+k[n].subnet) //子网掩码
}
System.out.println("网络连接类型 : "+devices[1].datalink_description)
//}
NetworkInterface deviceName = devices[1]
/*将网卡设为混杂模式下用网络设备deviceName*/
JpcapCaptor jpcap =JpcapCaptor.openDevice(deviceName, 2000, false, 1) //openDevice(deviceName,1028,false,1)
jpcap.loopPacket(-1,new JpcapTip())
}
}