Taller orientado al desarrollo de programas relacionados con la Seguridad en Bluetooth en Linux.
Se necesita tener instalados los siguientes paquetes Bluez (a ser posible, las últimas versiones):
- bluez-utils
- bluez-libs
- bluez-libs-devel
Programa 1 - Resolver el nombre de un dispostivo Bluetooth a partir de su dirección MAC.
#include <stdio.h>
#include <stdlib.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
int main (int argc, char **argv)
{
bdaddr_t bdaddr; //Estructura bdaddr_t para almacenar la direccion MAC
char MAC_dev[20]; //Direccion MAC del dispositivo
char nombre_dev[248]; //Nombre del dispositivo
int id_dev; //Identificador del adaptador Bluetooth local
int socket; //Socket HCI
if(argc < 2)
{
printf("Sintaxis: %s <direccion MAC>\n",argv[0]);
exit(1);
}
printf("+ BlueResolver por Gospel [elblogdegospel.blogspot.com]\n\n");
strncpy(MAC_dev,argv[1],20);
printf("Detectando nombre del dispositivo <%s>...\n",MAC_dev);
//Convertimos la dirección MAC al formato de estructura bdaddr_t
baswap(&bdaddr, strtoba(MAC_dev));
//Obtenemos el identificador del adaptador local Bluetooth
id_dev = hci_get_route(&bdaddr);
if (id_dev < 0)
{
printf("[!] Error. Dispositivo Bluetooth local no disponible.\n");
exit(1);
}
//Abrimos un socket local HCI
socket = hci_open_dev(id_dev);
if (socket < 0)
{
printf("[!] Error. Fallo al intentar abrir socket HCI.\n");
exit(1);
}
//Obtenemos el nombre de la dirección MAC remota
int timeout = 10000;
if (hci_read_remote_name(socket,&bdaddr,sizeof(nombre_dev), nombre_dev, timeout) == 0)
{
printf("Dispositivo encontrado:\n\tMAC: %s\n\tNombre: %s\n",MAC_dev,nombre_dev);
}
else
{
printf("[!] Error. No se ha podido resolver el nombre del dispositivo.\n");
printf("Dispositivo encontrado:\n\tMAC: %s\n\tNombre: [Desconocido]\n",MAC_dev);
}
close(socket);
return(0);
}
Programa 2 - Escanear y detectar dispositivos Bluetooth cercanos
#include <stdio.h>
#include <stdlib.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
int main ()
{
inquiry_info *ii = NULL; //Almacena la lista de dispositivos detectados durante el inquiry
int max_rsp, num_rsp; //Numero de respuestas/dispositivos detectados
int dev_id; //Identificador del adaptador Bluetooth local
int socket; //Socket HCI;
int len, i;
char MAC_dev[20]; //Direccion MAC del dispositivo detectado
char nombre_dev[248]; //Nombre del dispositivo detectado
printf("+ BlueScanner por Gospel [elblogdegospel.blogspot.com]\n");
printf("+ src: people.csail.mit.edu/albert/bluez-intro/c401.html\n\n");
//Obtenemos el identificador del adaptador local Bluetooth
dev_id = hci_get_route(NULL);
if (dev_id < 0)
{
printf("[!] Error. Dispositivo Bluetooth local no disponible.\n");
exit(1);
}
//Abrimos un socket local HCI
socket = hci_open_dev(dev_id);
if (socket < 0)
{
printf("[!] Error. Fallo al intentar abrir socket HCI.\n");
exit(1);
}
//Inicializamos algunas variables
len = 8; //El tiempo de inquiry por dispositivo es de 1.28x8=10.24 secs/dispositivo
max_rsp = 255; //Se pueden detectar a lo sumo 255 dispositivos
//Creamos la lista de dispositivos detectados con hci_inquiry
ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
printf("Detectando dispositivos...\n\n");
//hci_inquiry lleva a cabo un descubrimiento de dispositivos Bluetooth y devuelve una lista de
//dispositivos detectados en inquiry_info ii para ser almacenados.
//La bandera IREQ_CACHE_FLUSH permite que la caché sea limpiada antes de buscar nuevos dispositivos.
//En otro caso, podrian aparecer dispositivos anteriormente detectados pero ahora fuera de rango.
num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, IREQ_CACHE_FLUSH);
if(num_rsp < 0)
printf("[!] Error. Fallo al intentar hci_inquiry.\n");
//Para cada una de las respuestas obtenidas durante el inquiry obtenemos el nombre del dispositivo
for(i=0;i<num_rsp;i++)
{
ba2str(&(ii+i)->bdaddr, MAC_dev);
memset(nombre_dev, 0, sizeof(nombre_dev));
if(hci_read_remote_name(socket, &(ii+i)->bdaddr, sizeof(nombre_dev), nombre_dev, 0) < 0)
strcpy(nombre_dev, "[Desconocido]");
printf("Dispositivo (%d) encontrado:\n\tMAC: %s\n\tNombre: %s\n\n", i+1, MAC_dev, nombre_dev);
}
free(ii);
close(socket);
return(0);
}