Capturar paquetes ipv4/ipv6 en java

Hoy os vamos a explicar cómo utilizar el lenguaje Java para capturar paquetes de red con el fin de analizar los elementos de dichos paquetes. El software que utilizaremos hoy, está basado en entorno Windows. Así que deberás prepararte un poco antes de iniciarte con la práctica. Asegúrate de que cuentas con todas las herramientas que se enumeran a continuación.

  • winpcap4.0 y jpcap6.0
  • Eclipse y la aplicación jigloo
  • Entorno Java

Utilizar C++ o C para capturar paquetes sería demasiado complejo, sobretodo para los que acaban de iniciarse en esto de la programación. Otra punto por el que he seleccionado Java es que las interfaces UI son más sencillas de realizar con Java Swing. Este software podría alcanzar los funciones básicas de Wireshark. Así que, podría ser muy interesante y útil.

Captura con jpcap

No importa que estés utilizando un sistema operativo Linux o Windows, si deseas capturar paquetes desde tu ordenador, debes controlar o manipular los dispositivos de red (tarjeta de red). Debido a que todos los paquetes son procesados ​​por la tarjeta de red.

En el sistema Linux, hay un archivo en el núcleo de Linux llamada "net.h". Utilizando algunos métodos en este archivo podría capturar paquetes.

Pero esto sólo se podría hacer, si estamos muy familiarizados con los códigos de núcleo Linux. Para hacerlo más sencillito, podríamos iinstalar "libcap", y utilizar los métodos definidos dentro de él. El "jpcap" funciona en Windows como "libcap" funciona en Linux.

Funciones de Jpcap

Obtener lista de tarjetas de red

Para capturar paquetes de datos que fluyen a través de los dispositivos de red, lo primero es conseguir una lista de sus tarjetas de red. Eso significa que necesitas obtener todos los dispositivos de red que podrían utilizarse para capturar paquetes. Jpcap ofrece una función llamada JpcapCaptor.getDevices() para realiza todo el trabajo sucio. Esta función devuelve un array de objetos NetworkInterface.

API NetworkInterface contiene toda la información, como el nombre, la descripción, la dirección IP, la dirección MAC y el nombre de la capa de enlace de datos y su descripción.

NetworkInterface[] devices =Jpacap.getDevicesList();
for(int i=0;i<devices.length;i++){
    System.out.println(devices[i].description);
    System.out.pritnln(devices[i].datalink_name+"->>"+devices[i].datalink_description);
}

Interfaces de red abiertas

Una vez tengas la lista de dispositivos que podrían utilizarse para capturar paquetes de datos, utiliza el método JpcapCaptor.openDevice() para abrir interfaces.

Algunos parámetros opcionales que pueden utilizarse en este método.

Objeto/parámetros..........Función/Descripción

NetworkInterface..........Abrir interfaz de red

Int snaplen..........Los bytes máximos de paquetes capturados

Booleans prommics..........Modo promiscuo

Utilizando el modo promiscuo, la interfaces de red pueden capturar paquetes de varios tipos y fuentes. Mientras si utilizas el modo no promiscuo, las interfaces de red sólo capturarán paquetes con origen especificado.

NetworkInterface[] devices =Jpacap.getDevicesList();
JpcapCaptor captor=JpcapCaptor.openDevice(devices[index],65535,false,1000);

Obtener los paquetes de las interfaces de red

Hay dos métodos para obtener los paquetes capturados. Una de ellos es "Callback" y el otro es "uno por uno".

Callback

Crea una clase para implementar la API PackageReceiver. Y el método receivePacket(), que pertenece a PackageReceiver, podrá obtener los paquetes capturados. El uso de métodos como JpcapCaptor.processPacket() y JpcapCaptor.loopPacket() podrán procesar los paquetes capturados.

NetworkInterface[] devices=JpcapCaptor.getDeviceList();
JpcapCaptor captor=JpcapCaptor.openDevice(devices[index],65535,false,1000);
        
            captor.loopPacket(-1, new Receiver());

class eceiver implements PacketReceiver
{
    public void receivePacket(Packet p)
    {
        if(p instanceof TCPPacket)
        {
            packetcapture.UI.new_UI.ta.append(p.toString()+'n');
        }
        
    }
}

Uno por uno

Se trata de utilizar el método GetPacket() para devolver un paquete de interfaz de red especificada. Pon este método en un bucle puede obtener los paquetes uno por uno.

JpcapCaptor captor=JpcapCaptor.openDevice(devices[index],65535,false,1000);

for(int i=0;i<10;i++){

   System.out.println(captor.getPacket());
}
captor.close();

Establecer filtros

Jpcap nos proporciona un método para filtrar paquetes. Este método llamado setFilter() pertenece al objeto JpcapCaptor. He aquí una muestra de un filtro de paquetes IP y TCP.

JpcapCaptor captor=JpcapCaptor.openDevice(devices[index],65535,false,1000);

captor.setFilter("ip and tcp",true);

Guardar o leer la información de los paquetes capturados en ficheros

Jpcap permite al usuario guardar los paquetes capturados en archivos que se podrían utilizarse como archivos "tcpdump" o "jpcap". La clase JpcapWriter hará todo el trabajo. Y JpcapCaptor.openFile () te permitirá abrir archivos.

JpcapCaptor captor=JpcapCaptor.openDevice(devices[index],65535,false,1000);

JpcapWriter writer=JpcapWriter.openDumpFile(captor,"yourfilename");

Enviar paquetes

Los métodos que se utilizan para enviar paquetes mediante el uso de Jpcap se definen en la instancia JpcapSender.

NetworkInterface[] devices=JpcapCaptor.getDeviceList();
JpcapSender sender=JpcapSender.openDevice(devices[index]);

TCPPacket p=new TCPPacket(12,34,56,78,false,false,false,false,true,true,true,true,10,10);
p.setIPV4Parameter(0,false,false,false,0,false,false,false,0,1010101,100,IPPacket.IPPacket.IPPROTO_TCP,
   InetAddress.getByName("www.microsoft.com"),InetAddress.getByName("www.google.com"));
p.data=("data").getBytes();

EthernetPcaket ether =new EthernetPcaket();
ether.frametype=EthernetPcaket.ETHERTYPE_IP;
ether.src_mac=new byte[]{(byte)0,(byte)1,(byte)2,(byte)3,(byte)4,(byte)5};
ether.dst_mac=new byte[]{(byte)0,(byte)6,(byte)7,(byte)8,(byte)9,(byte)10};

p.datalink=ether;

sender.sendPacket(p);
sender.close();

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP