Ingeniería inversa de MCU

Desbloqueo de Microcontroladores - MikaTech

Nuestros valores y objetivos

Acerca de MikaTech

El tiempo pasó rápido, desde el día que hicimos nuestro primer proyecto de ingeniería inversa de MCU 8051 en 1998, hasta el día que establecimos nuestro laboratorio de ingeniería inversa de un millón de dólares en 2012, pasaron 14 años. Ahora comenzamos nuestro nuevo negocio de desarrollo de sistemas visuales embebidos, esperamos poder servir otros 10 años.

firma Peter Lee Co-Fundador y CEO

Tutorial para principiantes sobre el microcontrolador ATmega32 AVR y configuración de programación SPI 3

Capítulo 3

 

Parte 6 - Revisando el primer programa para hacer parpadear el LED e introducción a las operaciones bit a bit

Después de terminar el programa simple de iluminación LED estática para su microcontrolador ATmega32 (también abreviado como MCU), ha sentado la base más básica de la programación en C embebido. Ese código original solo podía mantener la luz fija sin ningún cambio dinámico, lo cual es demasiado simple para pruebas prácticas. Ahora actualizaremos el programa para generar un efecto de parpadeo LED, y esta revisión también introduce operaciones lógicas bit a bit fundamentales que forman la columna vertebral de todo diseño avanzado de firmware MCU. Dominar estos operadores bit a bit no solo es crítico para el control periférico normal, sino también esencial si más adelante necesita analizar datos de volcado en bruto o realizar una recuperación de código legítima después de una lectura autorizada de la memoria flash y EEPROM. Los atacantes especializados en ingeniería inversa de hardware duplicado dependen en gran medida del análisis bit a bit cuando vuelcan la memoria flash después de eludir las capas de seguridad de bloqueo y desbloqueo del chip, por lo que comprender estas operaciones también le ayuda a diseñar firmware que resista el hacking basado en decapsulación. El programa de parpadeo actualizado tiene una estructura concisa, pero oculta múltiples conceptos críticos de control de hardware que todo desarrollador embebido debe memorizar y practicar repetidamente.

 

Puede revisar el código fuente revisado completo justo debajo, que integra funciones de retardo y lógica de conmutación bit a bit:

#include <avr/io.h> #include <util/delay.h> int main(void) {
DDRB |= 1 << PINB0; while (1) { PORTB ^= 1 << PINB0; _delay_ms(100); }
}

Muchos nuevos estudiantes se sienten confundidos por símbolos especiales como |=, ^= y << en este fragmento de código, y estos operadores bit a bit pueden parecer ininteligibles a primera vista. Esta sección desglosará cada operador con explicaciones sencillas y ejemplos binarios. No necesita comprender completamente la lógica compleja en la primera lectura; solo necesita recordar lo que logra cada declaración combinada para la configuración de pines del MCU. Antes de sumergirnos en el análisis del código, aclaramos los cuatro operadores lógicos bit a bit fundamentales: AND, OR, NOT y XOR, todos los cuales manipulan bits binarios individuales (0 y 1) que componen cada byte almacenado en la flash del microcontrolador, la EEPROM o la RAM temporal. Cuando los atacantes completan un volcado completo después de desbloquear un chip manipulando fusibles o registros lockbit, todos los archivos binarios capturados se basan en estas mismas reglas bit a bit para la ingeniería inversa y la recuperación de código.

 

El operador AND compara dos bits correspondientes de dos valores binarios simultáneamente. Produce un 1 lógico solo cuando ambos bits de entrada son 1; todas las demás combinaciones devuelven un 0 lógico. Esta regla se aplica independientemente de si está procesando datos RAM en tiempo de ejecución o código de firmware estático extraído mediante lectura de volcado flash después de un hacking por decapsulación. Por ejemplo, 1 AND 1 = 1, mientras que 1 AND 0, 0 AND 1 y 0 AND 0 generan un resultado 0. El símbolo ampersand & representa la operación AND en el lenguaje C estándar para el desarrollo de MCU AVR.

