昨天做的事说起来比较简单,就是在电脑上配置好JPCAP,并写一个测试用的程序,目的是检查JPCAP是否能正常工作,再有就是看看能不能把局域网里其他电脑上的数据包截取下来。测试程序如下:
import jpcap.*;
import jpcap.packet.*;
import java.io.*;
public class JpcapTest implements PacketReceiver{
public void receivePacket(Packet p){
System.out.println("***********分析数据包*******************");
//System.out.println(p.toString());
System.out.println("长度:/t"+p.caplen);
System.out.println("数据头:/t");
for(int i=0;i<p.header.length;i++){
System.out.print(Byte.toString(p.header[i]));
}
System.out.println();
System.out.println("IP包属性:");
System.out.println("源IP:/t"+ ((IPPacket)p).src_ip.toString() );
System.out.println("目标IP:/t"+ ((IPPacket)p).dst_ip.toString() );
System.out.println("***********分析数据包*******************");
}
public static void main(String[] args) throws IOException{
NetworkInterface[] devices = jpcap.JpcapCaptor.getDeviceList();
for(int i=0;i<devices.length;i++){
System.out.println("DEVICES "+i+":");
System.out.println("name:/t"+devices[i].name);
System.out.println("description:/t"+devices[i].description);
System.out.println("datalink_name:/t"+devices[i].datalink_name);
System.out.println("datalink_description:/t"+devices[i].datalink_description);
System.out.println("mac_address:/t");
for(int j=0;j<devices[i].mac_address.length;j++){
System.out.print(Integer.toHexString(devices[i].mac_address[j]&0xff) + ":");}
System.out.println();
System.out.println("NetworkInterfaceAddress:/t");
for(int j=0;j<devices[i].addresses.length;j++){
System.out.println("address:/t"+devices[i].addresses[j].address);
System.out.println("broadcast:/t"+devices[i].addresses[j].broadcast);
System.out.println("destination:/t"+devices[i].addresses[j].destination);
System.out.println("subnet:/t"+devices[i].addresses[j].subnet);
}
}
System.out.println("***********************************");
JpcapCaptor cap = jpcap.JpcapCaptor.openDevice(devices[1],1028,true,10000);
cap.loopPacket(-1,new JpcapTest());
}
}
配置JPCAP是比较简单的工作,所以这个程序也就可以正常工作了。配置方法在JPCAP的官网上有:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html。可是,它只能监听到本机上的数据包,没能得到其他电脑上的数据包。为了第二个目的,昨天下午折腾了一下午,可是还是没有结果。
要截取到其他电脑上的数据包,就要把自己的网卡设置成混杂模式,JPCAP包中有一个方法jpcap.JpcapCaptor.openDevice(),里面的第三个参数就是把网卡设置成混杂模式的,可是不管用,难道还要对硬件做一些手脚??嗯,这就是今天最主要的任务了:监听通过其他电脑的数据包。