`
pengtyao
  • 浏览: 400932 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jpcap 网络抓包工具

阅读更多
1.jpcap说明与安装

   JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点,jPcap是一个可以让java工作在链路层的类库;当然,它底层还是使用了本机API通过Jini调用,在javaAPI中得到数据。JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统。jPcap下载地址:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html ;  你可以从jpcap网站上直接下载它的桌面应用程序进行测试,可以全面的统计本机的网络数据流量及收发包数据。
Jpcap is a Java class package that allows Java applications to capture and/or send packets to the network.
Jpcap is based on libpcap/winpcap and Raw Socket API. Therefore, Jpcap is supposed to work on any OS on which libpcap/winpcap has been implemented. Currently, Jpcap has been tested on FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP.
Jpcap supports the following types of packets: Ethernet, IPv4, IPv6, ARP/RARP, TCP, UDP, and ICMPv4.  Other types of packets are captured as raw packets (i.e., instances of the Packet class) which contains the whole data of the packets.  This allows Java applications to analyze unsupported packet types.

本项目中使用的是jPcap0.6版本,从其网站上下载Source build后,可以看到其下详细的目录结构,源码,例程及Native lib。

         使用jPcap可以编写出功能完备的网络嗅测程序,本节中,我们只是使用其非常简单的一个功能:统计本机每块网卡上收发数据的总量。
   特别注意:jpcap运行时依赖winCap的类库,使用前必须在机地安装winCap(http://www.winpcap.org/ )(如果是在liunx上,则请到http://www.tcpdump.org/ 下载)。本节中jPcap版本为0.6,winCap版本为4.0,运行与win32系统上。


2.jPcap小试:显示本机网络接口详情

jPcap中的API非常简单,可查看其在线文档:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/javadoc/index.html 。当然,要灵活的使用,你必须有良好的tcp/ip协议知识基础,对常用的3个关键类,简介如下:
JpcapCaptor类
这个类是jPcap中的核心对象,一个JpcapCaptor对象代表了了系统中的一个网络接口卡;通过对JpcapCaptor对象的调用,实现网络数据包的抓取和发送。它供了一系列静态方法调用如:获取网卡列表,获取某个网卡上的JpcapCaptor对象。

static NetworkInterface[]getDeviceList()
这个静态方法调用,可以返回机器上网络接口卡对象的数组,数组中每一个NetworkInterface元素对象代表一个网络接口;一般使用jPcap所要做的第一步调用就是这个方法。
static JpcapCaptor openDevice(NetworkInterface interface, int snaplen, boolean promisc, int to_ms)
    取得在指定网卡上的Jpcapcator对象,Interface:上所返回的某个网卡对象Snaplen:一次性要抓取数据包的最大长度。Promisc:设置是否混杂模式。处于混杂模式将接收所有数据包,如果设置为混杂模式后调用了包过滤函数setFilter()将不起任何作用;To_ms:这个参数主要用于processPacket()方法,指定超时的时间;
int loopPacket(int count, PacketReceiver handler)
    常用的一种模式是,通过getDeviceList()取得所有网络接口,再通过openDevice方法取得每个网络接口上的JpcapCaptor对象,就可通过这个方法抓包了。loopPacket方法中count参数表示要抓的包的数目,如果设备为-1,责表示永远抓下去---方法不会返回;第二个参数必须是实现了PacketReceiver接口的一个对象,抓到的包将调用这个PacketReceiver对象中的receivePacket(Packet packet)方法处理;所以抓包前,我们必须写一个实现了PacketReceiver接口的类。  特别注意的是:这个方法的调用会阻塞等待,如果没有抓到指定count的包、或count设为-1,这个方法都不会返回。所以,聪明的你肯定想到了,如果要抓取机器上多个卡口上的包,这个方法必须放在一个独立的线程中。
void breakLoop()    
   即上JpcapCaptor对象上阻塞等待的方法强制终止。当调用processPacket()和loopPacket()后,再调用这个方法可以强制让processPacket()和loopPacket()停止。

interface PacketReceiver :
数据包处理器接口定义,要处理收到的数据包,必须编写这个接口的实现类,在JpcapCaptor对象的loopPacket方法中调用.

这个接口中仅有一个方法定义:
Void receivePacket (Packet p)   
    实现类中处理接收到的Packet对象的方法。每个Packet对象代表从热指定网络接口上抓取到的数据包。

NetworkInterface类
NetworkInterface类该类的每一个实例代表一个网络设备,一般就是网卡。这个类只有一些数据成员,除了继承自java.lang.Object的基本方法以外,没有定义其它方法。(但我还不知它与jdk5.0以上的API中的java.net.InterfaceAddress类是否可以互换)。

NetworkInterfaceAddress[]addresses   
    这个接口的网络地址。设定为数组应该是考虑到有些设备同时连接多条线路,例如路由器。但我们的PC机的网卡一般只有一条线路,所以我们一般取addresses[0]就够了。
java.lang.String datalink_description.    
    数据链路层的描述。描述所在的局域网是什么网。例如,以太网(Ethernet)、无线LAN网(wireless LAN)、令牌环网(token ring)等等。
java.lang.String datalink_name datalink_name  
    该网络设备所对应数据链路层的名称。具体来说,例如Ethernet10M、100M、1000M等等。
java.lang.String description   
    网卡是XXXX牌子XXXX型号之类的描述。例如我的网卡描述:Realtek RTL8169/8110 Family Gigabit Ethernet NIC
boolean Loopback     标志这个设备是否loopback设备。
byte[]mac_address    网卡的MAC地址,6个字节。
java.lang.String Name     这个设备的名称。例如我的网卡名称:\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5}
jPcap的API使用很简单,如下代码示例:显示机器上的所有网络接口DispalyNetInterface.java:

import jpcap.JpcapCaptor;  
import jpcap.NetworkInterface;  
import jpcap.PacketReceiver;  
import jpcap.packet.Packet;  
/** 
 * 使用jpcap显示网络接口数据. 
 */  
public class DispalyNetInterface {  
      
      
   public static void main(String args[]){  
       try{  
 //获取本机上的网络接口对象数组  
 final NetworkInterface[] devices = JpcapCaptor.getDeviceList();  
        for(int i=0;i<devices.length;i++){  
     NetworkInterface nc=devices[i];  
     //一块卡上可能有多个地址:  
     String address="";  
 for(int t=0;t<nc.addresses.length;t++){  
address+="|addresses["+t+"]: "+nc.addresses[t].address.toString();  
              }  
//打印说明:  
 System.out.println("第"+i+"个接口:"+"|name: "+nc.name  
+"|loopback: "+nc.loopback+"\r\naddress: "+address);  
        }  
           
        }catch(Exception ef){  
            ef.printStackTrace();  
     System.out.println("显示网络接口数据失败:  "+ef);  
    }  
   }  
}  




不幸的是,这段代码运行时会报如下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jpcap in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)    at java.lang.Runtime.loadLibrary0(Runtime.java:823)    at java.lang.System.loadLibrary(System.java:1030)    at jpcap.JpcapCaptor.<clinit>(JpcapCaptor.java:250)    at cn.netjava.cewolf.DispalyNetInterface.main(DispalyNetInterface.java:19) 

   还记得我们介绍jPcap: “它底层还是使用了本机API通过Jini调用,在javaAPI中得到数据”,这是因为当前cp中少了jpcap要调用的本地dll库。将jpacp下载后lib下面的jpcap.dll复制到当前项目目录下,如果你仅得制了jpcap.dll,操作系统没有安装wincap(http://www.winpcap.org/install/default.htm ),则会看到如下错误提示:
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\workspace\trafficManager\jpcap.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)    at java.lang.Runtime.loadLibrary0(Runtime.java:823)    at java.lang.System.loadLibrary(System.java:1030)    at jpcap.JpcapCaptor.<clinit>(JpcapCaptor.java:250)    at cn.netjava.cewolf.DispalyNetInterface.main(DispalyNetInterface.java:17)

配置完好后,再次运行,输出结果正常:
第0个接口:|name: \Device\NPF_GenericDialupAdapter|loopback: false
address: 第1个接口:|name: \Device\NPF_{2A5FD532-45A3-4A2B-9B68-F34C14E4FD2C}|loopback: falseaddress: |addresses[0]: /220.192.159.105第2个接口:|name: \Device\NPF_{14303C1A-4DB3-4BC9-979E-34063E070CBB}|loopback: falseaddress: |addresses[0]: /192.168.1.44
  在我的机器上,开着一块局网网卡和一块无线网卡,都显示出来了;上面的”第0个接口”就是指本机的127.0.0.1的回环地址。但不知为什么,loopback也会是false?

  要注意两点:一个是jpcap.dll要在路径中;另外,在统计流量时,本机回环地址不需要统计,一般是第0个接口。接下来我们看抓取网卡上的数据包是多么简单:

抓包前,首先要编写实现了PacketReceiver接口的类,即数据包处理器,由与抓包时,对应某个网络接口的JpcapCaptor对象会阻塞,所以我们将每个网卡上得到的对应的JpcapCaptor对象放到一个独立线程中运行;TestPacketReceiver是个数据包解析器,本例中我们只是简单打印出收到的数据包类型及关键参数,阅读如下代码建议参照jPcap的在线文档(http://netresearch.ics.uci.edu/kfujii/jpcap/doc/javadoc/index.html )
TestPacketReceiver.java代码如下:

import jpcap.JpcapCaptor;  
import jpcap.NetworkInterface;  
import jpcap.PacketReceiver;  
import jpcap.packet.*;  
/** 
 * 使用jpcap显示网络上的各种数据包 
 * @author www.NetJava.cn  
 */  
public class DispalyNetPacket {  
      
    //程序启动主方法  
   public static void main(String args[]){  
       try{  
            //获取本机上的网络接口对象数组  
     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 JpcapCaptor jpcap ){  
       JpcapCaptor jp=jpcap;  
       java.lang.Runnable rnner=new Runnable(){  
           public void run(){  
               //使用接包处理器循环抓包  
               jpcap.loopPacket(-1, new TestPacketReceiver());  
           }  
       };  
       new Thread(rnner).start();//启动抓包线程  
   }      
}  
  
/** 
 * 抓包监听器,实现PacketReceiver中的方法:打印出数据包说明 
 * @author www.NetJava.cn  
 */  
class TestPacketReceiver  implements PacketReceiver {  
      /** 
       * 实现的接包方法: 
       */  
      public void receivePacket(Packet packet) {  
          //Tcp包,在java Socket中只能得到负载数据  
        if(packet instanceof jpcap.packet.TCPPacket){  
            TCPPacket p=(TCPPacket)packet;  
            String s="TCPPacket:| dst_ip "+p.dst_ip+":"+p.dst_port  
                     +"|src_ip "+p.src_ip+":"+p.src_port  
                     +" |len: "+p.len;  
        System.out.println(s);  
        }  
        //UDP包,开着QQ,你就会看到:它是tcp+udp  
        else if(packet instanceof jpcap.packet.UDPPacket){  
            UDPPacket p=(UDPPacket)packet;  
            String s="UDPPacket:| dst_ip "+p.dst_ip+":"+p.dst_port  
             +"|src_ip "+p.src_ip+":"+p.src_port  
            +" |len: "+p.len;  
           System.out.println(s);  
        }  
        //如果你要在程序中构造一个ping报文,就要构建ICMPPacket包  
       else if(packet instanceof jpcap.packet.ICMPPacket){  
           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:| router_ip "+router_ip  
             +" |redir_ip: "+p.redir_ip  
             +" |mtu: "+p.mtu  
             +" |length: "+p.len;  
          System.out.println(s);  
        }  
        //是否地址转换协议请求包  
       else if(packet instanceof jpcap.packet.ARPPacket){  
           ARPPacket p=(ARPPacket)packet;  
           //Returns the hardware address (MAC address) of the sender  
           Object  saa=   p.getSenderHardwareAddress();  
           Object  taa=p.getTargetHardwareAddress();  
           String s="* * * ARPPacket:| SenderHardwareAddress "+saa  
             +"|TargetHardwareAddress "+taa  
             +" |len: "+p.len;  
         System.out.println(s);  
              
        }  
    //取得链路层数据头 :如果你想局网抓包或伪造数据包,嘿嘿  
     DatalinkPacket datalink  =packet.datalink;  
     //如果是以太网包  
     if(datalink instanceof jpcap.packet.EthernetPacket){  
         EthernetPacket ep=(EthernetPacket)datalink;  
          String s="  datalink layer packet: "  
              +"|DestinationAddress: "+ep.getDestinationAddress()  
              +"|SourceAddress: "+ep.getSourceAddress();  
          System.out.println(s);  
    }      
  }  
  
}   




运行这段程序,你机器从网络收所有收发到的数据,就都可以展现在你眼前了!,在我的机器上,摘抄一段输出如下:
datalink layer packet: |DestinationAddress: 01:00:5e:00:00:01|SourceAddress: 00:19:e0:f0:ee:55
  datalink layer packet: |DestinationAddress: 01:00:5e:26:4c:da|SourceAddress: 00:e0:81:03:7c:01TCPPacket:| dst_ip /128.195.10.200:80|src_ip /192.168.1.44:1083 |len: 62  datalink layer packet: |DestinationAddress: 00:19:e0:f0:ee:55|SourceAddress: 00:02:8a:96:d1:ab* * * ARPPacket:| SenderHardwareAddress 00:19:e0:f0:ee:55|TargetHardwareAddress 00:00:00:00:00:00 |len: 60  datalink layer packet: |DestinationAddress: ff:ff:ff:ff:ff:ff|SourceAddress: 00:19:e0:f0:ee:55* * * ARPPacket:| SenderHardwareAddress 00:02:8a:96:d1:ab|TargetHardwareAddress 00:19:e0:f0:ee:55 |len: 42  datalink layer packet: |DestinationAddress: 00:19:e0:f0:ee:55|SourceAddress: 00:02:8a:96:d1:abTCPPacket:| dst_ip /192.168.1.44:1083|src_ip /128.195.10.200:80 |len: 62  datalink layer packet: |DestinationAddress: 00:02:8a:96:d1:ab|SourceAddress: 00:19:e0:f0:ee:55

注意:你可能认为要抓取的数据包应分为发送出去的和接收到的;但对jPcap而言,数据包是从网卡上抓取到的一个packet对象,packet没有收发的概念;如果你要确定这个packet的方向,则可根据其中的属性数据值,如源地址、目标地址确认。如果想深入的研究网络协议就请继续钻研吧,我们的任务可仅仅只是统计网络流量,demo了这么多,赶快实现我们的数据统计模块。

original address:http://javafound.iteye.com/blog/165704
分享到:
评论
1 楼 di1984HIT 2016-05-10  
学习了,学习了~

相关推荐

    JAVA抓包工具jpcap,包含32位和64位

    总结来说,jpcap是一个强大的Java网络抓包工具,结合winPcap,可以在不同平台上实现高效的数据包捕获和分析。通过理解jpcap的核心概念和API,开发者可以构建自己的网络监控解决方案,满足各种复杂场景的需求。

    Java抓包工具 jpcap WinPcap

    在提供的压缩包中,"Jpcap 网络抓包工具 - - ITeye技术网站.htm"和"Jpcap 网络抓包工具 - - ITeye技术网站_files"可能是关于jpcap的使用教程或示例代码。通过阅读这些资料,开发者可以快速了解如何使用jpcap进行...

    JPCAP网络抓包

    **JPCAP网络抓包详解** 网络抓包是IT领域中一种重要的技术,它用于捕获网络中的数据包,帮助分析网络流量、检测网络安全问题、调试应用程序或进行网络性能优化。JPCAP(Java Packet Capture)是一个开源库,专门为...

    基于java的开发源码-网络抓包工具 jpcap.zip

    基于java的开发源码-网络抓包工具 jpcap.zip 基于java的开发源码-网络抓包工具 jpcap.zip 基于java的开发源码-网络抓包工具 jpcap.zip 基于java的开发源码-网络抓包工具 jpcap.zip 基于java的开发源码-网络抓包工具 ...

    Jpcap 网络抓包实验

    **Jpcap网络抓包实验** 在信息技术领域,网络抓包是网络分析和故障排查的重要手段,它允许我们查看网络中的数据传输情况。Jpcap(Java Packet Capture)是一个用于Java平台的网络抓包库,它提供了抓取、过滤、分析...

    网络抓包工具Jpcap_Java.zip

    Jpcap 是捕获和发送网络包的 Java 库。Jpcap 是基于 libcap 和 winpcap 的,所以 Jpcap 可以运行在任意支持 libcap 或者 winpcap 的平台上(Linux ,Windows,FreeBSD 和 Mac OS X)。Jpcap 支持以下的集中数据包...

    Java jpcap抓包

    总结起来,Java jpcap抓包技术是Java开发者处理网络诊断和分析的强大工具。它结合了Java的跨平台优势和jpcap的网络数据包捕获能力,使得在网络监控、安全审计、性能测试等领域都有广泛的应用。通过学习和实践使用...

    java抓包工具jpcap

    Java抓包工具jpcap是Java编程环境中用于网络封包捕获的一个库,它为开发者提供了在TCP/IP网络上进行数据包捕获和分析的能力。这个工具在Windows 8.1 x64操作系统下经过验证可以正常工作,但对其他操作系统(如...

    jpcap java抓包必需jar包

    jpcap作为Java中的网络抓包库,为开发者提供了一个强大且易用的工具,无论是在教学、研究还是实际项目中,都能发挥重要作用。通过jpcap,开发者无需关心底层平台的差异,只需专注于数据包的捕获和处理,极大地简化了...

    JAVA源码网络抓包工具jpcapJAVA源码网络抓包工具jpcap

    JAVA源码网络抓包工具jpcapJAVA源码网络抓包工具jpcap

    网络抓包工具 jpcap.7z

    《网络抓包工具——jpcap深度解析》 在信息技术领域,网络抓包工具是用于检测、分析和诊断网络通信的重要工具。它们能够捕获网络上的数据包,为网络管理员和开发人员提供宝贵的信息,帮助他们理解网络行为,查找并...

    java资源网络抓包工具jpcapjava资源网络抓包工具jpcap

    java资源网络抓包工具 jpcapjava资源网络抓包工具 jpcap提取方式是百度网盘分享地址

    java源码:网络抓包工具 jpcap.zip

    Java源码:网络抓包工具jpcap.zip是一款基于Java平台的网络数据包捕获工具,主要用于网络分析、协议开发和网络安全检测等场景。jpcap库提供了在Java环境中访问和解析网络数据包的能力,使得开发者能够深入理解网络...

    网络抓包工具 jpcap文档资料

    《网络抓包工具jpcap深度解析》 网络抓包工具是网络分析和故障排查的重要利器,其中jpcap作为一款强大的开源库,为开发者提供了在网络层捕获、解析和处理数据包的能力。本文将深入探讨jpcap的原理、功能、使用方法...

    计算机网络课程设计(JPCAP发包与抓包)

    计算机网络课程设计(JPCAP发包与抓包)是一个深入理解网络通信协议并实践动手能力的项目。在这个项目中,我们将使用JPCAP这个Java库,它为开发人员提供了在网络层进行数据包捕获(抓包)和传输层构建及发送TCP数据包...

    基于Java的网络抓包工具 jpcap.zip

    Java网络抓包工具jpcap是一个强大的开源库,专门用于在网络层捕获和分析网络数据包。这个工具的出现使得开发者和网络安全分析师能够在Java平台上进行网络监控和数据分析,无需依赖于特定的操作系统或硬件设备。jpcap...

    jpcap:网络抓包工具

    网络抓包工具源码 源代码包括 5 个 java 类文件。 在 Netbeans 上编译项目所需但与项目无关的其他文件未上传。 因此,源代码只能用于分析目的。 如果需要运行项目,则在发布部分上传完整项目的编译jar文件以及所需...

    使用Jpcap实现的java网络抓包程序,支持ipv6

    总的来说,这个项目是一个使用Java和Jpcap库开发的网络抓包工具,具备IPv6支持,适合学习网络协议、Java编程和网络分析的初学者。通过阅读源代码和文档,用户不仅可以了解如何使用Jpcap进行网络封包捕获,还可以学习...

    基于Java的实例源码-网络抓包工具 jpcap.zip

    《深入解析Java网络抓包工具jpcap》 在信息技术高速发展的今天,网络抓包工具在软件开发、网络分析和安全研究中扮演着至关重要的角色。jpcap,作为一个基于Java的网络抓包库,为开发者提供了强大的网络数据包捕获和...

    基于java的网络抓包工具 jpcap.zip

    Java网络抓包工具jpcap是一个用于在网络层捕获和分析网络数据包的库,它为开发者提供了在Java环境中进行网络分析和数据包捕获的能力。这个zip文件包含的资源可能是jpcap的源代码,这使得用户可以深入了解其内部工作...

Global site tag (gtag.js) - Google Analytics