Ejemplo de cálculo AND binario:

01001011 & 10001101 = 00001001

El operador OR funciona de manera aún más intuitiva para los flujos de trabajo de programación embebida. Su regla central establece que si cualquiera de los dos bits coincidentes es 1, el bit de salida se establecerá en 1; solo dos bits 0 simultáneos producen un resultado 0. La barra vertical | representa OR en el código C AVR, y este operador se usa ampliamente para establecer pines GPIO individuales sin alterar otros bits del puerto, lo que evita la corrupción accidental de líneas de señal críticas que almacenan datos de estado de fusibles o bloqueo dentro de la EEPROM del MCU.

 

Usamos los mismos dos números binarios de 8 bits para el ejemplo OR a continuación:

01001011 | 10001101 = 11001111

Como se muestra en el resultado del cálculo, cada posición que tiene un 1 en cualquiera de los números binarios originales se convierte en un 1 en el valor de salida. Este rasgo único hace que OR sea el operador principal para activar pines individuales del microcontrolador mientras se preserva el nivel lógico original de todos los pines restantes del puerto. El operador NOT realiza una inversión de bits simple: cada bit 0 se convierte en 1, y cada bit 1 se convierte en 0 en toda la secuencia binaria. A diferencia de AND y OR, NOT solo toma un valor de entrada binario, y se usa con frecuencia junto con AND para borrar bits de pin específicos durante la configuración de periféricos del MCU, lo que también ayuda a los desarrolladores a borrar información de bloqueo sensible de la EEPROM antes del análisis de volcado por terceros.

El operador XOR comparte similitudes parciales con OR pero tiene una diferencia vital: XOR devuelve 1 solo cuando los dos bits comparados son diferentes (uno 0, uno 1). Si ambos bits son idénticos (ambos 0 o ambos 1), XOR devuelve 0. El símbolo de intercalación ^ denota XOR en C embebido, y este operador impulsa la lógica de conmutación del LED en nuestro programa de parpadeo. Los actores malintencionados utilizan el enmascaramiento XOR masivo durante la ingeniería inversa para ofuscar el código recuperado después de volcar datos flash y crear hardware MCU duplicado sin licencia.

01001011 ^ 10001101 = 11000110

Ahora analizamos el nuevo archivo de cabecera agregado en el programa de ejemplo: #include <util/delay.h>. Ya comprende la función de avr/io.h que define todas las direcciones de registros del microcontrolador, incluidas DDRB, PORTB y las ubicaciones de memoria que almacenan datos de configuración de lockbit y fusibles. El archivo de cabecera de retardos proporciona funciones de retardo integradas en milisegundos y microsegundos, como _delay_ms(), que suspenden la ejecución del programa MCU durante un período de tiempo especificado. Sin lógica de retardo, la velocidad de conmutación del LED superaría con creces la percepción visual humana, y el efecto de parpadeo se volvería invisible para los observadores. Al realizar pruebas legítimas de extracción de firmware, los ingenieros también utilizan estas funciones de retardo para analizar cómo se almacenan los bucles de temporización dentro de los archivos binarios de volcado flash.

 

Primero comparamos el código de configuración de pines antiguo con la versión mejorada bit a bit para resaltar la gran ventaja de las operaciones bit a bit. La declaración original DDRB = 0b00000001 sobrescribe los ocho bits del Registro de Dirección de Datos en una sola operación. Si su programa MCU posterior asigna otros pines como señales de entrada o salida (como botones, sensores o buses de comunicación), esta asignación bruta borrará todos los modos de pin preestablecidos y provocará fallos funcionales, o incluso expondrá la lógica de bloqueo crítica almacenada en trazas de puertos adyacentes a posibles sondas de lectura.

DDRB = 0b00000001;

