网络嗅探可是说是网络开发的一个基础,SNIFFER、IDS都是在这个基础上开发的,一个提供了网络分析,一个提供了入侵检测。实现一个网络嗅探程序到底有多难呢?可以很复杂,也可以很简单。在WINDOWS平台下,大多依靠的是WINPCAP,如果你觉得还复杂,那就再封装。JAVA就把它封装成了JPCAP,就是在WINPCAP的DLL基础上又提供了几个包(JAR),你只要引入你的包,创建包中的对象,引用人家的方法就好了。下面是一个很简单的例子,嗅探进入192.168.10.206的HTTP数据包的源地址、长度和二进制数据,并记录到out.txt文件中: 过程很简单,建立PacketCapture对象,lookupDevices发现本地网卡设备,打开其中一个,设置过滤条件,加入监听器,然后在监听程序中判断包格式,把源地址、长度和包数据写入文件。但是要说道原理就复杂多了,那要看网络的书了,各种协议的格式等等。总之有DLL的支援,JAVA的封装,留给我们的就是照猫画虎了。懂如何抓包的么?不懂!但是我可以抓到包并且分析之!这就够了。
import net.sourceforge.jpcap.capture.*; import net.sourceforge.jpcap.net.*; import java.util.*; import java.io.*;
public class mycap implementsPacketListener{
public static FileOutputStream fos =null; private static final String FILTER = "dst host 192.168.10.206 andproto TCP and src port 80"; public static void main(String[] args)throws Exception{ int default_num = 1;
PacketCapture pcap = new PacketCapture(); String[] capDevices = pcap.lookupDevices();
pcap.open( (newStringTokenizer(capDevices[default_num],"\n")).nextToken(),true); pcap.setFilter(FILTER, true);
fos = new FileOutputStream("out.txt");
mycap t1= new mycap(); pcap.addPacketListener(t1); pcap.capture(-1);
} public void packetArrived(Packet packet) { try{ if(packet instanceof TCPPacket){ TCPPacket mytcppacket = (TCPPacket) packet; fos.write("\n-----------------------------------------------------\n".getBytes()); fos.write((mytcppacket.getSourceAddress()+"\t\t"+mytcppacket.getLength()+"\n").getBytes()); fos.write(mytcppacket.getData()); } }catch(Exception ioe){ System.out.println("Exception ocurred:"+ioe); } }
}
注意: 1.你的机器可能有多个网卡,所以要lookupDevices,以便open你要的设备。标准的做法是显示出来,选择一个open,参数true是指打开网卡为混杂模式。 2.setFilter过滤条件的表达格式是BNF的,应参照WINPCAP的过滤格式。不设置过滤条件就是嗅探所有的数据包。 3.数据包封装的继承图是:Packet-EthernetPacket-ARPPacket, IPPacket-ICMPPacket,IGMPPacket, TCPPacket, UDPPacket。基本实现了TCP/IP的框架。 4.各个类的函数说明参见源代码压缩包中的说明文件。