Revista 100% Verde

Control domestico mediante un smartphone usando ingeniería inversa

Por Soloelectronicos @soloelectronico
En el post de hoy vamos a ver como usando ingeniería inversa  (los anglosajones lo llaman hacking ) es posible añadir nuevas funcionalidades a hardware existente comercial en principio no concebido para esa  tarea. El hardware elegido  ha sido en sencillo y barato  sistema inalambrcio de control de 4 cargas  de ca por medio de RF usando un único mando común de 4canales RF. La idea es hackear dicho sistema inalámbrico de automatización del hogar para ser controlado mediante dos microcontroladores AVR por medio de USB En el siguiente video vamos a ver una demostración  del producto final  al que vamos a intentar descifrar en las siguientes lineas

Como vemos el vídeo es impresionante , veamos como se ha llegado hasta ahí en este impresionante  trabajo

Hay dos maneras de hackear un remoto RF a ser controlado por una computadora o un microcontrolador.

  • El mas artesanal : Soldar los cables en las almohadillas del botón del mando a distancia y engancharla a un un microcontolador (por ejemplo  Arduino).
  • La manera fresca:Mandos a distancia RF la mayoría tienen un módulo separado para transmisión de datos. Este dispositivo tiene generalmente un VCC y una línea GND y una línea de datos. Usted puede fácilmente transmitir sus propios datos inalámbricos conectando un microcontrolador para la línea de datos.Sin embargo, con el fin de transmitir algo que puedan entender los radiorreceptores, primero tienes que averiguar cómo es formateados y transmite los datos inalámbricos.Para hacer este hack necesitará un analizador lógico y, opcionalmente, un osciloscopio.

En adelante vamos a ver  la segunda opción : es decir  usando  herramientas , en este caso de manos de  un analizador logico para estudiar como se ha fabricado para luegointentar  emular su funcionamiento

En este caso se usa un sonda logica Saleae. Esta es una herramienta increíble y con ella se pueden hacer muchos trabajos de  ingeniería inversas usando este dispositivo

Compruébelo en http://www.saleae.com/logic/

Lo malo  es que  cuesta 149 USD, pero !es una buena inversión para cualquier hacker!

También tiene que estar  familiarizado  y cómodo con los microcontroladores y programación en C.

Picture of Skills ans tools
saleae_screenshot.png
Usted necesitará para realizar este proyecto:
  • 1 x kit inalámbrico de automatización del hogar
  • 1 x caja de proyecto
  • 1 conector tipo B x USB
  • Diodo zener 2 x 3.6v
  • Diodo zener 8.2v x 1
  • transistor BC548 x 1
  • condensador de cerámica de 2 x 22pF
  • condensador de cerámica de 2 x 100nF
  • 1 x 4.7uF condensador
  • condensador 100uF x 1
  • 1 x 470uF capacitor
  • 1 x 330uF condensador
  • cristal 1 x 12MHz
  • 2 x LED con resistencia (yo usé 1 k ohmios)
  • 2 x 68R resistor
  • 1 x resistencia de 1 k 5
  • 1 x resistencia de 2 k 2
  • resistor de 1 x 1m
  • 1 x 270uH inductor
  • Diodo 1N4004 x 1
  • microcontrolador ATmega8 x 1
  • 1 x protoboard. La soldadura tipo ojo, no perforada.

Picture of Parts required

Manos a la obra

Picture of Don't turn it on, take it apart!
remote_inside.jpg
 Como es de suponer el control remoto tiene un módulo independiente de RF. ¡ Crack se abre y pueede comprobar si este es el caso.El pequeño tablero verde dentro del mando a distancia es el módulo de RF.

La placa   debe tener o claramente etiquetadas al menos  3 entradas:

  • VCC
  • DATOS
  • GND
remote_rf_module.jpg
Las conexiones fueron ser maso difíciles llegar con  sondas de osciloscopio o el analizador logico , tan sólo puede extender  las conexiones utilizando un alambre de cobre sólido núcleo.

Ahora yo puede presionar los botones mientras husmea como son los datos en  la línea de datos.