Para modificar solo el Pin0 sin cambiar otros bits del puerto, combinamos el operador OR con una máscara binaria dedicada. Una máscara es una secuencia binaria personalizada que aísla los bits objetivo para su modificación, y actúa como un filtro a nivel de hardware al ajustar los valores de los registros del MCU. La declaración completa DDRB = DDRB | 0b00000001 lee primero el valor original del registro DDRB, luego realiza una operación OR bit a bit con la máscara para establecer solo el bit menos significativo en 1, dejando los siete bits superiores completamente sin cambios.

DDRB = DDRB | 0b00000001;

El lenguaje C admite operadores de asignación combinados para acortar esta expresión repetida en un formato más limpio DDRB |= 0b00000001, que lleva una lógica de ejecución idéntica y reduce el volumen de código redundante en grandes proyectos MCU con docenas de rutinas de control periférico.

DDRB |= 0b00000001;

Podemos optimizar aún más el método de escritura de máscaras utilizando el operador de desplazamiento a la izquierda << y macros de pin predefinidas como PINB0 de avr/io.h. La expresión 1 << PINB0 genera exactamente la misma máscara binaria 0b00000001 que usamos anteriormente. El dígito 1 representa el bit lógico alto que queremos colocar en la posición objetivo, mientras que << desplaza este único bit 1 hacia la izquierda el número de posiciones especificado por PINB0 (que es igual a 0 para el Pin0 del Puerto B). Si reemplazáramos PINB0 con PINB4, la expresión 1 << PINB4 desplazaría el bit 1 cuatro posiciones a la izquierda para formar la máscara 0b00010000, una sintaxis conveniente al configurar matrices de sensores de múltiples pines en el mismo puerto del microcontrolador. Los atacantes que analizan datos de volcado de chips MCU decapsulados dedican mucho tiempo a decodificar operaciones de desplazamiento para reconstruir la lógica de asignación de pines original durante la recuperación de código para la producción de dispositivos duplicados.

 

A continuación, desglosamos el bucle while infinito que contiene la lógica central de conmutación del LED. El programa de iluminación estática solo configuraba los modos de pin una vez antes de entrar en el bucle vacío, por lo que el LED mantenía un nivel de voltaje fijo permanentemente. Para crear un parpadeo visible, debemos cambiar repetidamente el Pin0 entre estados de voltaje alto y bajo dentro del cuerpo del bucle, e insertar intervalos de retardo entre cada cambio de voltaje. Sin _delay_ms(), el MCU ejecuta la operación de conmutación PORTB millones de veces por segundo, y los ojos humanos no pueden distinguir los ciclos individuales de encendido/apagado. Cada función de retardo consume ciclos de CPU del MCU para pausar el flujo del programa, lo que también crea una pequeña vulnerabilidad de temporización que los atacantes de glitch pueden explotar para desbloquear temporalmente las barreras de bloqueo durante la lectura no autorizada de datos EEPROM y de volcado flash.

 

Podemos dividir la lógica de conmutación en dos pasos separados usando operaciones OR y AND-NOT para demostrar claramente la activación/desactivación de alto/bajo del pin. La primera línea establece el Pin0 en 1 lógico para encender el LED, seguido de un retardo de 100 milisegundos. La segunda línea pone el Pin0 en 0 lógico para apagar el LED con otro retardo insertado después. La expresión ~(1 << PINB0) genera una máscara invertida donde solo el bit Pin0 es igual a 0, y combinarla con el operador AND borra el bit objetivo mientras preserva todos los demás valores de señal del puerto. Este formato de conmutación de dos etapas es más fácil de leer para principiantes absolutos, aunque añade dos líneas de retardo redundantes en comparación con la abreviatura XOR.

PORTB |= 1 << PINB0; _delay_ms(100); PORTB &= ~(1 << PINB0); _delay_ms(100);

