基于JPcap的数据包捕获实验报告
jpcap+API 使用

贵州大学2002级硕士研究生学年报告基于JPcap的网络流量分析研究与应用学科专业计算机软件与理论研究方向计算机软件导师李祥教授研究生赵新辉中国•贵州•贵阳2003 年6 月目录摘要第一章网络数据包捕获工具Jpcap1.1 Jpcap简介1.2Jpcap需求环境1.3Jpcap的安装1.4Jpcap类库的结构第二章Jpcap类库的分析与应用2.1 使用JpcapHandler接口2.2 使用DatalinkPacket类2.3 使用EthernetPacket类2.4 使用IPAddress类2.5 使用IPv6Option类2.6 使用Jpcap类2.7 使用Jpcap.JpcapInfo类2.8 使用JpcapSender类2.9 使用JpcapWriter类2.10 使用Packet类2.11 使用ARPPacket类2.12 使用IPPacket类2.13 使用ICMPPacket类2.14 使用TCPPacket类2.15 使用UDPPacket类第三章Jpcap在流量分析中的应用3.1 流量分析的研究概况3.1.1 流量分析概况3.1.2 国内研究状况3.1.3 网络流量自相似分析3.2 利用Jpcap实现网络流量图示分析3.3 利用Jpcap实现网络Ethereal工具参考文献摘要论文从JPcap的产生、发展到目前的最新版本,针对Jpcap 0.4版本,对类库中一个类做了必要的分析说明,列出了每个类的继承关系、数据成员、构造函数和成员函数,并对其的功能做了简要地说明。
针对类的功能,为每个类设计了一个Java程序,用实例说明该类的使用方法。
最后使用Jpcap类库设计了一个程序,实现了对局域网内用户上网的口令密码的监听,并做了实际的测试。
Jpcap是日本人Keita Fujiiy开发的一套能够捕获、发送网络数据包的java类库。
这个包用到了libpcap 和原始套接字API,Jpcap在FreeBSD 3.x, Linux RedHat 6.1, Solaris, and Microsoft Windows 2000/XP等系统上经过测试,并且支持Ethernet, IPv4, IPv6, ARP/RARP, TCP, UDP,ICMPv4协议。
嗅探器实验报告

基于JPCAP的网络嗅探器实验报告学号:1106840229姓名:陆凯一、平台和情况简述本实验是用java实现的网络抓包程序。
操作系统环境为windows 7和8 64位。
必要软件为winpcap4.0,jpcapx64,eclipse二、JPCAP简介(以下来自百度百科)众所周知,JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。
JPCAP扩展包弥补了这一点。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用WINPCAP给JAVA语言提供一个公共的接口,从而实现了平台无关性。
三、程序整体设计从实际操作使用的角度上来讲,整个程序由三个.JAVA文件组成,其中两个文件都可以生成Jframe框架。
也就是说程序只有两个界面,一个主界面和一个选择网卡的Dialog界面。
摘取三个文件中的类和方法:1.MainProgram.java:public class MainProgram extends JFrame implements ActionListener:(1)public static void main(String[] args) 主函数(2)public MainProgram()(3)private void initGUI() 界面设计(4)public void actionPerformed(ActionEvent event) 菜单事件响应(5)public void dealPacket(Packet packet) 包处理(6)public String output(Packet p) 十六进制显示2.Jcapturedialog.javaPublic class Jcapturedialog extends JDialog implements ActionListener:(1)public Jcapturedialog(JFrame frame) 构造(2)public void actionPerformed(ActionEvent evt) 按键响应(3)public static JpcapCaptor getJpcap(JFrame parent)3.Jcaptor.javapublic class Jcaptor:(1)public void setJFrame(MainProgram frame)(2)public void capturePacketsFromDevice() 抓包(3)private void startCaptureThread() 开线程(4)public void stopCapture() 关闭线程从整个的抓包流程来讲,用JPCAP类中的函数(形参已省略)来表达,可以表达为:1.通过JpcapCaptor.getDeviceList()获取网卡列表2.通过jpcap.setFilter()设置过滤器3.通过JpcapCaptor.openDevice()打开相应的网卡4.在线程中采用jpcap.processPacket()来抓包5.通过自己编写的dealPacket()针对抓得的包按照不同的协议来分析并产生表格中的数据四、程序编写过程中的问题解决1.JAVA.SWING的使用(界面编写)因为是网工专业,所以在课程中接触JAVA仅仅是大二一门两个学分的专业选修课,在编写这个嗅探器之前完全不知道如何在JAVA中设计界面以及各个组件的方法。
使用jpcap编写抓包程序

