Ingenier铆a inversa industrial

La historia del proceso de pr茅stamo en el desarrollo de la electr贸nica en un buen ejemplo.



Grabar el registro del elevador del sniffer casero


Una vez que necesitaba copiar un dispositivo bastante simple. La empresa de fabricaci贸n dej贸 de existir, pero en todo el pa铆s todav铆a exist铆a una demanda de reemplazo de dispositivos rotos o usados.


El dispositivo en s铆 es el bot贸n de llamada del ascensor en la foto de la izquierda. Para los experimentos, me dieron dos copias, una de las cuales podr铆a desmontarse por completo.


El plan de trabajo general se parec铆a a esto:


  1. Estudiar la placa de circuito;
  2. Estudiar la base del elemento del tablero mismo;
  3. Dibujando su circuito el茅ctrico;
  4. Intente leer el archivo de firmware del microcontrolador;
  5. Desmontaje del firmware;
  6. Extracci贸n del algoritmo de operaci贸n;
  7. Desarrollo de una nueva junta;
  8. Escribir un nuevo firmware.

Si el p谩rrafo 4 falla, el plan adicional habr铆a sido m谩s complicado, pero tuve suerte.


Estudiamos el experimental



Microcontrolador principal



Una parte del circuito el茅ctrico del elevador, en el cual nuestras tablas est谩n rodeadas en rojo


La placa se ensambla en un microcontrolador de 1997, el AT89C2051 , que se basa en la arquitectura Intel MCS-51 . En 2020, celebra su 40 aniversario en el mercado de sistemas integrados.


Una peque帽a explicaci贸n: un microcontrolador es un microcircuito que contiene un n煤cleo inform谩tico y un conjunto de perif茅ricos para controlar dispositivos externos. Por ejemplo, en una lavadora moderna, el microcontrolador sondea los botones de control, los sensores, muestra informaci贸n en la pantalla y controla las bombas, el calentador, las v谩lvulas y la unidad de tambor. Para la mayor铆a de estas funciones, no requiere dispositivos intermedios, solo un conjunto de componentes electr贸nicos pasivos.


Desmontamos la placa de circuito

Dibujar el diagrama de circuito original de la placa en el futuro ayudar谩 a descubrir el prop贸sito de los pines del microcontrolador, que es necesario para analizar el c贸digo del firmware.


El dispositivo original fue desarrollado por una empresa china y, por lo tanto, su circuito es extremadamente confuso y tiene muchos componentes innecesarios. Por ejemplo, el rel茅 se encendi贸 a trav茅s de una triple cascada de un transistor bipolar, un optoacoplador y un controlador de campo (en ese orden).


Un conocido que trabajaba con fabricantes chinos me dijo que los chinos est谩n involucrados en complicaciones similares de esquemas para aumentar el costo de desarrollo y producci贸n, si solo una persona lo hace. Despu茅s de esto, me inclino a creerle:



El mismo lugar en el tablero chino de dos capas en ambos lados. Tres enormes resistencias no est谩n conectadas a nada. Incluso hice brillar el tablero con una potente linterna para asegurarme.


El esquema se copia, los lugares misteriosos se modelan en un multisim , tomamos el firmware.


Intentando leer el firmware


Tuve mucha suerte de que la protecci贸n contra lectura no estuviera habilitada en ambas placas en los controladores, por lo que fusion茅 con 茅xito las dos opciones de firmware con pornograf铆a similar:



Foto del blog personal de un entusiasta estadounidense.


Desmontaje del firmware


El siguiente paso que necesitamos para convertir este c贸digo de m谩quina en algo m谩s legible:



Tomamos la conocida herramienta IDA Pro , que ya tiene nuestro controlador con todos los registros perif茅ricos, y abrimos el archivo de firmware HEX:



Procesamiento de datos recibidos por la placa en lenguaje ensamblador


Despu茅s de eso, hay un proceso bastante tedioso de estudiar el conjunto de instrucciones de nuestro n煤cleo inform谩tico, comentando y decodificando el c贸digo del ensamblador.


Los mismos controladores de interrupci贸n se encontraron en las direcciones de la tabla de vectores de interrupci贸n; las entradas en los registros perif茅ricos proporcionaron informaci贸n sobre la configuraci贸n de la interfaz de comunicaci贸n. Paso a paso, el c贸digo de ensamblador sin nombre se ha convertido en algo que se puede leer.


Extracci贸n del algoritmo de trabajo.


Como necesitaba desarrollar un nuevo dispositivo en una base de elementos diferente, era necesario extraer un algoritmo del c贸digo. Alg煤n tiempo despu茅s, naci贸 un pseudoc贸digo de este tipo:


void UartISR (void) { counter500ms = 0; //ClearFlag(isrFlags, ISR_FLAG_3); ProcessUart(recievedByte); } void ProcessUart(uint8_t recievedData) { static uint8_t uartPacketsToRxLeft, uartRecievedCmd, uartCurrPacketCRC; static uint8_t i, carryFlag; static uint16_t uartIsrPointer; static uint8_t uartBuffer1[8], uartBuffer2[6]; static uint8_t uartBuffer1Pos, uartBuffer2Pos; // 0 - // 1 - // 2 - // 3 - led state, 0x0F // 4 - // 5 - // 6 - // 7 - // 8 - buttons time static uint8_t dataRegisters[9]; // RAM:0050 uint8_t tmpVal, i; uint8_t dataToSend; if (GetFlag(UartISRFlags, UART_RECIEVED_FLAG)) { ClearFlag(UartISRFlags, UART_RECIEVED_FLAG); if (recieved9thBit) { switch (recievedData) { case 0xC1: uartPacketsToRxLeft = 8; uartRecievedCmd = 1; uartBuffer1Pos = 0; uartBuffer1[uartBuffer1Pos] = recievedData; //uartIsrPointer = 0x0037; //tmpVal_0037 = recievedData; uartCurrPacketCRC = recievedData; UartRxOn(); return; break; case 0xC2: uartPacketsToRxLeft = 3; uartRecievedCmd = 2; 

El mismo procesamiento de datos recibidos en C


A qui茅n le importa el protocolo de transferencia:


La estaci贸n de control del elevador se comunicaba con los paneles de botones de llamada a trav茅s de una interfaz d煤plex completa de 24 voltios. En modo normal, las tarjetas de bot贸n escuchaban la l铆nea, esperando un paquete de datos de 9 bits. Si la direcci贸n de nuestra placa vino en este paquete (fue establecida por el interruptor DIP en la placa), entonces la placa cambi贸 al modo de recepci贸n de 8 bits, y todos los paquetes posteriores fueron ignorados por el resto de las placas en el hardware.

El primero despu茅s de la direcci贸n fue un paquete con un c贸digo de comando de control. Espec铆ficamente, este tablero solo tom贸 3 equipos:
  1. Escribir en registros de datos. Por ejemplo, la frecuencia y duraci贸n del bot贸n parpadeante en una llamada;
  2. Encender la luz de fondo del bot贸n;
  3. Consulta el estado de los botones (presionados o no).


El 煤ltimo byte fue la suma de comprobaci贸n, que es un XOR simple de todos los bytes despu茅s de la direcci贸n.
Despu茅s de la suma de verificaci贸n, el tablero volvi贸 a entrar en modo de espera para su direcci贸n.

Desarrollo de nueva junta


Para la etapa de desarrollar un nuevo diagrama de cableado y una placa de circuito impreso, no tengo im谩genes, pero fue algo como esto:


El cableado y el cableado se realizaron en Altium Designer . La fabricaci贸n de la placa de circuito impreso se orden贸 en Zelenograd " Resonite ".


Escribir un nuevo firmware


Mientras nuestra nueva placa est谩 en producci贸n, vamos al objeto donde est谩n instalados dichos botones de llamada y verificamos la correcci贸n del protocolo de transferencia desmontado utilizando el sniffer montado en el arduino:

Una pieza de circuito transmisor que es el茅ctricamente equivalente al original. El receptor es solo un optoacoplador.


 //UART1 initialize // desired baud rate:19200 // actual baud rate:19231 (0,2%) // char size: 9 bit // parity: Disabled void uart1_init(void) { UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; UCSR1C = 0x06; UBRR1L = 0x33; //set baud rate lo UBRR1H = 0x00; //set baud rate hi UCSR1B = 0x94; } #pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC void uart1_rx_isr(void) { unsigned char tmp; unsigned int rcv = 0; if (UCSR1B & 0x02) { rcv = 0x100; } rcv |= UDR1; tmp = (rcv >> 4) & 0x0F; if (rcv & 0x100) { tmp |= 0xC0; } else { tmp |= 0x80; } txBuf12 = (rcv & 0x0F); txBuf11 = tmp; txState1 = 0; TX_ON(); msCounter0 = 5000; } 

Hable acerca de nuestro sniffer en ICC AVR


Luego, era necesario actuar con mucho cuidado para no quemar nada en el elevador y evitar que se detuviera.



Subimos al bot贸n de llamada. Cables amarillos gruesos: interfaz de alimentaci贸n y transmisi贸n de la placa. Blanco en el conector de 4 pines: conecta el bot贸n y su luz de fondo.


Verificamos que todo funcione como deber铆a, arreglamos las jambas y escribimos un nuevo firmware para nuestro dispositivo:


 //ICC-AVR application builder : 11.02.2015 12:25:51 // Target : M328p // Crystal: 16.000Mhz #include <macros.h> #include <iccioavr.h> #include <avrdef.h> #include "types.h" #include "gpio.h" #define TX_OFF() UCSR0B &= 0b11011111; #define TX_ON() UCSR0B |= 0b00100000; #define TX_STATE() (UCSR0B & 0b00100000) #define MAX_TIMEOUT 3000 //#define SNIFFER_MODE 1 //#define MASTER_MODE 1 // #pragma avr_fuse (fuses0, fuses1, fuses2, fuses3, fuses4, fuses5) #pragma avr_fuse (0xFF, 0xD1, 0xFC) #pragma avr_lockbits (0xFC) // AVR signature is always three bytes. Signature0 is always the Atmel // manufacturer code of 0x1E. The other two bytes are device dependent. #pragma avr_signature (0x1E, 0x95, 0x0F) // atmega32 static GPIOx errorLed, rcvLed, butUp, butDn, ledUp, ledDn, butLedUp, butLedDn, ledButUp, ledButDn; static uint8_t msFlag = 0; static uint8_t ledState = 0, buttonsState = 0; static uint16_t rcvLedLitTime = 0, butMaskCalcTime = 0, timeoutTimer = 0; typedef struct { uint16_t buffer[10]; uint8_t dataLength; } UartPacket; static UartPacket txPacket, rxPacket; #ifdef SNIFFER_MODE static uint8_t txBuffer[64], txBufferLength = 0, bufferMutex = 0; #endif static uint8_t GetPacketCRC(UartPacket* packet); static void SendLedState(void); uint8_t GetAddress(void) { return (PINC & 0x3F); } 

C贸digo C para la nueva placa basada en el microcontrolador AVR ATmega328P


La simplicidad del dispositivo y el firmware se puede estimar por la cantidad de c贸digo, contiene solo alrededor de 600 l铆neas en lenguaje C.


El proceso de compilaci贸n se ve铆a as铆:



La tarifa es diferente, pero el principio es el mismo.


No puedo adjuntar una foto del dispositivo terminado, solo creo que todav铆a se est谩 produciendo y vendiendo.


Conclusi贸n l铆rica


Con respecto a los botones del elevador "arriba" y "abajo" en el piso. Not茅 que muchas personas no entienden completamente su prop贸sito y sacuden ambos a la vez.



Desde aqui


El elevador tiene dos juegos de botones: en la cabina hay un panel de pedidos y en el piso hay un panel de llamadas. Ya puede adivinar por el nombre que el panel de pedidos tiene una mayor prioridad de control.


Todos los ascensores con paneles de llamada con botones arriba y abajo funcionan con una de las opciones para el algoritmo de optimizaci贸n de viaje, cuyo prop贸sito es transportar el n煤mero m谩ximo de pasajeros en el tiempo m铆nimo y una condici贸n separada para el tiempo de espera m谩ximo en el piso (regulado por la norma estatal).


Tal algoritmo generalmente implica la selecci贸n de pasajeros en los pisos si viajan en la misma direcci贸n que se indica presionando el bot贸n de llamada "arriba" o "abajo".


Imagine una situaci贸n en la que un ascensor con pasajeros viaja hacia abajo y recibe una llamada de "bajada" desde el piso de abajo. El elevador se detendr谩 para recoger al pasajero (s铆, todav铆a se tiene en cuenta la carga de la cabina por el sensor de peso, pero lo bajaremos).


El elevador contin煤a y recibe una llamada "arriba" desde el piso de abajo. Es l贸gico que el ascensor no se detenga para recoger a un pasajero, ya que no cambiar谩 la direcci贸n de viaje (esto tambi茅n est谩 regulado por la norma), pero recoger a un pasajero para bajar y luego subir es un desperdicio de energ铆a y espacio en el elevador.


El elevador contin煤a y recibe dos llamadas "arriba y abajo" desde el piso de abajo, que fueron presionadas por un pasajero impaciente que necesita subir. Es l贸gico que el elevador se detenga en este piso, pero el pasajero no ingresar谩, pero tomar谩 el tiempo de las personas en la cabina para reducir la velocidad y detener el elevador, abrir las puertas, esperar, cerrar las puertas y acelerar a la velocidad nominal.


Si el elevador tiene solo un bot贸n en el piso, entonces en el 99% de los casos funciona de acuerdo con el algoritmo de "descenso colectivo", y si hay 贸rdenes en la cabina, se detiene solo cuando se baja.


Si tienes habilidades de programaci贸n en JS, entonces puedes intentar implementar un algoritmo de control similar en el juego en l铆nea Elevator Saga . Tiene todos los aspectos de optimizar los viajes sin profundizar en el hardcore, como la operaci贸n de los circuitos de seguridad de los ascensores.



En mi canal de telegramas publico materiales similares. Ahora mismo puedes seguir el desarrollo del pr贸ximo dispositivo.

Source: https://habr.com/ru/post/459492/


All Articles