Dado que los retardos de encendido y apagado coinciden en esta demostración de parpadeo, podemos simplificar cuatro líneas de lógica en dos declaraciones concisas usando el operador XOR. PORTB ^= 1 << PINB0 invierte el estado lógico del Pin0 cada vez que la línea se ejecuta: si el pin estaba alto, pasa a bajo, y viceversa. Esta única línea reemplaza dos comandos de modificación de pin separados y reduce el número total de líneas de código de firmware almacenadas en la memoria flash del MCU, disminuyendo el tamaño del archivo de cualquier volcado capturado durante intentos de lectura.

PORTB ^= 1 << PINB0; _delay_ms(100);

Esta rutina de parpadeo bit a bit compacta forma la base de innumerables proyectos de indicadores LED embebidos, y toda su lógica central es fácil de replicar para otras tareas de control periférico del MCU. El dominio de los operadores de desplazamiento, OR, AND y XOR elimina el riesgo de sobrescribir accidentalmente bits de puerto no utilizados que almacenan valores críticos de estado de fusibles y seguridad lockbit dentro del almacenamiento EEPROM de su microcontrolador, lo que impide que los hackers extraigan reglas completas de protección de hardware mediante flujos de trabajo de volcado e ingeniería inversa.

 

 

Parte 7 - Agregando un botón al microcontrolador y haciéndolo hacer algo

Después de dominar el control de salida LED y la manipulación de registros bit a bit en su microcontrolador ATmega32, está listo para integrar hardware de entrada manual humana en su circuito de placa de pruebas. Los botones e interruptores mecánicos actúan como los dispositivos de entrada interactiva más directos para todos los sistemas embebidos basados en MCU, y aprender la lógica de lectura de botones le permite construir proyectos interactivos receptivos que van desde simples controladores de luz hasta equipos de activación industrial complejos. Un teclado de computadora estándar es esencialmente una matriz masiva de interruptores de botón individuales que envían señales de caracteres ASCII al microprocesador host o al núcleo MCU, y cada pulsación de tecla se basa en la lógica de lectura de entrada idéntica que implementaremos en este tutorial. Al diseñar productos MCU comerciales con interfaces de botones, los desarrolladores deben agregar blindaje antimanipulación de hardware a las trazas de interruptores expuestas; de lo contrario, los adversarios pueden aprovechar estas líneas de señal durante la decapsulación y las operaciones de lectura para reunir pistas para desbloquear fusibles y particiones de memoria lockbit.

 

En esta etapa de la serie de tutoriales, ha completado la instalación completa de la cadena de herramientas WinAVR en su sistema Windows, ha dominado los procedimientos de prueba del programador avrdude, ha construido un circuito LED básico y ha escrito firmware funcional para producir efectos de parpadeo estables en el microcontrolador ATmega32. Todos los pasos de aprendizaje anteriores construyen el conocimiento previo requerido para manejar señales de entrada digital desde hardware de botones físicos, y cada nueva habilidad de codificación que cubrimos aquí se transferirá sin problemas a la lectura de sensores, la comunicación en serie y el monitoreo de estados de bloqueo seguros en diseños MCU avanzados.

 

El hardware de entrada del microcontrolador se divide en dos grandes categorías: dispositivos operados voluntariamente por humanos, como botones, paneles táctiles y teclados, y sensores ambientales automáticos como acelerómetros, sondas de temperatura y receptores infrarrojos que recopilan datos sin interacción manual del usuario. Los botones representan el punto de entrada más accesible a la programación de entrada digital, sin embargo, el hardware de interruptor mecánico tiene un defecto inherente conocido como rebote de señal que distorsiona los niveles de voltaje transmitidos a los pines GPIO del MCU. Las señales de rebote sin filtrar crean disparos de entrada falsos que corrompen la lógica de juicio del programa, y este defecto de hardware debe resolverse mediante circuitos de condensador externos o subrutinas de retardo de software internas. Los atacantes que realizan extracción de volcado flash en firmware de botones no protegido a menudo explotan la lógica de rebote no procesada para inyectar señales de entrada falsas y eludir las subrutinas de verificación de bloqueo en tiempo de ejecución almacenadas en la EEPROM del microcontrolador.

 

