JPCAP:使用Java來(lái)sniffer網(wǎng)絡(luò )數據包
前幾天在CSDN社區上看到有人提到用JPCAP可以實(shí)現Java抓包的功能,也就是sniffer的功能,很是激動(dòng),就下載了一個(gè)。發(fā)現網(wǎng)上到處流傳的那個(gè)版本無(wú)法使用,就自己實(shí)驗了一下,把我的例子給貼出來(lái)共享一下。
我這個(gè)例子只用了基本的功能,由于我發(fā)現JPCAP本身帶的例子選擇網(wǎng)絡(luò )接口卡時(shí)有問(wèn)題,前面一大部分是選擇用本機的哪個(gè)網(wǎng)絡(luò )接口卡來(lái)抓包, 在Windows 2000下調試通過(guò),可以通過(guò)修改相應的端口號抓到關(guān)注的某種應用層協(xié)議的包,也可以把相應的注釋打開(kāi)看到Raw Packet, 并把抓到的包的內容同時(shí)顯示在控制臺上和保存在capture.txt 文件里,每次抓包的結果用“****”號作了分割。呵呵,發(fā)現這是進(jìn)行網(wǎng)絡(luò )實(shí)驗很好的素材。
JPCAP可以從http://www.sf.net/projects/jpcap上下載,在不同操作系統平臺上上運行需要本地庫支持,即Windows下需要安裝WinPCAP(到http://www.winpcap.org下載),Linux下需要libcap。
編譯和運行下面程序的批處理文件run.bat內容
javac -cp lib\jpcap.jar;. CapturePacketTest.java
java -Djava.library.path=lib -cp lib\jpcap.jar;. CapturePacketTest
下面是測試程序:
// CapturePacketTest.java
import net.sourceforge.jpcap.capture.*;
import net.sourceforge.jpcap.net.*;
import java.util.*;
import java.io.*;
public class CapturePacketTest implements RawPacketListener,PacketListener{
//public Vector<String> CaptureVec = new Vector<String>();
public static FileOutputStream fos = null;
public static void main(String[] args)throws Exception{
// Print copyright info
System.out.println();
System.out.println("Capture Ethernet packet Ver 0.01, author yanqlv(maomao).");
System.out.println("Copyright (c) 2005 yanqlv of Luoyang Normal College, all Rights Reserved.");
System.out.println();
// Determin which capture device to use
PacketCapture pcap = new PacketCapture();
String defaultDevice = pcap.findDevice();
StringTokenizer st1 = new StringTokenizer(defaultDevice,"\n");
String defaultDeviceStr = st1.nextToken();
int default_num = 1;
String[] capDevices = pcap.lookupDevices();
int capdevice_num = capDevices.length;
System.out.println("There"+ (capdevice_num>1?"are":"is") + " "+ capdevice_num +"device"+(capdevice_num>1?"s":"")+" found!");
System.out.println("*****************************************************************************");
for (int i=0; i<capdevice_num; i++){
//System.out.println("*****capture device["+ i +"]="+capDevices[i]);
StringTokenizer st = new StringTokenizer(capDevices[i],"\n");
String capStr = st.nextToken();
String capDesc = st.nextToken();
if( defaultDeviceStr.equals(capStr) ) default_num = i+1;
System.out.println( "[" + (i+1) + "] " + capStr + "\n(" + capDesc + ")");
}
System.out.println("*****************************************************************************");
System.out.println("(default to use "+ default_num +")");
int selectn = 1;
if(capdevice_num > 1 ){
System.out.print("Please select [");
for(int i=0; i<capdevice_num;i++) {
System.out.print(i+1);
if(i!=capdevice_num-1) System.out.print(" or ");
}
System.out.print("]:");
String readstr = new DataInputStream(System.in).readLine();
selectn = Integer.parseInt( new String( readstr ) );
}
//System.out.println("selectn="+selectn);
// Want to save capture result to file
fos = new FileOutputStream("capture.txt");
// Begin capture
pcap.open( (new StringTokenizer(capDevices[selectn-1],"\n")).nextToken(),true );
CapturePacketTest t1= new CapturePacketTest();
pcap.addRawPacketListener(t1);
pcap.addPacketListener(t1);
pcap.capture(-1);
}
public void rawPacketArrived(RawPacket rawPacket){
//System.out.println("rawPacket="+rawPacket);
}
public void packetArrived(Packet packet) {
try{
if( packet instanceof TCPPacket){
TCPPacket tcppacket = ((TCPPacket)packet);
//System.out.println("Packet="+packet);
//System.out.println("window size="+tcppacket.getWindowSize());
//System.out.println("Packet="+((TCPPacket)packet).toColoredVerboseString(true));
//if( tcppacket.getDestinationPort()==110 || tcppacket.getSourcePort() ==110) // pop3
if( tcppacket.getDestinationPort()==80 || tcppacket.getSourcePort() ==80){ // http
String captureStr = new String( tcppacket.getTCPData() );
System.out.println( ">>"+ captureStr);
fos.write(tcppacket.getTCPData());
fos.write(new String("**********************************************************\n").getBytes());
//fos.close();
//CaptureVec.addElement(captureStr);
}
}
}catch(Exception ioe){
System.out.println("Exception ocurred:"+ioe);
}
}
}
JPCAP也提供了生成網(wǎng)絡(luò )數據包的功能,正在探索中,有時(shí)間想做個(gè)能發(fā)Magic Packet網(wǎng)卡遠程喚醒主機的程序,等完成后再貼上來(lái)大家共享。
(上述文章是yanqlv原創(chuàng ),轉貼請注明出處,謝謝關(guān)注)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=547402
聯(lián)系客服