使用jpcap编写抓包程序大致原理:winpcap提供底层工具,我们只需要使用它的函数就可以编程,然而很繁琐。
java就再封装一层,就出现JPcap这个中间件了。
使用对比之后,JPcap尼玛不要太方便。
附:工具:winpcap要安装,这个我就不说了。
JPcap作为中间件你需要下载,我没有安装。
1.将JPcap.dll动态链接库加入到我的 C:\Program Files\Java\jdk1.7.0_71\jre\bin 中。
2.Jpacp.jar我直接外部配置路径了。
不多说,贴可用代码主程序类,用于读取网卡接口,并开多线程从各个网卡上读取包package com.sock1;import java.util.Scanner;import jpcap.JpcapCaptor;import workInterface;import jpcap.PacketReceiver;import jpcap.packet.*;/*** 使用jpcap显示网络上的各种数据包* @author */public class sock_main {private static int model;//程序启动主方法public static void main(String args[]){try{System.out.println('请输入你需要抓取的类型包:');System.out.println('TCP包输入‘1’');System.out.println('UDP包输入‘2’');System.out.println('ICMP包输入‘3’');System.out.println('ARP包输入‘4’');Scanner in=new Scanner(System.in);model = in.nextInt();//获取本机上的网络接口对象数组final NetworkInterface[] devices = JpcapCaptor.getDeviceList();for(int i=0;i<devices.length;i ){NetworkInterface nc=devices[i];//创建某个卡口上的抓取对象,最大为2000个JpcapCaptor jpcap = JpcapCaptor.openDevice(nc, 2000, true, 20);startCapThread(jpcap); //线程执行抓包System.out.println('开始抓取第' i '个卡口上的数据');}}catch(Exception ef){ef.printStackTrace();System.out.println('启动失败: ' ef);}}//将每个Captor放到独立线程中运行public static void startCapThread(final JpcapCaptorjpcap ){JpcapCaptor jp=jpcap;ng.Runnable rnner=new Runnable(){ //创建线程public void run(){//使用接包处理器循环抓包jpcap.loopPacket(-1, new TestPacketReceiver(model)); //-1无限抓取包,抓包监听器获取包}};new Thread(rnner).start();//启动抓包线程}}抓包类,实现抓包功能,并输出信息package com.sock1;import jpcap.PacketReceiver;import jpcap.packet.ARPPacket;import jpcap.packet.DatalinkPacket;import jpcap.packet.EthernetPacket;import jpcap.packet.ICMPPacket;import jpcap.packet.Packet;import jpcap.packet.TCPPacket;import jpcap.packet.UDPPacket;/*** 抓包监听器,实现PacketReceiver中的方法:打印出数据包说明*/class TestPacketReceiver implements PacketReceiver {public int model;public TestPacketReceiver (int n){this.model = n;}/*** 实现的接包方法:*/public void receivePacket(Packet packet) {//Tcp包if(packet instanceof jpcap.packet.TCPPacket && model== 1){TCPPacket p=(TCPPacket)packet;String s='TCPPacket:| 目的ip及端口 ' p.dst_ip ':' p.dst_port '|源ip及端口 ' p.src_ip ':' p.src_port' |数据长度: ' p.len;System.out.println(s);}//UDP包else if(packet instanceof jpcap.packet.UDPPacket && model== 2){UDPPacket p=(UDPPacket)packet;String s='UDPPacket:| 目的ip及端口 ' p.dst_ip ':' p.dst_port '||源ip及端口 ' p.src_ip ':' p.src_port' |数据长度: ' p.len;System.out.println(s);}//ICMPPacket包else if(packet instanceof jpcap.packet.ICMPPacket && model== 3){ICMPPacket p=(ICMPPacket)packet;//ICMP包的路由链String router_ip='';for(int i=0;i<p.router_ip.length;i ){router_ip =' ' p.router_ip[i].getHostAddress();}String s='@ @ @ ICMPPacket:| 路由IP: ' router_ip' |redir_ip: ' p.redir_ip' |最大传输单元: ' p.mtu' |长度: ' p.len;System.out.println(s);}//ARP请求包else if(packet instanceof jpcap.packet.ARPPacket && model== 4){ARPPacket p=(ARPPacket)packet;//Returns the hardware address (MAC address) of the senderObject saa= p.getSenderHardwareAddress();Object taa=p.getT argetHardwareAddress();String s='* * * ARPPacket:| 发送硬件地址: ' saa'|目标硬件地址: ' taa' |长度: ' p.len;System.out.println(s);}//取得链路层数据头 :如果你想局网抓包或伪造数据包,嘿嘿DatalinkPacket datalink =packet.datalink;//如果是以太网包if(datalink instanceof jpcap.packet.EthernetPacket){ EthernetPacket ep=(EthernetPacket)datalink; String s=' 以太包: ''|目的MAC: ' ep.getDestinationAddress()'|源MAC: ' ep.getSourceAddress();System.out.println(s);}}}。
基于Sharpcap的数据包捕获应用设计

基于Sharpcap的数据包捕获应用设计银国徽,巩微中国传媒大学计算机学院摘要:研究了基于Sharpcap的局域网数据包的捕获机制(再细化一点),实现了.NET平台下的原始数据包捕获应用设计(再多两句话说明一下设计方法),解决了.Net下使用原始套接字抓包慢、丢包严重的问题,填补了.Net程序员捕获原始数据包的空白,实践证明此方法快速、准确、稳定、高效(较多的称赞话应放在结论部分,此处只说明实现了并得到一个什么结果)。
关键词:Sharpcap;数据包;捕获;C#;.Net;1、引言Internet的飞速发展使网络用户及规模逐渐变大,网络维护与安全日益重要。
目前,C++开发人员用Winpcap来捕获底层数据包,Java开发人员则采用Jpcap来捕获底层数据包,而C#程序员还是使用原始套接字进行网络抓包,但是Raw Socket(这只是中英文的两种称呼,应统一。
若是,英文文章就无所谓了,也就只能是一种称呼)不仅只能抓IP层以上的包,且抓包慢、丢包严重的缺陷一直困扰着大家,因此底层网络控制被定位为.Net的软肋(有引用吗?有的话,加上引用;没有的话,这句话不合适,不像是学术文章,更像是大白话)。
本文介绍了.Net 平台下使用Sharpcap捕获原始数据包的始末,并展示了C#编写的程序运行界面,希望以此帮助那些想在.Net平台下对捕获原始数据包而束手无策的人(还是刚才的问题,要更学术一些)。
2、局域网数据包捕获原理局域网使用的是广播信道,从一个站点可以很方便的访问全网。
计算机与外界局域网的连接是通过通信适配器(Adapter),适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的。
所谓广播通信就是一台计算机发送数据时,总线上的所有计算机都能检测到这个数据。
为了在总线上实现一对一通信,每个计算机都配备了全球唯一的MAC地址,在发送数据帧时,在帧的首部写明接收站的地址,总线上的每台计算机在检测到该数据帧时,适配器都会把数据帧的地址与自己的MAC地址匹配,如果一致则接收,否则丢弃。
0219_基于Jpcap的TCPIP数据包分析2