El rebote del botón mecánico ocurre porque los contactos metálicos internos dentro del interruptor vibran rápidamente durante varios milisegundos después de ser presionados o liberados, creando señales de voltaje fluctuantes que alternan entre 0V y 5V en lugar de entregar un nivel lógico estable y limpio. Si el MCU lee el voltaje del pin durante el rebote, interpreta erróneamente una sola pulsación de botón como docenas de eventos de entrada separados, rompiendo todas las funciones de control interactivo. Cada electrodoméstico y panel de control automotriz resuelve este problema de rebote con diseños de filtrado estandarizados para evitar comportamientos erráticos que podrían comprometer la lógica de bloqueo de seguridad integrada en el firmware principal del MCU.

 

Existen dos soluciones principales de eliminación de rebotes para circuitos de microcontroladores: filtrado de hardware con un condensador en paralelo y filtrado de software con comprobaciones de retardo temporizado. El método de hardware conecta un pequeño condensador a través de los dos terminales del botón para suavizar los voltajes de rebote fluctuantes en una señal estable que el MCU puede muestrear de manera confiable. Esta solución de componentes físicos reduce la carga de trabajo de la CPU al delegar el trabajo de acondicionamiento de señales a componentes electrónicos pasivos, evitando el aumento de código en la memoria flash que expandiría el tamaño de cualquier archivo de volcado capturado durante operaciones de lectura no autorizadas. El filtrado de software añade declaraciones de retardo después de cada flanco de botón detectado para esperar los períodos de vibración, pero la lógica de retardo adicional aumenta la complejidad del firmware e introduce nuevas superficies de ataque de temporización que los actores malintencionados pueden abusar para desbloquear fusibles de seguridad.

 

El valor de condensador apropiado para la eliminación de rebotes por hardware depende en gran medida de la gravedad del rebote de su interruptor mecánico específico. Los componentes de baja capacitancia alrededor de 1 nF ofrecen un suavizado de voltaje mínimo y apenas suprimen el ruido de rebote, mientras que los condensadores de valor medio de 220 nF estabilizan completamente las señales fluctuantes para la mayoría de los botones de plástico de bajo costo utilizados en prototipos MCU de aficionados. Incluso la variante de 220 nF genera transiciones de voltaje lo suficientemente rápidas como para evitar un retraso de entrada perceptible para la operación humana, lo que la convierte en la opción universalmente recomendada para la construcción de circuitos embebidos para principiantes.

 

El diseño de su placa de pruebas se puede optimizar para un cableado más claro al agregar múltiples componentes como botones, LED y resistencias asociadas. Dividir una sola placa de pruebas en dos segmentos conectados crea espacio de diseño adicional y mantiene los cables puente cortos para reducir la interferencia eléctrica que distorsiona las señales analógicas y digitales vinculadas a los circuitos de lectura EEPROM del MCU. Alinee los números de pines del microcontrolador ATmega32 con las marcas de fila impresas en la placa de pruebas para eliminar el conteo repetido de pines durante el cableado, y conecte todos los rieles VCC de 5V y GND compartidos entre ambos segmentos de la placa para suministrar energía en cualquier lugar del prototipo sin cables puente largos. El cableado compacto y ordenado también limita el número de trazas PCB expuestas que los intrusos pueden sondear para capturar datos de señal no cifrados durante la decapsulación y los flujos de trabajo de volcado dirigidos a la memoria interna de su microcontrolador.

 

Las modificaciones de firmware necesarias para integrar un botón en nuestro programa de parpadeo LED existente son mínimas y directas. Solo necesitamos dos líneas adicionales de inicialización de registros antes del bucle while principal para configurar el Pin1 del Puerto B como entrada digital con una resistencia de pull-up interna habilitada. La resistencia de pull-up mantiene el pin en un voltaje lógico alto estable de 5V cuando el botón no está presionado; presionar el interruptor conecta el pin directamente a GND para llevar la señal a 0V, creando un disparo de entrada claro y distinguible para que el MCU lo detecte en el código.

