Volver a actualizaciones
Nuevo releaseAug 31, 2026

USBvalve v1.0.1

Expón la actividad USB sobre la marcha

Compartir

logo, landscape, dark text, transparent background

[!NOTE] USBvalve Versión 1.0.0

Se ha realizado una reescritura completa de la aplicación:

  • se ha abandonado el entorno Arduino IDE, ahora el código está escrito para el Pi Pico SDK
  • las dependencias de librerías externas se han reducido mucho
  • el soporte de USB host para dispositivos de baja velocidad (Low Speed) es ahora más robusto (ATTiny85, EvilCrow, etc)
  • el hardware y las funcionalidades son casi idénticos, consulta las notas a continuación para más detalles

Expón la actividad USB al vuelo

The two models The Watch 1.2

Estoy seguro de que, como a mí, te han pedido que conectes tu unidad USB en un dispositivo desconocido... y entonces surge la duda:

¿qué le ha pasado a mi pobre pendrive, entre bambalinas? ¿Robando mis archivos? ¿Cifrándolos? ¿O simplemente instalando un malware? Con USBvalve puedes descubrirlo en segundos: construido sobre hardware comercial extremadamente barato, puedes probar rápidamente cualquier actividad del sistema de archivos USB y entender qué está pasando antes de que sea demasiado tarde.

Con USBvalve puedes tener una respuesta inmediata sobre lo que le ocurre a la unidad; la pantalla te mostrará si se accede, lee o escribe en el falso sistema de archivos creado en el dispositivo:

Selftest Readme

y desde la versión 0.8.0 también puedes usarlo como USB Host para detectar dispositivos BADUSB:

HID

Este es un ejemplo del depurador BADUSB disponible en el puerto serie:

Si prefieres vídeos, también puedes echar un vistazo a mi Presentación en Insomni'hack

USBvalve Watch

A partir de la versión 0.15.0 se soporta una nueva versión Pi Pico Watch. Para compilar la nueva versión tienes que descomentar la línea #define PIWATCH al principio del código. El hardware es una placa de reloj con pantalla TFT de 1,28 pulgadas basada en RP2040. Puedes encontrar algo más de información aquí. También es totalmente compatible con la Waveshare RP2040-LCD-1.28.

Estructura del repositorio

docs: documentación sobre el proyecto, con una presentación donde puedes ver todas las funcionalidades

firmware: firmwares precompilados para la Raspberry Pi Pico. Puedes usarlos directamente y flashearlos en la placa. Tenemos varias versiones diferentes, para OLEDs de 32 o 64 líneas, para Pico 1 o Pico2, Pi Pico Watch, etc

PCB: archivo Gerber si quieres imprimir la PCB personalizada. No es obligatorio, puedes usar la tuya propia o montarlo en una protoboard

src y data: fuentes, si quieres modificar y compilar el firmware tú mismo

utils: algunas utilidades que puedes usar para construir un FS personalizado

pictures: imágenes y recursos usados en este documento

STL: archivos STL para la carcasa. En las carpetas 1.1 y 1.2 hay carcasas completas (gracias a WhistleMaster). En las carpetas 1.2_64 y 1.2_64_simple hay carcasas para la pantalla de 128x64 (gracias a rtmq0227). Si quieres algo más ligero para proteger la LCD puedes usar USBvalve_sliding_cover.stl.

Construir USBvalve

Lista de componentes