基于Jpcap的TCP/IP数据包分析2001 赵新辉目录第一章以太网的结构和TCP/IP1.1 以太网的结构1.1.1 基于网络架构的以太网1.1.2 以太网的数据交换1.1.3 以太网帧的结构1.2 IP数据报的构成1.2.1 IP地址1.2.2 路由1.2.3 IP数据报的构成1.2.4 其他报文结构1.3 TCP/UDP1.3.1 TCP/UDP的作用1.3.2 TCP和UDP报文的结构第二章Jpcap类库2.1 Jpcap的使用2.1.1 Jpcap的运行环境的安装2.1.2 Jpcap的开发环境的安装2.2 Jpcap介绍2.2.1 Packet基类及其子类2.2.2 Jpcap的主要功能第三章数据包监听程序的设计3.1 数据包监听原理3.2 以太网帧的解析3.2.1 获取MAC地址3.2.2 数据包类型的判断3.3 IP数据报的监听3.3.1 IP数据报的解析3.3.2 ARP和ICMP数据报解析3.4 TCP和UDP监听3.4.1 TCP数据报的解析3.4.2 UDP数据报的解析第四章数据包分析4.1 流量分析4.1.1 数据包大小的表示4.1.2 数据包流量观测4.2 数据包分类分析4.2.1 数据包过滤4.2.2 利用数据包分析解决网络问题第五章数据包发送5.1 构造发送IP数据包5.1.1 IP数据包构造与发送5.1.2 发送结果分析5.2 构造发送TCP数据包5.2.1 TCP数据包构造与发送5.2.2 发送结果分析第一章太网的结构和TCP/IP1.1 以太网的结构以太网是当今现有局域网采用的最通用的通信协议标准。
该标准定义了在局域网(LAN)中采用的电缆类型和信号处理方法。
以太网在互联设备之间以10~100Mbps的速率传送信息包,双绞线电缆10 Base T以太网由于其低成本、高可靠性以及10Mbps的速率而成为应用最为广泛的以太网技术。
许多制造商提供的产品都能采用通用的软件协议进行通信,开放性最好。
基于Jpcap的入侵检测数据源获取方法