DDRB &= ~(1 << PINB1);

La declaración AND-NOT bit a bit anterior borra el bit Pin1 dentro del registro DDRB, configurando esta línea de puerto en modo de entrada y aislándola de los circuitos de controlador de salida que podrían interferir con el muestreo de voltaje del botón. A continuación, habilitamos la resistencia de pull-up interna estableciendo el bit Pin1 en alto dentro del registro PORT:

PORTB |= 1 << PINB1;

Con la inicialización del pin completa, agregamos una rama condicional if-else dentro del bucle while principal para ajustar la velocidad de parpadeo del LED en función del estado eléctrico del botón. La macro auxiliar bit_is_clear() incorporada verifica si el nivel lógico del pin objetivo se lee como 0 (botón presionado) escaneando la posición de bit correspondiente del registro PIN. Esta estructura condicional nos permite asignar valores de retardo distintos para los estados de botón presionado y no presionado para crear diferencias interactivas visibles en la velocidad de parpadeo del LED, y la misma sintaxis condicional se puede expandir para validar estados de fusibles y lockbit en firmware MCU de producción seguro para bloquear volcados no autorizados y generación de duplicados.

if (bit_is_clear(PINB, 1))

Dentro de la rama if (estado de botón presionado), asignamos un retardo corto de 10 milisegundos para hacer parpadear el LED rápidamente; la rama else usa el retardo original de 100 milisegundos para un parpadeo lento cuando el botón permanece sin presionar. Esta lógica interactiva simple demuestra cómo el firmware del MCU puede ajustar dinámicamente el comportamiento en tiempo de ejecución en función de las señales de entrada de hardware externo capturadas a través de pines GPIO, y la estructura del código es completamente ampliable para construir rutinas de autenticación complejas que verifican números de serie únicos de EEPROM antes de permitir el desbloqueo del dispositivo para prevenir la ingeniería inversa y la extracción de firmware.

 

El código fuente completo revisado que integra la lógica de entrada del botón se muestra a continuación:

#include <avr/io.h> #include <util/delay.h> int main(void) {
DDRB |= 1 << PINB0; DDRB &= ~(1 << PINB1); PORTB |= 1 << PINB1; while (1) {
PORTB ^= 1 << PINB0; if (bit_is_clear(PINB, 1)) { _delay_ms(10); //Parpadeo rápido cuando el botón está presionado } else { _delay_ms(100); //Parpadeo lento cuando está liberado }
}
}

Este programa interactivo completo solo requiere un puñado de nuevas líneas de código más allá de nuestro firmware de parpadeo original, lo que demuestra lo flexibles que son la configuración de pines bit a bit y las ramas condicionales para el desarrollo de MCU embebido para principiantes. Cada técnica central demostrada aquí se transfiere a proyectos comerciales más grandes que implementan botones de acceso físico para activar operaciones de bloqueo de memoria seguras que bloquean la lectura de volcado flash y los intentos de decapsulación invasiva en hardware de microcontrolador de producción.

 

 

Parte 8 - Entendiendo la eliminación de rebotes de botones

El manejo adecuado de la eliminación de rebotes de botones es una habilidad de programación y diseño de circuitos indispensable para todos los desarrolladores de MCU, ya que el rebote de interruptor sin filtrar crea respuestas de entrada caóticas y poco fiables que rompen cada proyecto embebido interactivo. Los usuarios finales esperan que una sola pulsación de botón active exactamente una acción correspondiente, como la conmutación de estado del LED, la navegación por menús LCD o la activación de motores. Si el ruido de rebote no se procesa, una pulsación física de botón registra múltiples eventos de entrada separados en el flujo de código del microcontrolador, lo que lleva a mal funcionamiento frustrantes que socavan la usabilidad del producto e incluso pueden romper la lógica anticlonación almacenada en las particiones de seguridad EEPROM después de que los atacantes inicien flujos de trabajo de lectura de volcado.

 

