Hablando en el grupo de la gente de FollowTheWhiteRabbit me decidí a probar a convertir mi Arduino UNO en un Rubber Ducky. ¿Por qué el UNO y no uno de los NANO que tengo por ahí tirados? Pues porque la librería necesaria, HID-Project, solo soporta los siguientes modelos de Arduino:
- Uno (con HoodLoader2)
- Mega (con HoodLoader2)
- Leonardo
- (Pro)Micro
- Cualquier placa compatible 8u2/16u2/at90usb8/162/32u2/32u4
- No hay soporte para SAM/ARM (Due, Zero etc)
De todas esas placas solo tengo una UNO y una Mega (actualmente desaparecida en combate) así que no me quedo más opción que jugarme la con la UNO. ¿Y porqué jugarme la? Pues porque para poder utilizar esta librería necesito instalar el bootloader HoodLoader2.
El HoodLoader2 (HL2 desde ahora) básicamente lo que nos permite es utilizar el microcontrolador 16u2 (o en algunos casos 32u2 o 8u2 en placas malas) de forma independiente al ATmega328/2560, de está manera podremos cargar programas en el 16u2 y ejecutarlos directamente.
¡Ojo! Al ser el 16u2 el encargado de la comunicación por USB perderemos dicha comunicación en el 328/2560 al igual que no podremos, por ejemplo, utilizar el led13 en ambos programas. Aún no he echo pruebas utilizando dos programas a la vez así que no voy a tratar el tema en este artículo y me limitaré a la instalación de HL2.
HL2 dispone de tres métodos de instalación en el caso de la UNO:
- Utilizando la misma placa.
- Utilizando otro Arduino.
- Utilizando un ISP.
Aunque la primera opción es muy tentadora ya que toma ventaja de que ambos microcontroladores tienen los pines ICSP listos para ser usados pero es necesario un condensador de 100nF y no tenía ninguno a mano. En mi caso la solución fue utilizar uno de los Arduino NANO como programador, si el UNO había programado el NANO, ahora tocaba que le devolviera el favor.
Lo primero será descargarnos el repositorio de HL2:
git clone https://github.com/NicoHood/HoodLoader2
También necesitaremos tener instalada la última versión del Arduino IDE, aunque cualquier versión superior a la 1.6.7 debería de valer.
Desconectamos todos los cables del NANO, abrimos el Arduino IDE y cargamos el sketch Installation_Sketch.ino que está situado en la carpeta avr/examples del repositorio que acabamos de clonar.
El sketch ya viene configurado por defecto para la UNO así que no necesitamos modificar nada, lo cargamos en la NANO y llega la hora de cablear. Este es el esquema que nos dan en la wiki de HL2:
Aquí vino mi primer «problema» y es que no estaba seguro de que pines del ICSP del NANO correspondían con los pines del ICSP de la UNO. Luego de buscar los diagramas por google vi que las conexiones de la imagen se correspondían con los siguientes pines:
Cable Verde -> MISO
Cable Naranja -> SCK
Cable Amarillo -> MOSI
Una vez conectados a sus correspondientes en la NANO así como el resto de cables (en algunas placas baratas el ICSP del 16u2 puede venir al revés, ojo con eso) ya estábamos listos para flashear.
Realmente no tenemos que hacer nada, simplemente conectamos el NANO y este se encargará de flashear HL2 a nuestro UNO, pero si queremos ver el proceso tendremos 10 segundos para abrir el terminal y ver la información de debug.
Una vez completado el proceso ya deberíamos tener el UNO listo, vamos a comprobarlo, desenchufamos todo y lanzamos el siguiente comando en Linux:
udevadm monitor --subsystem-match=usb --property | grep -E "REVISION|VENDOR|MODEL"
Y el output debería ser similar a este:
ID_MODEL_FROM_DATABASE=Uno R3 (CDC ACM) ID_VENDOR_FROM_DATABASE=Arduino SA ID_MODEL_FROM_DATABASE=Uno R3 (CDC ACM) ID_VENDOR_FROM_DATABASE=Arduino SA ID_MODEL=HoodLoader2_Uno ID_MODEL_ENC=HoodLoader2\x20Uno ID_MODEL_FROM_DATABASE=Uno R3 (CDC ACM) ID_MODEL_ID=0043 ID_REVISION=0205 ID_VENDOR=NicoHood ID_VENDOR_ENC=NicoHood ID_VENDOR_FROM_DATABASE=Arduino SA ID_VENDOR_ID=2341
Si es así, todo ha salido bien y tenemos nuestro UNO con HL2 instalado.
El siguiente paso será añadir estas placas a nuestro Arduino IDE para poderlas programar, para ello nos iremos a preferencias y en la opción «Gestor de URLs Adicionales de Tarjetas» añadiremos la siguiente linea:
https://raw.githubusercontent.com/NicoHood/HoodLoader2/master/package_NicoHood_HoodLoader2_index.json
Ahora vamos a Herramientas -> Placa -> Gestor de tarjetas, buscamos HoodLoader2 y lo instalamos.
Nos aparecerán unas placas nuevas que serán las que tendremos que utilizar a partir de ahora en lugar de seleccionar Arduino UNO como hasta ahora. ¿Por qué? Pues porque ahora mismo nuestro UNO tiene dos modos de uso: 16u2 y Bootloader.
Si al arrancar no hay nada en el 16u2 entonces se ejecutará el Bootloader y se cargará el código del 328/2560. Para poder cambiar entre los distintos modos tenemos que conectar los pines de reset del 16u2, recordad estos son los dos pines mas cercanos al puerto USB (a no ser que tengáis el ICSP al revés). Una vez hará un reinicio del código del 16u2 y dos veces nos llevará directamente al Bootloader.
En caso de que queramos ir directamente al Bootloader podemos cargar el siguiente sketch que también tenemos en el repositorio:
/* Copyright (c) 2015 NicoHood See the readme for credit to other people. HoodLoader2 Run Bootloader example Starts Bootloader mode. This is useful if you only want to use the Fast USB-Serial bridge again. You could delete the firmware with avrdude, but this sketch is way simpler to upload for beginners. It forces a watchdog reset, meaning the bootloader is started completely independant. */ #include <avr/wdt.h> void setup() { // close interrupts cli(); // write magic key to ram *(uint16_t*)MAGIC_KEY_POS = 0x7777; // watchdog reset wdt_enable(WDTO_120MS); } void loop() { // wait for reset }
Para poder flashear en uno u otro microcontrolador debemos de realizar dichos «resets» para acceder a uno u otro, podemos ver en cual estamos en el puerto serie ya que cada uno tiene su propio nombre.
En la última versión de HL2 para el IDE jugamos con una ventaja, cuando seleccionamos la placa/microcontrolador al que deseamos flashear este ya se ocupa de realizar estos «resets» por nosotros.
Ya deberíamos tener nuestro UNO listo para funcionar, vamos a cargar un pequeño ejemplo extraído de aquí:
#include "HID-Project.h" void setup() { Keyboard.begin(); delay(500); // Payload delay(3000); Keyboard.press(KEY_LEFT_GUI); Keyboard.press(KEY_R); Keyboard.releaseAll(); delay(500); Keyboard.print("notepad"); delay(500); Keyboard.write(KEY_ENTER); delay(750); Keyboard.print("Hello World!!!"); Keyboard.write(KEY_ENTER); } void loop() { }
En caso de no tengáis la librería HID-Project instalada simplemente ir a Programa -> Incluir Librería -> Gestionar Librerías y ahí podéis buscar e instalarla.
Para flashear este código necesitamos seleccionar la placa HoodLoader2 16u2, en caso de que no lo hagamos al compilar nos dará un error la librería avisandonos de que la placa no es compatible.
Una vez flasheado desenchufamos el Arduino de nuestro pc y lo enchufamos en un Windows, después de unos segundos veremos como se ejecutan los comandos y aparecerá un notepad con las palabras «Hello World!!!»
¡Ya tenemos nuestro UNO funcionando como un Ruber Ducky!
En el repositorio de donde sacamos nuestro ejemplo han creado un script de python para convertir scripts de Rubber Ducky a código Arduino, os recomiendo probarlo.
Lo mejor de todo esto es que gracias a la librería HID-Project ahora nuestro UNO puede hacerse pasar, no solo por un teclado, sino por un ratón, un pad de juegos, etc, etc Pero eso es una historia para otro día.
Espero os haya gustado la entrada y cualquier cosa no dudéis en dejar un comentario, en mi caso todo funciono a la primera pero si os encontráis con problemas comentad e iré añadiendo las soluciones que encontremos al post.
Un saludo y, como siempre, gracias por vuestra visita!
Excelente Laburo