第33卷第1期2017年2月昆明冶金高等专科学校学报Journal of Kunming Metallurgy College Yol. 33 No. 1 Feb. 2017doi:10.3969/j.issn.1009 -0479.2017.01.010基于Jpcap的入侵检测数据源获取方法许卫la,许辰铭2,王素琼lb(l a.昆明冶金高等专科学校实训处,云南昆明650033; 2.云南文化艺术职业学院通识中心,云南昆明650111;l b.昆明冶金高等专科学校校工会,云南昆明650033)摘要:网络入侵检测系统(N ID S)是当今网络攻防战中保护网络安全的有力手段之一。
国内外众多研究者的 目光也都聚焦于此,在检测模型、检测方法、实际运用等方面都取得了巨大成就,但在众多的研究成果中,关于入侵检测测试数据的获取方法却一直鲜有涉足。
至今,KDDCUP 99’数据集仍然是用于入侵检测系统测试实 验的较好的数据源,但它是一个静态数据源,这使得在KDDCUP 99’数据集测试下效果很好的NIDS在动态网 络状态下效果不理想。
基于这一问题,提供了一种通过JAVA类包Jpcap捕获网络IP数据包,提取其中信息,建 立一个新的具有KDDCUP 99’数据集部分特征的数据源的方法。
关键词:入侵检测;数据源;Jpcap; KDDCUP 99’;实用性中图分类号:TP393. 08 文献标志码:A 文章编号:1009 - 0479 - (2017)01 -0057 - 04 Jpcap-based Method to Obtain the NIDS Data SourceXU W eila, XU Chenming2, WANG Suqionglb(la. Practical Training Division, Kunming Metallurgy College, Kunming 650033, China;2. General Education Centre, Yunnan Vocational College of Arts and Culture, Kunming 650111 , China;lb. Labor Union, Kunming Metallurgy College, Kunming 650033, China.)Abstract:Network Intrusion Detection System ( NIDS) is one of the most effective methods in internet security protection. Numerous researchers at home and abroad have focused on it and obtained tremendous achievements in detection model, detection methods and practical application. Nowadays KDDCUP 99^data sets are still the preferable data source to be used in testing the experiments of NIDS. However,as a static data source, it doesn’t work well in dynamic situations. Therefore, this paper establishes a new method with some characteristics of KDDCUP 99, by the data packet of Jpcap of JAVA to capture networkIP and pick up the information.Key words:intrusion detection;data source; Jpcap; KDDCUP99 ^ ;practicability〇引言对于用于实验的网络入侵检测数据源,国内外很多研究者都倾向于采用KDDCUP99’数据集。
jPcap网络流量数据采集模块实现