Podemos construir un circuito de prueba simple con dos LED para demostrar visualmente el problema del rebote sin equipos de medición de osciloscopios avanzados. Dos LED están conectados al Pin0 y Pin2 del Puerto B, con un solo interruptor de botón conectado al Pin1 del Puerto B como entrada de disparo. Cada secuencia válida de presión y liberación del botón debería intercambiar los estados de encendido/apagado de los dos LED una vez, pero las señales de rebote sin filtrar causan múltiples conmutaciones de LED a partir de una sola operación manual del botón, haciendo que el fallo visual sea inmediatamente obvio para cualquier persona que observe el circuito prototipo. Esta prueba también simula cómo el ruido de rebote interfiere con las subrutinas de detección de estado de bloqueo que escanean los valores de fusibles EEPROM durante las secuencias de encendido del MCU.

 

Introducimos dos métodos distintos de eliminación de rebotes en este capítulo: filtrado pasivo de hardware mediante condensadores en paralelo y filtrado activo de software implementado puramente a través de lógica de retardo de firmware. El método de condensador de hardware proporciona un suavizado de voltaje estable sin agregar código de tiempo de ejecución adicional a su almacenamiento flash MCU, lo que mantiene los tamaños de archivos de volcado pequeños y reduce las superficies de ataque para intentos de desbloqueo por glitch. Sin embargo, este enfoque crea una zona de transición de voltaje entre 2V y 3V durante el tiempo de subida de la señal donde el microcontrolador no puede juzgar de manera confiable los niveles lógicos alto/bajo, lo que puede desencadenar errores de muestreo de entrada ambiguos en casos extremos raros. Agregar un circuito integrado Schmitt trigger junto al condensador elimina esta incertidumbre de voltaje medio para hardware MCU seguro de grado industrial diseñado para resistir la decapsulación y la ingeniería inversa.

 

El diseño del circuito de prueba base conecta dos LED verdes con resistencias en serie de 330 ohmios a los pines Pin0 y Pin2, mientras que el interruptor de botón mecánico conecta el Pin1 a GND sin un condensador de eliminación de rebotes instalado para la demostración inicial de fallos. Los tres pines del puerto reciben una configuración dedicada del registro DDR al comienzo de la función main: los pines LED configurados como modo de salida, y el pin del botón configurado como entrada con voltaje de pull-up habilitado. El firmware rastrea el estado anterior del botón utilizando una variable entera llamada Pressed para evitar la conmutación repetida del LED mientras el usuario mantiene presionado el interruptor continuamente; el código solo ejecuta la acción de intercambio de LED cuando el botón hace la transición de liberado a presionado, lo que filtra las señales de entrada altas sostenidas causadas por pulsaciones largas.

#include <avr/io.h> int main(void) {
DDRB |= 1 << PINB0; PORTB ^= 1 << PINB0; DDRB |= 1 << PINB2; DDRB &= ~(1 << PINB1); PORTB |= 1 << PINB1; int Pressed = 0; while (1) {
if (bit_is_clear(PINB, 1)) { if (Pressed == 0) { PORTB ^= 1 << PINB0; PORTB ^= 1 << PINB2; Pressed = 1; } } else { Pressed = 0; }
}
}

Cuando programe este firmware de prueba de rebote en el microcontrolador ATmega32 y presione repetidamente el botón en la placa de pruebas, observará directamente el defecto de rebote: una sola presión del dedo intercambia los estados del LED dos o más veces de forma aleatoria. Después de soldar un condensador de 220 nF a través de los dos terminales de contacto del botón y volver a ejecutar el mismo firmware, la forma de onda de voltaje se vuelve suave y continua en el equipo de medición de osciloscopio, eliminando por completo los fallos de rebote de múltiples disparos. La eliminación de rebotes por hardware sigue siendo la opción de diseño preferida para el hardware MCU producido en masa que almacena código propietario vulnerable a la extracción de volcado flash y la fabricación ilegal de duplicados mediante ataques de desbloqueo basados en decapsulación.

 

