Future Lab

Creando un "port sniffer" en Rust.

Un lenguaje de programación seguro, concurrente y práctico.

¿Rust?

Rust es un lenguaje de programación de sistemas introducido y apoyado por la fundación Mozilla, últimamente ha estado ganando popularidad, siendo el quinto lenguaje con mayor crecimiento según el GitHub Octoverse.

Según la fundación Mozilla y la [página mágica que tiene todas las respuestas)(https://wikipedia.org):

El objetivo de Rust es ser un buen lenguaje para la creación de grandes programas del lado del cliente y del servidor que se ejecuten en Internet.

¿Port sniffer?

En pocas palabras un sniffer es una herramienta que puede interceptar datos o paquetes de datos que fluyen a través de una red.

El port sniffer que crearemos estará hecho en el lenguaje de programación Rust, no es un programa escalable y no servirá de mucho, aun así BAJO NINGUNA CIRCUNSTANCIA lo utilices en redes ajenas o con fines maliciosos, pues esto te puede traer problemas muy serios ☹️

El sniffer que crearemos será multihilo y podrá ser invocado desde la línea de comandos, además de poder recibir argumentos.

Preparando el entorno

No podemos cubrir todo el lenguaje de programación Rust en un solo post, por lo tanto asumiremos que conoces las bases del lenguaje.

Creando el proyecto con Cargo

Cargo es el gestor de paquetes de Rust y es ASOMBROSO. Manejará las dependencias por nosotros y nos proveerá de varias herramientas para asegurar que nuestro código sea lo mas rápido y seguro posible.

Necesitamos invocar a cargo y decirle que deseamos crear un nuevo binario, para ello utilizaremos la orden:

$ cargo new ip_sniffer --bin

Si lo hicimos correctamente Cargo creará la siguiente estructura de directorios:

.
├── Cargo.toml
└── src
    └── main.rs

Lo primero que podemos ver es un archivo llamado Cargo.toml, en este se guardarán los metadatos del programa que generemos, normalmente el nombre del creador, la fecha de creación, la versión y las dependencias necesarias para construir el proyecto.

En el mismo nivel encontraremos un directorio llamado src en el cual se encuentra un archivo main.rs el cual será el archivo principal ejecutado por cargo cuando ejecutemos la orden cargo run.

Además de todo cargo creará dentro del directorio un nuevo repositorio de Git, el cual puedes manejar mejor si utilizas nuestra herramienta favorita.

La idea es que podamos ejecutar nuestro programa de las siguientes maneras desde la línea de comandos:

ip_sniffer -h
ip_sniffer -j 100 192.168.x.x
ip_sniffer 192.168.x.x

Editando main.rs

Toma tu editor de texto favorito (con resaltado para Rust preferiblemente) y comenzemos a editar el archivo main.rs.

El archivo inicial es así:

fn main() {
    println!("Hello World");
}

Por ahora dejemos la función main sola y en la parte superior del archivo importaremos el namespace env de la biblioteca estándar de la siguiente forma:

use std::env;

Dicho namespace nos permitirá trabajar con los argumentos de nuestro programa y utilizarlos para nuestro beneficio, veamos este punto un poco más a fondo, dentro de main coloca la siguiente línea de código:

let args: Vec<String>;

Con esto estamos creando una variable args la cual es un vector de cadenas (String), pero sola no hace nada, de hecho no sirve de nada, necesita un valor, dicho valot será:

let args: Vec<String> = env::args().collect();

Con ello nuestro namespace env recogerá todos los argumentos que se ingresen en la línea de comandos.