remote_inside.jpg

Picture of Figure out what's going on inside
IMG_6509.JPG
IMG_6510.JPG
El control remoto está alimentado por una batería de 9V. Como los analizadores lógicos suelen  ser de 5 voltios, se debe ver que está pasando con la línea de datos antes engancharla  hasta el analizador lógico.Si la señal en la línea de datos es de 9 voltios, tendemos  que hacer algunos trucos para bajarlo a 5V para el analizador de lógica.

Conectar una sonda de osciloscopio a la línea de datos y GND a la línea de GND del mando a distancia.  Coloque sondas   las dos  y apretar   un botón.si se convierte  la línea de datos en sólo 3 voltios entonces puede conectar la sona logica  (l La distancia entre las líneas de puntos horizontales en la pantalla del osciloscopio es 2 voltios.)

El módulo RF parece un dispositivo muy simple, así que simplemente supondremos que puede manejar 5 voltios, así como 3. El microcontrolador se ejecutará a 5 voltios.

Picture of Reverse engineering: first glance
rf_4_identical_frames.png
rf_example_frame.png
El osciloscopio es una gran herramienta, pero para ver lo que está pasando con la señal de datos,  es mucho más fácil de usar un analizador lógico.El analizador lógico sólo lee 0 y 1, así que , así que es mucho más fácil de leer que la pantalla del osciloscopio pequeño,así que se puede hacer la  línea de datos hasta el canal 1 del analizador lógico.Seleccionar 1 MHz captura de tarifa, que debería ser más que suficiente para esto.Comenzar el analizador de lógica y pulsar el botón para en el control remoto de la lámpara 1.

El analizador lógico muestra 4 distintos marcos de datos. En un principio puede pensar que quizás esto pueda  ser más complicada de realizar ingeniería inversa de  previsto,pero en muchos casos puede ser idéntico. Lo mismo sucede con todos los botones del mando a distancia. Los datos se transmisión probablemente 4 veces porque el enlace inalámbrico es inherentemente confiable

Entonces acérquse  a uno de los marcos  para ver en  que consiste los  pulsos de diversa longitud.:en este momento tenemos un montón de pulsos cortos y largos

El control remoto tiene un pequeño botón que está debajo de la tapa de la batería. Si se presiona este botón, tengo que volver a asociar todos los receptores con el mando a distancia. Si el control remoto del vecino está interfiriendo con sus luces pulse este botón para obtener una nueva identificación al azar .(pulsar este botón crea una especie de código aleatorio específico para esa distancia)

Si eso es cierto, puedo usarlo para identificar al menos algunas partes de los datos.

Comenzar  el analizador lógico otra vez y pulsar  ON para lámpara uno 5 veces mientras presiona el botón reset entre cada vez que he pulsado lámpara 1.

Para que sea más fácil ver lo que estaba pasando, copiar pega los fotogramas datos en gimp y  colocarlios unos a otros. En el analizador de lógica que están representados al lado, lo que hace comparación bastante duro.

Afortunadamente, los chicos de Saleae habían pensado en esto. Ctrl + Mayús + m le permite copiar una selección de la pantalla al portapapeles.

Presionar el botón reset cambiado un número al azar dentro del mando a distancia que se transmite con cada fotograma de datos.

La primera parte es siempre la misma. Esto tiene sentido. Probablemente “despierta” a los receptores o le dice que “¡ aquí viene datos, prepárate!”

Los próximo 12 bits consecutivos cambian cada vez que presiono el botón de reinicio. Puede  marcar los pedacitos que cambian en rojo y los bits constantes en verde.

Permite llamar a los 12 bits al azar la dirección de red de ahora en adelante.

Parece que los datos de capacidad de carga para cada fotograma están de 8 bits.

Otra gran cosa acerca de hacer este hack por la manera fresca en lugar de simplemente soldar los cables hacia los botones, es que usted puede utilizar el campo aleatorio de 12 bits también. Puede tener 4 luces en ID de uno red y otros 4 en otro ID de red y controlarlos desde el mismo control remoto! En realidad, usted puede controlar (2 ^ 12) * 4 = 16384 lámparas con este hack!

 Ingeniería inversa: ¿Qué es 0 y 1