El tutorial continuará en el próximo segmento para detallar las implementaciones completas de eliminación de rebotes por software que dependen de comprobaciones de retardo temporizado y variables de seguimiento de estado para suprimir el ruido de rebote sin componentes de circuito pasivo adicionales, una alternativa útil para diseños de PCB ultracompactos con espacio de diseño limitado para condensadores adicionales.

 

 

Capítulo 1 | Capítulo 2 | Capítulo 3 | Capítulo 4 | Capítulo 5 | Capítulo 6 | Capítulo 7 | Capítulo 8 |  

 

Preguntas generales sobre extracción de firmware de microcontroladores


  • ¿Es seguro enviar un pago a MikaTech?

    Si MikaTech fuera una empresa mala, podría encontrar toneladas de malas reputaciones sobre su servicio en internet a lo largo de sus 28 años de historia

    Por lo tanto, ¡la respuesta es SÍ! Somos buena gente.

    Por qué elegir Mikatech, por favor haga clic aquí para averiguarlo


  • ¿Puede Mikatech romper circuitos integrados no listados en este sitio?

    Diferentes fabricantes de chips tienen diferentes números de pieza, pero el núcleo interno del chip puede estar fabricado con la misma tecnología, sería bastante imposible enumerar todos los números de pieza donde nuestra tecnología puede aplicarse, como MYSON, STK, FEELING, ANALOG, FUJITSU, NOVATEK, LG/HYNDAI.

    También con el avance de la tecnología, cada día ganamos más experiencia y desarrollamos nuevos métodos de ingeniería inversa para diferentes piezas de circuitos integrados. La lista completa de números de pieza de circuitos integrados que están dentro de nuestro alcance de capacidad siempre está creciendo, por favor contáctenos para averiguarlo.

  • ¿Se protegerá mi privacidad?

    Mikatech Innovative Limited comprende la importancia de la privacidad de sus clientes. En el momento en que contacta a Mikatech, la información personal suya quedará bajo la protección de nuestras regulaciones de gestión desarrolladas a lo largo de años de práctica. Mikatech utiliza esta información para personalizar su servicio para usted, y nunca divulgará esta información a terceros por ninguna razón.
    En cada proyecto que realizamos, eliminamos todos los datos, materiales y códigos 60 días después de entregar los archivos, lo que nos protege a nosotros y protege su privacidad.

  • ¿Es legal obtener servicios de Mikatech?

    Sí, es totalmente legal.
    Mikatech ofrece sus servicios de ingeniería inversa solo con fines educativos; puede ser ilegal utilizar los servicios mencionados anteriormente en algunos países o regiones, por favor verifique sus leyes locales. Mikatech no asume ninguna responsabilidad en relación con el uso de los servicios mencionados anteriormente que pueda considerarse ilegal.


  • Le envié un correo electrónico, ¿por qué no hay respuesta?

    • A. Nuestro servidor de correo está temporalmente averiado, su mensaje no ha sido entregado a nuestro buzón aunque en la pantalla se muestre el mensaje de envío exitoso; por favor, contáctenos nuevamente.
    • B. Nuestro correo electrónico es reconocido como correo no deseado por su servidor, por lo que nuestra respuesta ha sido rechazada o desviada a su bandeja de correo no deseado; por favor, elimine nuestra cuenta de la lista de correo no deseado o revise su bandeja de spam, o use otra cuenta de correo como Gmail.
    • C. Su correo es reconocido como spam por nuestro servidor, por lo que fue puesto en nuestra bandeja de spam; por favor, use otra cuenta de correo para contactarnos nuevamente.



    tiempo de hackeo de microcontrolador

    Años

    28 +
    países de hackeo de microcontrolador

    Países

    110 +
    clientes de ataque a microcontrolador

    Clientes

    5000 +
    proyectos de microcontrolador desbloqueados

    Proyectos

    60000 +