如果上面的例子你理解了,那么统计流量数据将是一件非常简单的事;我们的需求就是怎么将这个小模块设计得更加紧凑以便其它对象调用。
流量采集器对外提供调用的类是Tcpdump.java,这个类要根据网卡个类启动对应的后台线程抓取统计数据---也就是说这个启只能启动一次所有线程,无论其它对象如何调用它。
因此我们将Tcpdump.java设计为单实例类;Tcpdump类所要启动的后台线程是LoopPacketThread.java,这个类是实现了Thread的线程,它的run方法中将运行对应的网卡数据统计调用; Tcpdump类中有一个Map,用以存放对应网卡上采集的数据,采集线程会将统计到的数据根据其对应的网卡名字放入到Map中保存。
首先我们看LoopPacketThread.java类的实现:Java代码/***统计某一个网卡上流线的线程* @author */class LoopPacketThread extends Thread{private JpcapCaptor jpcap ;private String ipAdd;/*** 构造器* @param jpcap:cap对象* @param ipAdd:网络地址名字*/public LoopPacketThread(JpcapCaptor jpcap,String ipAdd){ this.jpcap=jpcap;this.ipAdd=ipAdd;}public void run(){//-1表示永远抓取this.jpcap.loopPacket(-1, new DumpPacket(this.ipAdd));}}这个类很简单,关键是它的run方法中,在loopPacket时传入了DumpPacket对象,DumpPacket.java是实现了PacketReceiver接口的类,在其中对网卡数据进行统计,并将统计结果放入缓存:Java代码/*** 抓包监听器,实现PacketReceiver中的方法,当数据包到达时计数.* @author */class DumpPacket implements PacketReceiver {private String ipAdd;DumpPacket(String ipAdd){this.ipAdd=ipAdd;}//实现包统计public void receivePacket(Packet packet) {//将数据加入缓存表中待图片生成servlet提取Tcpdump.ins().putNetValue(ipAdd, packet.len);System.out.println(currentTime()+": "+ipAdd+" 收到长为:*"+ packet.len);System.out.println(packet);}/***日志时间信息* @return:日志内容时间*/private static String currentTime(){Date d = new Date();SimpleDateFormat kk=new SimpleDateFormat("mm:ss");String strTime=kk.format(d);return strTime;}}OK,接下来就是关键的Tcpdump类实现了:Java代码/*** 1.使用jpcap抓取网络流量的主类,* 2.这个类要根据网卡个数,启动线程分别抓取各个网卡上的流量入中* 3.生成图表的对象从流量表中取出数据* 4.这个类设计为单实例,在第一次调用时启动抓数据线程;* 5.目前没有设计停止抓取机制....* @author */public class Tcpdump {/*** 单实例调用:其它对象调用这个类的方法时,必须通过这个方法 * 这样,保证了流量统计线程的启动,且只启动了一次* */public synchronized static Tcpdump ins(){if(null==tcpdump){tcpdump=new Tcpdump();tcpdump.init();}return tcpdump;}/**生成报表的Servlet调用用于生成图表中数据*/public Map<String, Integer> getNameTrafficMap(){return nameTrafficMap;}/*** 根据网卡个数,启动统计线程* 注意:本地地址,即127.0.0.1上的不统计*/private void init() {try{//获取本机上的网络接口对象final NetworkInterface[] devices = JpcapCaptor.getDeviceL ist();for(int i=0;i<devices.length;i++){NetworkInterface nc=devices[i];//大与零则为有效网卡,不抓本机地址.if(nc.addresses.length>0){//一个网卡可能有多个地址,只取第一个地址String addr=nc.addresses[0].address.toString();// 创建某个卡口上的抓取对象,JpcapCaptor jpcap = JpcapCaptor.openDevice(nc, 200 0, true, 20);//创建对应的抓取线程并启动LoopPacketThread lt=new LoopPacketThread(jpcap,add r);lt.start();System.out.println( addr+"上的采集线程己启动************");}}}catch(Exception ef){ef.printStackTrace();System.out.println("start caputerThread error ! ! ! !"+ef);}}/**IP和抓到包的长度放入hash表中,用表中长度加入放入的长度*/void putNetValue(String name,int value){if(nameTrafficMap.containsKey(name)){value=nameTrafficMap.get(name)+value;nameTrafficMap.put(name, value);}else{nameTrafficMap.put(name, value);}}private Tcpdump(){}/**存入某个地址名字和流量统计值*/private Map<String, Integer> nameTrafficMap=new java.util .HashMap();//单实例private static Tcpdump tcpdump=null;}这个类除了要注意单实例设计模式个,关键的一个方法是:Java代码/**IP和抓到包的长度放入hash表中,用表中长度加入放入的长度*/ void putNetValue(String name,int value){if(nameTrafficMap.containsKey(name)){value=nameTrafficMap.get(name)+value;nameTrafficMap.put(name, value);}else{nameTrafficMap.put(name, value);}}这个方法保证了采集到的数据在内存中的连续性,生成图片的Servlet从这个map中每取一次对应网卡的数据,就将其历史统计值清零。
JAVA课程设计--抓取数据包

**大学计算机科学与技术学院实验报告(2007 ~2008 学年度第一学期)课程名称网络编程技术项目名称网络抓包姓名学号专业计算机班级地点教师一实验目的:1. 通过学习,使大家熟练掌握JA VA的安装,配置及其运行环境。
2. 初步掌握如何连接JA VA和数据库。
3.从网络上采集至10万个数据包分别存入TXT文件和数据库中。
4.完成协议统计、包长统计。
5.实现数据包流量的时间变化(10分钟为单位)直观的统计图。
二.软硬件环境操作系统:Windows xp数据库:SQL Server 2000开发环境:JDK_1_5-0-07, WinPcap_4_0_1,JCreator Pro 3.5三实验原理:1. Java语言具有以下特点:简单、面向对象、分布式、解释执行、安全、跨平台、高性能、多线程等特点。
首先安装上述开发环境中的各个软件,Winpcap 是一个第三方类库,为Jpcap提供基础类Jpcap是一个静态库,可以被包截获程序直接调用,它应用Packet.dll导出的服务向上层应用程序提供强有力的截获界面。
它是应用程序的一部分。
1)建立获取网络数据包的程序为JpcapTip.java2)建立数据包流量的时间变化直观图和包长统计为ImageTest.java3)建立对数据进行协议统计的程序为ConnServer.java2. 在JpcapTip.java中向txt文件写入10万个IP数据包,包括(IP的源地址,目标地址,高层协议,长度, 版本号,标识符,标志,段偏移量,数据报的寿命数值,服务型号,数据),然后在把IP数据包的信息存放到SQL server 2000的数据库中。
3. 在ImageTest.java中统计共收集多少个数据包,计算平均包长,并统计包长。
4. 在ConnServer.java中协议统计。
四、网卡设置1:openDevicepublic static Jpcap openDevice(ng.String device, int snaplen, boolean promisc, int to_ms),第一个参数为string,指定要打开的设备名;第二个参数为int,指定每个包返回数据的长度;第三个参数为混杂标志,如果设为1,将网卡设置为混杂模式,监听全网段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告实验名称基于JPcap的数据包捕获器课程名称计算机网络原理与技术姓名李辉成绩班级软件0806学号3901080608日期2010.4地点电子楼四楼实验室备注:小组合作实验,组员:李辉、黄钰1.实验目的基于java第三方包JPcap编写数据包捕获器,该捕获器具有以下功能:a)监听并捕获以太网帧b)分析IP数据报c)分析ARP/RARPd)分析TCP、UDP数据报e)分析ICMP报文f)分析HTTP报文g)简单的网络流量分析功能2.实验环境(软件、硬件及条件)1)Jpcap和Wincap简介Jpcap是一个能够捕获、发送网络数据包的java类库包。
这个包用到了Libpcap/Winpcap和原始套接字API,目前,Jpcap在FreeBSD 3.x, Linux RedHat 6.1, Solaris, and Microsoft Windows 2000/XP 系统上已经做过测试,并且支持Ethernet, IPv4, IPv6, ARP/RARP, TCP, UDP, ICMPv4协议。
Jpcap是由在美国加利福尼亚大学Irvine 分校(UCI)攻读博士学位的日本人Keita Fujiiy研制发布的,其主页为/kfujii/ 。
其最初版本是2000.6发布的Jpcap0.1版,此后几经修改,到2003.4发布了发布Jpcap0.4版。
JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。
JPCAP扩展包弥补了这一点。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,给JAVA语言提供一个公共的接口,从而实现了平台无关性,并能够捕获、发送网络数据包。
Winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
2)编程环境要求i.安装Java SDK()ii.安装最新版本的LibPcap(对于UNIX平台,/) 或者WinPcap (对于Windows平台,http://winpcap.polito.it/)iii.下载并解压缩Jpcap的最新版本(/kfujii/jpcap/doc/index.html )。
iv.以Window XP系统为例,具体准备工作如下:1.复制Jpcap.dll到C:\WINDOWS\system322.安装winpcap4.0.23.在工程中导入 jpcap.jar3.实验方法Jpcap0.4版本共有1个分析器接口14个分析器类,分别简介如下:1、接口综述JpcapHandler :这个接口用来定义分析被捕获数据包的方法2、类综述ARPPacket :这个类描述了ARP/RARP包,继承了Packet类DatalinkPacket :这个抽象类描述了数据链路层EthernetPacket :这个类描述了以太帧包,继承DatalinkPacket类ICMPPacket :这个类描述了ICMP包,继承了IPPacket类IPAddress :这个类描述了IPv4和IPv6地址,其中也包含了将IP·地址转换为域名的方法IPPacket :这个类描述了IP包,继承了Packet类,支持IPv4和IPv6IPv6Option :这个类描述了IPv6选项报头Jpcap :用来捕获数据包Jpcap.JpcapInfo :Jpcap的内部类,它包含被捕获数据包的信息(在jpcap0.4修改部分BUG之后不再使用这个类)JpcapSender :它用来发送一个数据包JpcapWriter :它用来将一个被捕获的数据包保存到文件Packet :这个类是所有被捕获的数据包的基类TCPPacket :这个类描述TCP包,继承了IPPacket类UDPPacket :这个类描述了UDP包,继承了IPPacket类具体api帮助文档见附录。
4.实验分析以下以抓取ip数据包为例讲解抓包基本步骤:1.绑定网络设备2.抓包3.分析以下代码见Test工程import java.io.IOException;import jpcap.JpcapCaptor;import workInterface;import jpcap.packet.IPPacket;import jpcap.packet.Packet;/***ip数据包捕获演示例子*@author李辉**/public class IPPacketTest {public static void main(String[] args) {/*-------------第一步绑定网络设备--------------------*/NetworkInterface[] devices=JpcapCaptor.getDeviceList(); //返回一个网络设备列表for(NetworkInterface n : devices)System.out.println( + " | " + n.description );System.out.println("------------------------------------");JpcapCaptor jpcap=null;int caplen = 1512;boolean promiscCheck = true;//caplen限制每一次收到一个数据包,只提取该数据包中前多少字节//Promisc:设置是否混杂模式。
处于混杂模式将接收所有数据包,若之后又调用了包过滤函数setFilter()将不起任何作用//50这个参数主要用于processPacket()方法,指定超时的时间try {jpcap=JpcapCaptor.openDevice(devices[1],caplen,promiscCheck,50);} catch (IOException e) {e.printStackTrace();}/*----------------第二步抓包---------------*/int i = 0;while(i < 10){Packet packet = jpcap.getPacket();if(packet instanceof IPPacket && ((IPPacket)packet).version==4) {i++;IPPacket ip=(IPPacket)packet; //将包强制转为IP包System.out.println("版本:IPv4");System.out.println("优先权:" + ip.priority);System.out.println("区分服务:最大的吞吐量:" + ip.t_flag);System.out.println("区分服务:最高的可靠性:" + ip.r_flag);System.out.println("长度:" + ip.length);System.out.println("标识:" + ip.ident);System.out.println("DF:Don't Fragment:" + ip.dont_frag); System.out.println("MF:More Fragment:" + ip.more_frag); System.out.println("片偏移:" + ip.offset);System.out.println("生存时间:" + ip.hop_limit);String protocol = null;switch(new Integer(ip.protocol)){case 1:protocol = "ICMP";break;case 2:protocol = "IGMP";break;case 6:protocol = "TCP";break;case 8:protocol = "EGP";break;case 9:protocol = "IGP";break;case 17:protocol = "UDP";break;case 41:protocol = "IPv6";break;case 89:protocol = "OSPF";break;default:break;}System.out.println("协议:" + protocol);System.out.println("源IP:" + ip.src_ip.getHostAddress()); System.out.println("目的IP:" + ip.dst_ip.getHostAddress()); System.out.println("源主机名:" + ip.src_ip);System.out.println("目的主机名:" + ip.dst_ip);System.out.println("------------------------------------");}}}}其他抓包过程类似,已经能够抓取的数据包:详细程序代码见附录PacketCapure工程5.实验结论数据包捕获器界面6.参考资料1.贵州大学2002级硕士研究生学年报告《基于JPcap的网络流量分析研究与应用》李祥赵新辉2.JpcapDumper ver.0.3 Keita Fujiiy7.附件1. 代码文件夹下有Test工程和PacketCapure工程,其中PacketCapure即为本实验所做的捕获器,Test为原理演示工程。
2. API文件夹下是帮助文件3. 所需第三方类库文件夹下是所需的第三方类库4. 参考资料文件夹下有《基于JPcap的网络流量分析研究与应用》和JpcapDumper ver.0.35.根目录下有本实验报告电子版和演示ppt。