Si quieres construir el tuyo propio, necesitas:

  • Una Raspberry Pi Pico 1 o 2 (o cualquier otra placa basada en RP2040)
  • una pantalla OLED I2C de 128x64 o 128x32 (SSD1306)
  • (opcional) una PCB de USBvalve o una protoboard
  • (opcional) un separador impreso en 3D para aislar la pantalla de la placa (https://www.thingiverse.com/thing:4748043), pero puedes usar un trozo de cinta aislante en su lugar

Notas sobre BOOTSEL y la versión >= 1.0.0

En las versiones 0.x.x, BOOTSEL se usaba para reiniciar el dispositivo o imprimir el número de eventos HID (pulsar > 2s). El sondeo de BOOTSEL estaba creando algunos problemas para la detección de BADUSB, por lo que se eliminó a partir de la versión 1.0.0 y se sustituyó por las siguientes dos opciones:

  • soldar un botón entre GP0 y GND (pads 1 y 3, ver la imagen de abajo para ver un ejemplo) para tener las mismas funciones
  • usar los comandos r (reset) y h (eventos HID) desde el monitor serie

En PCB también encontrarás una versión 1.3 de la placa, con algunos agujeros en los pads 1 y 3 para facilitar el montaje del botón. Pero como puedes ver, también puedes usar tu versión antigua.

Si no estás usando las funciones BADUSB o si prefieres tener menos cobertura en la detección pero mantener el uso de BOOTSEL, también proporciono un firmware creado con bootsel habilitado (ver carpeta y releases).

Instrucciones de construcción

Gracias a Tz1rf también tenemos dos vídeos geniales: uno explicando el proceso de construcción paso a paso, y otro mostrando cómo subir el firmware y usar la herramienta.

Casi todo el trabajo lo hace directamente el software en la placa, así que solo necesitas organizar la conexión con la OLED para la salida.

A partir de la versión 0.8.0 del firmware, USBvalve puede detectar dispositivos HID (usado para detectar BADUSB). Esto requiere un puerto USB adicional que actúe como Host. Si no estás interesado en esto, puedes usar las instrucciones antiguas en la carpeta docs y usar la versión 1.1 de la PCB. En caso contrario, continúa con la versión 1.2 de la PCB (tenemos versión para USB-A o USB-B, ver carpeta).

Con la PCB de USBvalve

  • suelda un puerto USB hembra en el área USBH. Esto es para la versión A, pero también hay una versión para USB Micro-B si lo prefieres
  • coloca la Raspberry Pi Pico sobre el serigrafiado en la parte frontal
  • no necesitas soldar todos los PINs. Solo los siguientes:
    • D4 y D5 (lado izquierdo)
    • D14 y D15 (lado izquierdo)
    • GND (lado derecho, tercer pin desde arriba)
    • GND (lado derecho, tercer pin desde abajo)
    • 3v3_OUT (lado derecho)
    • VBUS (lado derecho)
    • los 3 pines DEBUG en la parte inferior: SWCLK, GND y SWDIO
  • coloca el separador impreso en 3D o un trozo de cinta en las partes de la OLED que puedan tocar la Raspberry
  • suelda la OLED (con un header) en el espacio de 4 PINs

Algunas de las OLEDs tienen los PINs GND y VCC intercambiados, así que construí la PCB para que sea compatible con ambas versiones:

Por ejemplo, si tu OLED tiene GND en el PIN1 y VCC en el PIN2 así:

Tienes que poner una gota de soldadura en estos dos pads en la parte trasera de la PCB:

De lo contrario, deberías hacer lo contrario y poner la soldadura en los otros PADs:

Sin la PCB de USBvalve

Pico Pi

Si estás usando una protoboard o simplemente cableado, todo lo que tienes que hacer es asegurarte de conectar los PINs adecuados a la pantalla OLED y al puerto USB Host.

El mapeo es el siguiente:

  • PIN6 de la Pi --> OLED SDA
  • PIN7 de la Pi --> OLED SCL
  • PIN19 de la Pi --> D+ del USB Host
  • PIN20 de la Pi --> D- del USB Host
  • PIN23 (GND) de la Pi --> GND del USB Host
  • PIN38 (GND) de la Pi --> OLED GND
  • PIN36 (3V3OUT) de la Pi --> OLED VCC
  • PIN40 (VBUS) de la Pi --> VCC del USB Host

Si quieres usar las funciones DEBUG, también puedes colocar un header en los 3 PINs SWD en la parte inferior de la placa.

Con la PCB de USBpipe

[!CAUTION] Esta PCB es para makers electrónicos experimentados ¡NO LA USES SI NO ESTÁS SEGURO DE PODER MANEJARLA!

[!NOTE] R7 y R8 en realidad no están conectadas a nada. Se añaden con fines de depuración del circuito. Por lo tanto no aparecen en el BOM

USBpipe PCB USBpipe

USBpipe es una PCB dedicada para este proyecto.

Puedes encontrar todo lo que necesitas en la carpeta ./PCB/USBpipe/.

Front Back

Flashear el firmware

Para flashear el firmware, sigue estos pasos:

  • Conecta la Raspberry Pi Pico con el cable USB, manteniendo pulsado el botón BOOTSEL (el botón blanco grande de la placa)
  • suelta el botón
  • verás una nueva unidad en el sistema, llamada RPI-RP2 (en entornos Linux puede que tengas que montarla manualmente)
  • copia el archivo de firmware adecuado (con extensión uf2) en la carpeta, dependiendo de la OLED que hayas usado
  • espera unos segundos hasta que la carpeta montada desaparezca

¡Listo!

Anti-Detección

No sé si alguna vez será el caso, pero puede que quieras personalizar el firmware para evitar la detección realizada por malware consciente de USBvalve :-)