Picture of Reverse engineering: what is 0 and what is 1
Así que sabmos  que pedacitos  ignorar, el bit de arranque y pedacitos de ID de red. Pero todavía no sabemos cómo el control remoto representa 0 y 1.El control remoto tiene botones para 4 lámparas. La manera más lógica para representar a éstos en la estructura de datos es con un número binario de 2 bits.

Comenzar  el analizador lógico otra vez y presionar el botón de encendido para la lámpara 1, 2, 3 y 4. Luego copiar-pegar  en Gimp para tener una visión general.

Entonces cuatro bitse cambian al pulsar un botón. Dos de las partes parecen estar contando en binario de 0 a 3. Es más probable que ellos son los bits de la dirección de la lámpara.

Para lámpara 1 son ambos pulsos largos. Para lámpara 2 hay uno corto y uno largo del pulso. Esto significa que el bit menos significativo es enviado primero.El contrario de manera normalmente escribirías un número binario.

Parece que los bits marcados en verde  estar contando de 0 a 3, lo cual pueden ser  los bits de la dirección de la lámpara. No sé cuáles son los bits marcados en azul. Probablemente una especie de suma de comprobación para asegurar una comunicación libre de errores.

Además, hemos aprendido de esto que con toda probabilidad, los bits se transmiten como éste.

  • Largo pulso: 0
  • Corto pulso: 1

Ingeniería inversa: averiguar el resto de los datos

Picture of Reverse engineering: figure out the rest of the data
openoffice_splitted.png
frame_format.png
En este punto yo sabemos cómo es representado 0 y 1, e intuimos   cuales brocas representan la dirección de la lámpara. También los dos últimos bits son alguna forma de suma de comprobación.Para calcular el resto de la estructura de datos, tenemos  que capturar datos para todas las pulsacioness de botón posible.

Comenzar el analizador lógico y presionado ON para todos 4 lámparas, entonces apagando, entonces todo encendiedo y todo apagando y finalmente DIM + y -.

Para que sea un poco más fácil de depurar, escribír todos los fotogramas capturados en OpenOffice. Omitír los primeros 13 bits, puesto que  sabemos  lo que son 

Parece que los datos de carga tienen dos bits para la dirección de la lámpara, entonces 4 bits para datos de comando.

Los bits de orden eran fáciles de entender. En la segunda foto, se e divide los datos en 3 columnas, dirección de lámpara, pedacitos de comando y suma de comprobación.

Como puede ver comando 2 es sólo cuando pulso los botones de todos o de todos. Eso significa que este bit es una difusión brocas que hace que todos los receptores de escuchen.

  • Bit 3 es solamente cuando presiono el botón o DIM – botón. Permite llamar a este pedazo de mando ON/OFF.
  • Bit 4 es sólo cuando presiono el DIM botones +/-. Llamémoslo DIM.
  • Bit 5 siempre es NCe. ¿Tal vez está ahí porque el algoritmo de comprobación necesita un número par de bits?

En la última foto, se puede ver que tengo marcha atrás diseñado el marco todos los datos.

Pensaba que el sistema tenía 4 direcciones de la lámpara, puesto que hay 4 botones del mando a distancia. Pero otra posibilidad es que los tres primeros bits son Dirección lámpara, y esa dirección 111 se emite. Si este es el caso, entonces puedes tener 7 lámparas + transmisión en una red ID.

ingeniería inversa: checksum

Picture of Reverse engineering: checksum head-scratching
openoffice_splitted.png
En este momento sabemos  lo que está todo dentro del marco de datos. Sin embargo, no sabemos   cómo se calcula la suma de comprobación.Podemos ver que  la suma de comprobación para oprimir cualquier botón dado es idéntico sin importar el identificador de red al azar. La suma de comprobación sólo se calcula basándose en los datos de carga útil.(suponemso que está codificado en el control remoto para simplificar el diseño de chip.)

