java

来源:互联网 发布:淘宝包装类目店铺风格 编辑:程序博客网 时间:2024/05/17 09:40

利用Java进行网络数据包捕捉|《软苑》56期Top Tips

在上一期的栏目中我们介绍了通过Fiddler嗅探Http协议网络数据包的方法,并且在文章最后通过开心农场的例子来展示网络嗅探的基本操作。但手工获得数据毕竟耗时耗力,颇为麻烦,不妨将这个工作交给电脑,写一个程序让电脑在点击好友的时候自动嗅探到信息数据包并进行处理。这期我们就来介绍一下如何在Java平台下通过第三方包来进行底层网络嗅探。

Java平台本身不支持底层网络操作,需要第三方包利用JNI封装不同系统的C库来提供Java的上层接口。常用的类库包括JPcap,JNetPcap等,他们都是基于TcpDump/LibPcap的Java封装。其中JPcap已经一年多没更新了,而JNetPcap (jnetpcap.com) 在上周刚刚发布了1.2 RC5版本,添加了很多实用的类库,诸如高级协议分析等,本文就以JNetPcap作为例子来进行介绍。

使用JNetPcap之前必须在目标系统中安装WinPcap(Windows系统),以提供JNetPcap所需要的链接库。另外要把JNetPcap包和所属的dll文件都加入到开发目录的环境变量中。

Pcap类是JNetPcap中最为核心的类,是一个对LibPcap中方法的Java直接映射,提供了取得网卡设备列表、打开嗅探、设置过滤器等等必须的工作。

一、获得网卡列表

通过Pcap.findAllDevs(alldevs, errbuf) 这个静态方法将所有本机网卡加入到alldevs的List<PcapIf >中。然后用户可以选择一个网卡进行监听。注意基于PPPOE拨号的网络连接在实际测试中似乎并不能被嗅探到,例如笔者的铁通连接无法被嗅探,其中的问题还有待考证。

二、打开连接

调用Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf)静态方法,返回一个Pcap对象。其中5个参数分别表示设备的系统名称(不是设备别名)、每次捕捉的数据量、捕捉方式、超时和错误信息缓冲区。推荐的参数配置在JNetPcap的文档中有详细说明,这里不再赘述。需要注意的是超时不宜过小,否则会造成数据包捕捉不完全的问题。时间至少应该保证一个数据包完全接收。

三、开始监听
调用pcap.loop(int cnt, JPacketHandler<T> handler, T user) 方法即可进行监听,在loop方法的参数中有两点需要关注,第一点是用户指定的数据包分析器,在之后的文章中将详细介绍;第二点是一个泛型参数,表示传输给分析器的用户指定类型的消息。

四、数据包分析

捕捉到数据包后当然要进行分析。在这里我们使用继承JPacketHandler来实现自己的处理方法。
在JPacketHandler有一个nextPacket(JPacket packet, T user) 方法,这是典型的通过事件机制来实现处理数据包的方法。每当Pcap嗅探到一个数据包后,他就会调用用户之前绑定的分析器中的nextPacket方法进行处理。注意这个方法是阻塞的,也就避免了潜在的同步问题。传进的JPacket参数包含了这个数据包中的所有信息,通过不同的内置Header分析器可以分析不同的协议。在最近的RC5版本中甚至加入了HTTP协议和图像数据的直接分析,免去了之前RC4版本中需要通过ACK信息手工拼合chunked的数据包,然后手工分析HTTP协议文本的麻烦。限于篇幅,这里不多做介绍,具体方法可以参照API,我们只简单的调用toString()方法将这个数据包打印在控制台中。

JNetPcap无疑是当前最强大以及最具有潜力的网络数据包捕捉类库。感谢Mark B. 的辛苦工作,让Java的JNI世界更加精彩。

原创粉丝点击