java编程:听说有个叫网络嗅探器的东西,请问原理是 怎么做出来的啊?

Python017

java编程:听说有个叫网络嗅探器的东西,请问原理是 怎么做出来的啊?,第1张

Sniffer啊,自己去查,不想大片转贴了。

主要原理是利用网卡的混杂模式,和以太网自身的特点进行的。

java写的话用 JPACAP

Jpcap是一个能够抓取与发送网络数据包的Java组件。可以使用Jpcap从一个网络接口获取数据包,然后在Java中对它们进行分析和显示。同样也可以通过一个网络接口发送任意数据包。Jpcap当前能够 捕获以太网,IPv4,IPv6,ARP/RARP,TCP,UDP和ICMPv4数据包。

Jpcap实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,Jpcap调用wincap/libcap,而给Java语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,Jpcap支持FreeBSD3.x,Linux RedHat6.1, Fedora Core4,Solaris,and Microsoft Windows 2000/XP等系统。

Jpcap的整个结构大体上跟wincap/libpcap是很相像的,例如NetworkInterface类对应wincap的 typedef struct_ADAPTER ADAPTER,getDeviceList()对应pcap_findalldevs()等等。

Jpcap主要的类有如下几个:

1.NetworkInterface

该类的每一个实例代表一个网络设备,一般就是网卡。这个类只有一些数据成员,除了继承自java.lang.Object的基本方法以外,没有定义其它方法。

2.JpcapCaptor

该类提供了一系列静态方法实现一些基本的功能。该类一个实例代表建立了一个与指定设备的链接,可以通过该类的实例来控制设备,例如设定网卡模式、设定过滤关键字等等。

3.JpcapSender

该类专门用于控制数据包的发送。

4.Packet

这个是所有其它数据包类的父类。Jpcap所支持的数据包有:

ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket。

java获取固定IP发来所有的数据包,需要实现网络嗅探的部分功能:

代码如下

/*******************

* JpcapTip.java

*/

package m

import jpcap.PacketReceiver

import jpcap.JpcapCaptor

import jpcap.packet.*

import jpcap.NetworkInterface

import jpcap.NetworkInterfaceAddress

//import java.net.InetAddress

//import java.net.UnknownHostException

public class JpcapTip implements PacketReceiver {

public void receivePacket(Packet packet) {

   System.out.println("********************************************")

   /*IP数据报报文头*/

   byte[] l=packet.header     

   /*

   for (int t=0t<21t++){

    System.out.print(l[t]+" *** ")

   }

   */

   String str=""

    System.out.print("报文头 : ")

    for (int i=0i<l.lengthi++) {

     //str=str+l

     int m=0

     m=l[i]

     m=m<<24

     m=m>>>24

     str=str+Integer.toHexString(m)

     //System.out.print("     ***     "+l[i])

    }

   System.out.println(str)

   int d=l.length

   System.out.println("首部长度 :"+(d*8)+"bit")

  

   /*分析源IP地址目的IP地址*/

   /*分析协议类型*/

   /**

   if(packet.getClass().equals(IPPacket.class)) {

    IPPacket ipPacket=(IPPacket)packet

    byte[] iph=ipPacket.option

    String iphstr=new String(iph)

    System.out.println(iphstr)

   }

   */

   if(packet.getClass().equals(ARPPacket.class))

   {

    System.out.println("协议类型 :ARP协议")

    try {

     ARPPacket arpPacket = (ARPPacket)packet

     System.out.println("源网卡MAC地址为 :"+arpPacket.getSenderHardwareAddress())

     System.out.println("源IP地址为 :"+arpPacket.getSenderProtocolAddress())

     System.out.println("目的网卡MAC地址为 :"+arpPacket.getTargetHardwareAddress())

     System.out.println("目的IP地址为 :"+arpPacket.getTargetProtocolAddress())

} catch( Exception e ) {

     e.printStackTrace()

    } 

   }

   else 

    if(packet.getClass().equals(UDPPacket.class))

    {

     System.out.println("协议类型 :UDP协议")

     try {

      UDPPacket udpPacket = (UDPPacket)packet

      System.out.println("源IP地址为 :"+udpPacket.src_ip)

      int tport = udpPacket.src_port

      System.out.println("源端口为:"+tport)

      System.out.println("目的IP地址为 :"+udpPacket.dst_ip)

      int lport = udpPacket.dst_port

      System.out.println("目的端口为:"+lport)

     } catch( Exception e ) {

      e.printStackTrace()

     } 

    }

   else

    if(packet.getClass().equals(TCPPacket.class)) {

     System.out.println("协议类型 :TCP协议")

     try {

      TCPPacket tcpPacket = (TCPPacket)packet

      int tport = tcpPacket.src_port

      System.out.println("源IP地址为 :"+tcpPacket.src_ip)

      System.out.println("源端口为:"+tport)

      System.out.println("目的IP地址为 :"+tcpPacket.dst_ip)

      int lport = tcpPacket.dst_port

      System.out.println("目的端口为:"+lport)

     } catch( Exception e ) {

      e.printStackTrace()

     }

    }

   else

    if(packet.getClass().equals(ICMPPacket.class))

     System.out.println("协议类型 :ICMP协议")

   else

     System.out.println("协议类型 :GGP、EGP、JGP协议或OSPF协议或ISO的第4类运输协议TP4")

/*IP数据报文数据*/

   byte[] k=packet.data   

   String str1=""

    System.out.print("数据 : ")

     for(int i=0i<k.lengthi++) {

      //int m=0

      //m=k[i]

      //m=m<<24

      //m=m>>>24

      //str1=str+Integer.toHexString(m)

      str1 = new String(k)

      //str1=str1+k[i]

      //System.out.print("     ***     "+k[i])

     }

     System.out.println(str1)

   System.out.println("数据报类型 : "+packet.getClass())

   System.out.println("********************************************")

}

public static void main(String[] args) throws Exception{

   // TODO 自动生成方法存根

  

   NetworkInterface[] devices = JpcapCaptor.getDeviceList()        //.getDeviceList().

   //for (int i =0 i<devices.lengthi++) {

    int a=0

    //try {

    /*本地网络信息*/

    byte[] b=devices[1].mac_address //网卡物理地址

    //}

    //catch() {}

    System.out.print("网卡MAC : 00")   

    for (int j=0j<b.lengthj++){

     //a=a<<8

     a=b[j]

     a=a<<24

     a=a>>>24

     System.out.print(Integer.toHexString(a))

    }

    System.out.println()

    NetworkInterfaceAddress[] k=devices[1].addresses

   

    //System.out.println("网卡MAC : "+Integer.toHexString(a))

    for(int n=0n<k.lengthn++) {

     System.out.println("本机IP地址 : "+k[n].address)     //本机IP地址

     System.out.println("子网掩码   : "+k[n].subnet)      //子网掩码

    }

    System.out.println("网络连接类型 : "+devices[1].datalink_description)

   //}

   NetworkInterface deviceName = devices[1]

   /*将网卡设为混杂模式下用网络设备deviceName*/

   JpcapCaptor jpcap =JpcapCaptor.openDevice(deviceName, 2000, false, 1)           //openDevice(deviceName,1028,false,1)

   jpcap.loopPacket(-1,new JpcapTip())

}

}