Así que con esto en mente, intentemos  algo más simple. Como hemos notado que las secuencias de 01 y 01 se anulan mutuamente y producen un checksum de 00, y que las secuencias de 01 y 10 produciría un checksum de 11, esto deja  entrever hacia un simple algoritmo XOR.

Después de un ensayo y error, hemos encontrado un algoritmo simple que siempre produce la suma de comprobación correcto.

Los primeros dos bits son XOR’ed con los dos bits 2do. El resultado de esto es XOR’ed con los dos últimos bits.

Verificación de la imagen para ver cómo se hace el cálculo de hcecksum:

Ingeniería inversa: sincronización

Picture of Reverse engineering: timing
timing_1.png
Así que ahora que sabemos lo que es todo, lo único que queda por hacer es averiguar la sincronización de las señales.Cada bit está compuesta por un periodo de baja y un periodo de alta. El ciclo es siempre 1.92-ish milisegundos. Un pulso largo es 1,3 ms y ms 0,62 un pulso corto.

Cada fotograma, bit de arranque excluido, es la Sra. 38.4 38,4/20 = 1.92 Sra. así 1,92 ms me parece un buen punto de partida para la creación de los tiempos bien.

Picture of Reverse engineering: Re-create the result
Sé cómo funciona, ahora vamos a tratar de recrear el resultado.Configurar un temporizador en una ATmega8.

El ATmega está funcionando a 12MHz.

Un contador de tiempo está configurado con un prescaler 128 en el modo de CTC. En el modo CTC, se restablece el temporizador y se llama una interrupción cuando el contador llegue a un contador de tiempo determinado comparar valor.

El contador se actualiza cada ciclo de 128 reloj. Esto significa que tengo que usar 120 y 58 como los valores del contador para los pulsos cortos y largos.
(1000/12000000) * 128 * 121 = 1,29 mS
(1000/12000000) * 128 * 59 = 0,62 mS

Esto está muy cerca de los tiempos originales.

Armar una simple función para llenar un búfer con los tiempos de retardo para un determinado marco de RF. Una rutina de interrupción luego enciende un pin de IO y apaga y establece el temporizador comparar valor para crear el pulso de la longitud deseada.

Podemos  enganchar  hasta el analizador lógico y copiar-pegar el resultado en Gimp.¡ Bingo! La señal resultante es idéntica a del control remoto RF :D

Hardware: RF-fail y carga de la bomba

Picture of Hardware: RF-fail and charge pump
Pero el control remoto utiliza una batería de 9v.y el Tamega  5  así que no podemos conectar directamente .. ¿Tal vez el módulo RF necesitaba 9v? Conectar   VCC en el módulo de RF + 9V e intentar de nuevo. ¡ Un éxito!

Pero no es elegante o tener una batería de 9v dentro del  gadget,así   que podemos usar una  bomba de carga consiste en un inductor, un transistor, un diodo y un condensador.

Cuando se activa el transistor, el inductor es cortocircuito a tierra. Cuando se desactiva el transistor, hay un efecto de flyback en el inductor que libera una corta ráfaga de alta tensión. Este voltaje atraviesa el diodo y queda atrapado en el condensador.

Picture of Hardware: circuit
El circuito es bastante simple. Lo complicado es dentro del módulo de RF.

La parte principal es un microcontrolador AVR ATmega8. Un conector USB está conectado vía algunas resistencias y diodos zener. Las señales USB son 3.3v, así que necesitamos para reducir el voltaje Zéner.

La línea de datos del módulo de RF está conectada a un pin de IO. El transistor de la bomba de carga y el LED de estado también están conectadas a los pines de IO.

La señal de retorno del circuito de la bomba de carga está conectada con el comparador analógico. Compara la tensión a una tensión de referencia interna.Creo que la tensión de referencia es 1,1 voltios ish. No es tan importante.

El circuito tiene los circuitos regulares como condensadores de filtrado también y un cristal de 12MHz.

(faltan solo las  resistencias en los LEDs en el esquema. Usted puede agregar resistencias adecuadas.)

usbrf.sch
272 KB