He agrupado la mayoría de las variables que podrías querer modificar en esta sección de usb_config.h (ver el Dockerfile de abajo para recompilar)

// USB anti-detection settings
//
// Set USB IDs strings and numbers, to avoid possible detections.
// Remember that you can cusotmize FAKE_DISK_BLOCK_NUM as well
// for the same reason. Also DISK_LABEL in ramdisk.h can be changed.
//
// You can see here for inspiration: https://the-sz.com/products/usbid/
//
#define USB_VENDORID       0xCAFE
#define USB_PRODUCTID      0x1337
#define USB_DESCRIPTOR     "DataStore"
#define USB_MANUF          "USB Acme"
#define USB_SERIAL         "123456789A"
#define USB_VENDORID_STR   "Acme"            // Up to 8 chars
#define USB_PRODUCTID_STR  "DataStore"       // Up to 16 chars
#define USB_VERSION_STR    "1.0"             // Up to 4 chars

Compilar tu firmware

Obviamente también puedes compilar tu propio firmware. Para compilar necesitas el Raspberry Pi Pico SDK y este repositorio.

Instrucciones básicas de recompilación:

export PICO_SDK_PATH=</path/to/pico-sdk>

git clone --recursive https://github.com/cecio/USBvalve.git
cd USBvalve
mkdir build && cd build
cmake -DPICO_BOARD=pico ..   # or pico2 for standard build
make -j$(nproc)
# Output: build/src/USBvalve.uf2

Si quieres recrear un nuevo sistema de archivos falso, puede que quieras echar un vistazo a la carpeta utils, donde he colocado algunas utilidades para construir uno nuevo.

Dockerfile

Si quieres compilar tu propio firmware, después de personalizarlo, proporciono un Dockerfile que construye un entorno de compilación completo y compila el firmware.

Introduce los siguientes comandos en la carpeta principal USBvalve para compilar:

# To Build:
#       docker build -t usbvalve-sdk -f Dockerfile.sdk .
#
# To Run (default: pico, SSD1306 OLED 128x32):
#       docker run --rm -v $PWD:/mnt usbvalve-sdk
#
# Options (via environment variables):
#       BOARD=pico|pico2          Board target (default: pico)
#       OLED_HEIGHT=32|64         OLED display height (default: 32)
#       PIWATCH=1                 Use GC9A01 round TFT instead of SSD1306
#       USE_BOOTSEL=1             Enable BOOTSEL button (disrupts Low Speed USB)
#
# Examples:
#       docker run --rm -e BOARD=pico2 -v $PWD:/mnt usbvalve-sdk
#       docker run --rm -e PIWATCH=1 -v $PWD:/mnt usbvalve-sdk
#       docker run --rm -e BOARD=pico2 -e OLED_HEIGHT=64 -v $PWD:/mnt usbvalve-sdk

El firmware se colocará con extensión uf2 en la carpeta USBvalve_out.

Contribuir

Si tienes ideas o mejoras en mente, te animo a abrir un issue para que podamos mejorar el proyecto juntos. ¡Gracias!

Soporte

Si tienes preguntas o necesitas soporte puedes abrir un Issue aquí o contactarme en Twitter/X @red5heep

Versiones de la comunidad

La comunidad ha creado algunos forks que implementan soporte para otras placas, u otras modificaciones. Gracias a todos los que habéis contribuido al desarrollo de USBvalve. A continuación una lista no oficial/incompleta/no soportada:

ADVERTENCIA DE SEGURIDAD

[!WARNING] He recibido muchas preguntas sobre USBvalve y los dispositivos USB killer. USBvalve no está construido para probar estos dispositivos, no tiene ningún tipo de aislamiento o protección, así que si sospechas que estás tratando con uno de estos dispositivos, pruébalo con otra cosa, NO con USBvalve o podrías dañar el dispositivo, a ti mismo o a objetos cercanos a ti.

Categorías