Como hicimos ingenieria inversa a un sistema de pulseras LED chinas para crear nuestro propio software de programacion.
Empezamos con Wireshark capturando TODO el trafico USB mientras programabamos pulseras con 10, 60 y 180 minutos. Analizamos 40KB de datos hexadecimales con un script Python que comparaba byte por byte.
Encontramos 591 diferencias... pero ninguna escalaba con el tiempo. Despues de renderizar los datos como imagen, descubrimos que eran tickets de la impresora 3nStar, no del programador.
Investigando en el Administrador de Dispositivos encontramos el programador real: un dispositivo HID con VID=0x1A86, PID=0xE010. El fabricante: WCH.CN, producto: "HID To Serial".
Escribimos un lector HID en Python y capturamos los primeros mensajes del dispositivo:
Pero cuando intentamos ENVIAR comandos... el dispositivo los ignoraba todos. Probamos cientos de formatos: ACK, NAK, STX/ETX, ASCII, binario, checksums. Nada funcionaba.
En un test de diagnostico, enviamos bytes 0xAA repetidos para probar tamanios de reporte. De repente: el dispositivo sono, los LEDs cambiaron de color y el IR empezo a parpadear.
Pero los resultados eran completamente inconsistentes. El mismo comando a veces
hacia algo, a veces no. Probamos el header AA 55, y parecia un
protocolo real, pero los resultados seguian siendo erraticos.
Decidimos ir al hardware. Con un destornillador abrimos el programador y encontramos dos chips principales:
Esto lo cambio todo. Ahora sabiamos que el CH9326 es un puente transparente USB-UART. Los datos que enviamos por HID se convierten a serial y llegan al STC. Solo necesitabamos espiar esa comunicacion serial.
Conectamos un ESP32 directamente a las lineas UART entre el CH9326 y el STC. Literalmente espiando la conversacion entre los dos chips dentro del programador.
Hubo un momento de panico: al conectar el cable al pin TXD, el IR dejo de funcionar. Solucion: usar una resistencia de 10K para no cargar la linea.
Con el sniffer activo y el software original corriendo, vimos por primera vez los bytes REALES del protocolo:
Tambien descubrimos POR QUE los comandos anteriores eran inconsistentes:
el CH9326 usa el primer byte como longitud. Nuestro header
0x05 se interpretaba como "envia 5 bytes" en vez de ser parte
del protocolo. Faltaba anteponer 0x0B (11 bytes).
Con el protocolo decodificado, creamos programar_pulsera.py.
Un ultimo obstaculo: la pulsera no encendia porque el software original
de Kpoplight seguia corriendo en segundo plano, sobreescribiendo nuestros
tiempos con ceros.
Al cerrar el software del fabricante y ejecutar solo el nuestro:
11 bytes que controlan todo el sistema
| Byte | Hex | ASCII | Funcion |
|---|---|---|---|
| 0 | 05 | ENQ | Header fijo |
| 1 | 52 | 'R' | Marcador Rojo |
| 2-3 | 00 3C | Tiempo Rojo: 60 minutos | |
| 4 | 47 | 'G' | Marcador Verde |
| 5-6 | 00 0A | Tiempo Verde: 10 minutos | |
| 7 | 42 | 'B' | Marcador Azul |
| 8-9 | 00 1E | Tiempo Azul: 30 minutos | |
| 10 | 44 | Checksum (suma & 0xFF) |
Sistema propio de gestion para ICEBERG
Interfaz web para programar pulseras desde cualquier dispositivo
Integracion con sistema de venta y cobro
Panel de administracion con reportes y estadisticas
Historial de pulseras programadas
Configuracion de paquetes y precios por color/tiempo
100% independiente del software chino