Se suministra una señal PWM para el transistor para hacer este 23.000 ish veces por segundo. Cada vez que lanza el transistor, aumenta un poco la tensión en el condensador.

Para evitar que crezca la tensión alta, el voltaje en el condensador es alimentado hacia el microcontrolador mediante un Diodo zener. El comparador analógico comprueba si el voltaje es superior a 1,2 voltios + el voltaje zener.

El bucle principal del microcontrolador continuamente comprueba si el voltaje está por debajo del umbral. Si lo es, se inicia la señal pwm. Si se alcanza el nivel umbral, pwm está deshabilitado.

Picture of Hardware: prototype
Antes de quitar el chip de la placa, es necesario algún software.El software está escrito en C y basado en un proyecto de ejemplo de lib objetivo desarrollos V-USB. Esta es una gran pieza de software, y es gratuito y de código abierto para su uso personal y no comercial.

http://www.obdev.at/Products/vusb/index.html

No voy a entrar en detalle sobre cómo funciona el software. La ingeniería inversa es el énfasis de . Aquí está la versión corta:Tiene dos programas para hacer que esto funcione. Un programa en su ordenador y el firmware para el microcontrolador.

Microcontrolador:

Las transmisiones RF actuales se realizan mediante una rutina de interrupción.Se usa una interrupción del temporizador porque esta es la manera más fácil de obtener sincronización exacta. La interrupción del temporizador Lee de un búfer global donde se almacenan los tiempos de retardo. No almacenar el estado de encendido/apagado del transmisor RF desde el encendido y apagado siempre suplentes. Comience con un pulso apagado, y luego alternar dentro y fuera de pulsos.

El tampón contiene valores de 42. Hay 21 bits para ser transmitido, y cada uno tiene un período de bajo y un periodo de alto. Esta configuración no es muy eficiente de RAM, pero el ATmega8 tiene un montón. Podrás cambiar RAM para la legibilidad del código en lugar de tener memoria ram sin usar!

El buffer está poblado por la función send_rf_frame (red, capacidad de carga).En los tiempos en la matriz de tampón rf, empezando con el bit de arranque, seguido por el identificador de red de 12 bits y los 8 bits de carga + comprobación bien llena. Cuando el buffer se llena, la variable posición tampón se restablece a 0, para que la rutina de interrupción comenzará el trabajo de bit 0 en el búfer.

Cuando se enviaron datos al microcontrolador por el puerto USB, se llama la función usbFunctionSetup(). Esta es una función que crea y donde pones tu código USB entrante.

Dependiendo del tipo de solicitud enviado desde la PC, puedes hacer cosas diferentes dentro de esta función. Tengo pedido dos tipos configurados, set_network_id y send_command.

La solicitud de set_network_id sólo toma el identificador de red de 12 bits enviado desde el ordenador y almacena en un valor entero global.

La solicitud de send_command llama send_rf_frame() y pasa el byte recibido comando a él. Después de eso, la rutina de interrupción asume el control.

Dentro del bucle main():
usbPoll(); tiene que ser llamado cada pocos milisegundos (10 o 50, no estoy seguro) para el USB para que funcione correctamente.
Después de eso, se comprueba el comparador analógico. Si el voltaje de carga de la bomba es demasiado bajo, se inicia la bomba de carga. Si es en la tensión deseada, se apaga la bomba de carga.

Por último, un LED de estado se establece en ON si la bandera rf_busy está activa.

Ordenador :

En el lado del ordenador  también es necesario modificar   el ejemplo proporcionado por el objetivo de desarrollo. Se puede añadir  un código para analizar los argumentos de la línea de comandos. También puede escribír una función para crear los bytes de carga útil. Toma argumentos como el número de la lámpara, encendido/apagado, difusión.

El programa informático puede utiliza libusb para comunicarse con el microcontrolador.

También es util un pequeño script para llamar el programa informático de línea de comandos cuando se presionan los botones de una página web. Abra la página web en tu Android/iPhone y controlan las luces!

usb_homeautomation-0.1
118 KB Fuente   aqui
Control domestico  mediante un smartphone usando ingeniería inversa

Volver a la Portada de Logo Paperblog