`
anson2003
  • 浏览: 95295 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA抓取网卡IP数据包

阅读更多

我们经常使用Httpwatch查看HTTP的传输数据。那java能不能做到呢?  下面我们就讲一下如何通过java在windows上获取网卡的数据包,这里我们使用了开源的WinPcap,还有jNetPcap,jNetPcap是对接了WinPcap来截获网卡数据包。

如何截获网卡分3步:

1. 在自己的机器上安装WinPcap。   http://www.winpcap.org/install/default.htm

2. 下载jNetPcap,     http://jnetpcap.com/download.  下载下来之后解压,里面2个重要文件jnetpcap.jar,jnetpcap.dll

3  在eclipse里新建工程,把jnetpcap.jar加入library.  然后参考如下代码实现网卡截包:

 

import java.util.ArrayList;
import java.util.List;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import org.jnetpcap.packet.JPacket;
import org.jnetpcap.packet.JPacketHandler;
import org.jnetpcap.protocol.tcpip.Http;
import org.jnetpcap.protocol.tcpip.Tcp;

/**
 * Capture the netword card packages
 * 
 */
public class App {
	public static void main(String[] args) throws InterruptedException {
		List<PcapIf> alldevs = new ArrayList<PcapIf>(); // Will be filled with
														// NICs
		StringBuilder errbuf = new StringBuilder();
		int r = Pcap.findAllDevs(alldevs, errbuf);
		if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
			System.err.printf("Can't read list of devices, error is %s",
					errbuf.toString());
			return;
		}
		for (PcapIf pif : alldevs) {
			System.out.println(pif.getName());
		}

		PcapIf pif = alldevs.get(0);//select the device which you want to monitor 

		/***************************************
		 * open the device
		 ***************************************/
		int snaplen = 64 * 1024; // Capture all packets, no trucation
		int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
		int timeout = 10 * 1000; // 10 seconds in millis
		Pcap pcap = Pcap.openLive(pif.getName(), snaplen, flags, timeout,
				errbuf);

		if (pcap == null) {
			System.err.printf("Error while opening device for capture: "
					+ errbuf.toString());
			return;
		}
		
		/* 
         * We have an opened the capture file now time to read packets. We use a 
         * Pcap.loop function to retrieve 10 packets from the file. We supply an 
         * annonymous handler which will receive packets as they are read from the 
         * offline file by libpcap. We parameterize it with a StringBuilder class. 
         * This allows us to pass in any type of object we need inside the our 
         * dispatch handler. For this example we are passing in the errorbuf object 
         * so we can pass back a string, if we need to. Of course in our example 
         * this is not strictly needed since our anonymous class can access errbuf 
         * object directly from the enclosing main method as that local variable is 
         * marked final allowing anonymous classes access to it. 
         */  
        pcap.loop(Pcap.LOOP_INFINITE, new JPacketHandler<StringBuilder>() {  
  
            /** 
             * We purposely define and allocate our working tcp header (accessor) 
             * outside the dispatch function and thus the libpcap loop, as this type 
             * of object is reusable and it would be a very big waist of time and 
             * resources to allocate it per every dispatch of a packet. We mark it 
             * final since we do not plan on allocating any other instances of Tcp. 
             */  
            final Tcp tcp = new Tcp();  
          
  
            /* 
             * Same thing for our http header 
             */  
            final Http http = new Http();  
            
           
  
            /** 
             * Our custom handler that will receive all the packets libpcap will 
             * dispatch to us. This handler is inside a libpcap loop and will receive 
             * exactly 10 packets as we specified on the Pcap.loop(10, ...) line 
             * above. 
             *  
             * @param packet 
             *          a packet from our capture file 
             * @param errbuf 
             *          our custom user parameter which we chose to be a StringBuilder 
             *          object, but could have chosen anything else we wanted passed 
             *          into our handler by libpcap 
             */  
            public void nextPacket(JPacket packet, StringBuilder errbuf) {  
  
                /* 
                 * Here we receive 1 packet at a time from the capture file. We are 
                 * going to check if we have a tcp packet and do something with tcp 
                 * header. We are actually going to do this twice to show 2 different 
                 * ways how we can check if a particular header exists in the packet and 
                 * then get that header (peer header definition instance with memory in 
                 * the packet) in 2 separate steps. 
                 */  
                if (packet.hasHeader(Tcp.ID)) {  
  
                    /* 
                     * Now get our tcp header definition (accessor) peered with actual 
                     * memory that holds the tcp header within the packet. 
                     */  
                    packet.getHeader(tcp); 
                    
                    System.out.printf("tcp.dst_port=%d%n", tcp.destination());  
                    System.out.printf("tcp.src_port=%d%n", tcp.source());  
                    System.out.printf("tcp.ack=%x%n", tcp.ack());  
  
                }  
  
                /* 
                 * An easier way of checking if header exists and peering with memory 
                 * can be done using a conveniece method JPacket.hasHeader(? extends 
                 * JHeader). This method performs both operations at once returning a 
                 * boolean true or false. True means that header exists in the packet 
                 * and our tcp header difinition object is peered or false if the header 
                 * doesn't exist and no peering was performed. 
                 */  
                if (packet.hasHeader(tcp)) {  
                    //System.out.printf("tcp header::%s%n", tcp.toString());  
                }  
  
                /* 
                 * A typical and common approach to getting headers from a packet is to 
                 * chain them as a condition for the if statement. If we need to work 
                 * with both tcp and http headers, for example, we place both of them on 
                 * the command line. 
                 */  
                if (packet.hasHeader(tcp) && packet.hasHeader(http)) {  
                    /* 
                     * Now we are guarranteed to have both tcp and http header peered. If 
                     * the packet only contained tcp segment even though tcp may have http 
                     * port number, it still won't show up here since headers appear right 
                     * at the beginning of http session. 
                     */  
  
                	
                    System.out.printf("http header::%s%n", http);  
  
                    /* 
                     * jNetPcap keeps track of frame numbers for us. The number is simply 
                     * incremented with every packet scanned. 
                     */  
  
                }  
  
                //System.out.printf("frame #%d%n", packet.getFrameNumber());  
            }  
  
        }, errbuf);  

		/*
		 * Last thing to do is close the pcap handle
		 */
		pcap.close();
	}
}

 注意:

在运行以上代码之前还需要加上jvm参数,为了让jnetpcap找到jnetpcap.dll,我们在vm parameters加入以下参数:

-Djava.library.path=E:\jnetpcap

这里的E:\jnetpcap 就是jnetpcap.dll放置的目录。

 

 

 

 

 

 

  • 大小: 28.7 KB
分享到:
评论
3 楼 汤露生 2014-11-17  
你或者这样,右键项目-》Properties-》java bulid path-》右边的libraries-》点开jnetpcap.jar-》里面有个Native library location(本身问none)-》点击它,然后右边edit-》选择dll文件所在的路径
2 楼 a850302505 2014-03-26  
我已经安装winpcap,添加了jnetpcap.jar,也按您的方法加上了jvm参数。我用得是myeclipse。
1 楼 a850302505 2014-03-26  
 
亲,我的还是会报错,能帮忙看看什么问题么?

报错是:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.slytechs.library.NativeLibrary.dlopen(Ljava/lang/String;)J
at com.slytechs.library.NativeLibrary.dlopen(Native Method)
at com.slytechs.library.NativeLibrary.<init>(Unknown Source)
at com.slytechs.library.JNILibrary.<init>(Unknown Source)
at com.slytechs.library.JNILibrary.loadLibrary(Unknown Source)
at com.slytechs.library.JNILibrary.register(Unknown Source)
at com.slytechs.library.JNILibrary.register(Unknown Source)
at com.slytechs.library.JNILibrary.register(Unknown Source)
at org.jnetpcap.Pcap.<clinit>(Unknown Source)
at JnetpcapTest.ClassicPcapExample.main(ClassicPcapExample.java:23)

相关推荐

    IP数据包捕获程序

    1. **数据包捕获基础**:数据包捕获是指在网络层抓取传输的数据单元,通常用于故障排查、安全审计和性能分析。常见的数据包捕获工具有Wireshark和 tcpdump。 2. **IP协议**:IP(Internet Protocol)是互联网协议的...

    java抓取数据包及网络基础

    Java抓取数据包和网络基础是IT领域中的一个重要分支,主要涉及如何利用Java语言来捕获网络通信中的数据包,并理解网络通信的基本原理。在这个主题中,我们可以学习到以下关键知识点: 1. **网络基础**:首先,我们...

    burpsuit 抓取非http数据包工具

    burpsuit 抓取非http数据包工具,。

    抓取链路层数据包

    链路层数据包抓取是网络分析中的一个重要环节,它主要涉及的是OSI模型的第二层,即数据链路层。在这个层次,我们能够获取到更底层的网络通信信息,如MAC地址、帧类型和错误检测等。在本文中,我们将深入探讨如何进行...

    基于MFC的IP数据包捕获程序

    【描述】提到的“捕获本地网卡的IP分组”,是指程序能够监听并记录通过选定本地网络接口传输的所有IP数据包。这通常涉及到了网络嗅探技术,也称网络抓包。在网络嗅探中,程序会模拟一个网络设备,接收所有通过该设备...

    (C#)IP数据包捕获

    在描述中提到的“在本地可选网卡上捕获IP数据包”,意味着该程序允许用户选择要监听的网络接口,这可能是多网络连接设备上的不同网卡,如物理以太网接口、无线网络接口或其他类型的网络适配器。程序通过监听这些接口...

    ip数据包抓取,分析ip数据报格式

    在C语言中抓取和分析IP数据包涉及以下步骤: 1. 打开网络接口:使用socket API创建一个RAW socket,允许直接访问底层网络协议,例如`socket(AF_INET, SOCK_RAW, IPPROTO_IP)`。 2. 绑定接口:使用`bind()`函数将...

    基于Java+Jnetpcap的网络嗅探器(抓包程序)设计与实现

    实现了抓取的数据包从链路层到应用层的逐层包头的信息展示及分析 实现了Ethernet、IP、ARP、ICMP、UDP、TCP、HTTP七种数据包的过滤及分析 实现了源ip、目的ip、及包携带内容的关键字过滤功能 实现了基于IP+Port的...

    读书笔记:java抓包工具(Socket编程抓取IP数据包, 网络层).zip

    读书笔记:java抓包工具(Socket编程抓取IP数据包, 网络层)

    java抓取数据包源代码Jpcap

    Java抓取数据包源代码Jpcap是一种在Java平台上实现的数据包捕获和分析的工具。Jpcap库为开发者提供了强大的功能,可以用来获取网络层的数据包信息,包括IP、TCP、UDP、ICMP等协议的数据包。它是Java版的libpcap库,...

    用C++实现网络编程---抓取网络数据包的实现方法

    ### 使用C++实现网络编程——抓取网络数据包的实现方法 #### 概述 本文主要探讨了如何利用C++语言进行网络编程,并具体讲解了抓取网络数据包的方法。通过对C++网络编程原理的学习与实践,我们可以实现对网络数据包...

    捕获IP数据包的小程序!

    标题提到的"捕获IP数据包的小程序"通常是指一个轻量级的应用程序,用于监测和记录网络通信中传输的IP(Internet Protocol)数据包。这些数据包包含了网络上的所有通信信息,包括源地址、目标地址、协议类型、数据...

    .archivetempWireshark抓取网卡协议分析(TCP,UDP,ARP,DNS,DHCP,HTTP超详细版本)_怎样可以抓取到tcp数据包-CSDN博客.mhtml

    .archivetempWireshark抓取网卡协议分析(TCP,UDP,ARP,DNS,DHCP,HTTP超详细版本)_怎样可以抓取到tcp数据包-CSDN博客.mhtml

    基于java的网络抓包

    本篇文章主要介绍了基于 Java 的网络抓包方法,通过 Java 代码来抓取网络包。下面是相关知识点的总结: 一、网络抓包技术原理 网络层上有各种各样的数据包,它们以不同的帧格式在网络层上进行传输,但是在传输时...

    抓取网络数据包的实现方法

    然后,使用`ioctlsocket()`函数配置网卡接收所有数据包,并可以选择是否处理IP头。最后,通过`recv()`函数获取原始数据包。 数据包的结构通常包括以下几个部分:数据包、IP头、TCP头(或UDP头)以及数据本身。当...

    java操作网络数据包 论文

    本文将深入探讨如何使用Java来操作网络数据包,特别是针对HTTP协议的数据包,实现数据包的截获与还原技术。 首先,了解网络体系结构是理解数据包操作的基础。网络参考模型通常遵循OSI七层模型或TCP/IP四层模型...

    期末课设-基于Java抓取UDP数据包(jpcap资源需自行安装)

    在这个"期末课设-基于Java抓取UDP数据包"项目中,学生可能还需要了解网络协议的基本原理,包括IP协议、UDP协议的结构,以及如何解析和理解这些协议的头部信息。此外,学习使用`jpcap`库的API文档和调试技巧也是项目...

    IP数据包捕获解析程序

    数据包捕获通常通过驱动级编程实现,比如使用WinPCAP或Npcap库,这些库能够访问网络接口卡(NIC)的底层驱动,实时抓取网络上的数据包。而数据包解析则是将捕获到的数据包分解成可理解的部分,包括源IP地址、目标IP...

    抓取的HTTPS数据包(新)

    请求的url:https://blog.qihooyun.cn/ 响应内容:https-test 方便自己以后查看,不必每次都重新抓取一个包了。 Server端设置了keep-alive为65秒。

    一个简单的IP数据包捕获程序

    标题 "一个简单的IP数据包捕获程序" 描述的是一个用于网络监控的工具,它可以定时抓取通过本地网络接口的IP数据包,并且支持将这些捕获的数据导出为纯文本(txt)文件或者从txt文件导入数据。这个程序的核心功能在于...

Global site tag (gtag.js) - Google Analytics