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 en que realizamos nuestro primer proyecto de ingeniería inversa de MCU 8051 en 1998, hasta el día en que instalamos 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

Software de desensamblado para ingeniería inversa de MCU

Nota: todos los softwares están protegidos con contraseña; después de descargar el código, envíenos un correo electrónico y Mikatech le enviará la contraseña.

 

  • Conversión BIN / HEX
  • Esta es una herramienta de conversión de formato BIN / HEX para Windows.

    No todos los códigos se pueden convertir al 100%; puede descargar la herramienta del programador Xeltek, cargar su programa BIN (o HEX) sin conectar el programador, luego guardar como programa HEX (o BIN).

    BinToHex.rar

  • Desensamblador para Microchip PIC
  • El desensamblador PIC es un software basado en Windows para controlar un programador de desarrollo para microcontroladores PIC. Para operar este software, es necesario tener conocimientos básicos de electrónica y Windows.

    Programas: 12Cxx, 16Cxxx, 16Fxx, 16F87x, 18Fxxx, 16F7x, 24Cxx, 93Cxx, 90Sxxx, 59Cxx, 89Cx051, 89S53, 250x0, PIC, AVR , 80C51 etc.

    PIC_prog.rar

  • Desensamblador para MCU con núcleo MCS-51
  • Como su nombre indica, es un desensamblador basado en Windows para códigos de MCU con núcleo MCS-51. Los códigos de MCU con núcleo MCS-51 de Atmel, Intel, SyncMos, Nuvoton/Winbond y NXP se pueden desensamblar con buenos resultados.

    MCS-51_core_MCU.rar

  • AVR Studio
  • AVR Studio es desarrollado por Atmel Corp, se utiliza para programación y depuración de MCU AVR de Atmel, también se puede usar para desensamblado. Dado que es un producto de Atmel, el código desensamblado no se puede exportar, se puede usar para complementar otros desensambladores y obtener resultados más precisos.

    La ventana de desensamblado solo está disponible durante la depuración. Cuando se usa cualquier lenguaje de alto nivel compatible, la ventana de código fuente se muestra automáticamente y la ventana de desensamblado está desactivada. Hábilitela eligiendo Debug→Windows→Disassembly o Ctrl+Alt+D durante una sesión de depuración.

    La ventana de desensamblado muestra el código de su programa desensamblado. La ejecución del programa y las instrucciones AVR se pueden seguir en esta vista. Al hacer clic derecho dentro de la ventana de desensamblado podrá establecer puntos de interrupción, ejecutar hasta la posición del cursor o ir al código fuente. No puede modificar el código fuente desde la ventana de desensamblado.

    La edición superior se puede encontrar en el sitio web de Atmel

  • http://www.atmel.com/microsite/avr_studio_5

  • http://www.atmel.no/webdoc/atmelstudio/atmelstudio.Debug.Views.Disassembly.html

    AVRstudio.rar

  • Grabador OTP de MDT
  • Desarrollado por la empresa MDT.

    En realidad, es un grabador OTP de MDT; importe su código, configure los parámetros correctos, haga clic en View >> disassemble para ver el desensamblado.

    MDTWriter.rar
  • Desensamblador de Holtek
  • Soporte de formato OTP y BIN

    Soporte de configuración de símbolos, use Symbol.ini predeterminado o sus propios símbolos DIY.

    Holtek_DeASM.rar
  • Desensamblador para microcontroladores Elan (EMC)
  • W32Dasm versión 9.0
  • En la versión 9.0B:
    - Ya no se cuelga al abrir aplicaciones empaquetadas.
    - Ya no es necesario cambiar el encabezado PE a E0000020 para poder ser desensamblado.
    - Ahora puede mostrar todas las referencias de cadena de aplicaciones VB, VC y Delphi (mejor característica).
    Lo malo es que solo está disponible en chino.
    ¡Traducidos todos los menús al inglés!
    (usando Resource tuner, crack proporcionado por UCEC & UCDV).

    W32Dasm9b.rar

 

Un desensamblador es un programa informático que traduce lenguaje máquina a lenguaje ensamblador, la operación inversa a la de un ensamblador. Un desensamblador se diferencia de un decompilador, que apunta a un lenguaje de alto nivel en lugar de a un lenguaje ensamblador. El desensamblado, la salida de un desensamblador, a menudo se formatea para facilitar la lectura humana en lugar de ser adecuado para la entrada a un ensamblador, lo que lo convierte principalmente en una herramienta de ingeniería inversa.

El código fuente en lenguaje ensamblador generalmente permite el uso de constantes y comentarios del programador. Estos generalmente se eliminan del código máquina ensamblado por el ensamblador. Si es así, un desensamblador que opere sobre el código máquina produciría un desensamblado sin esas constantes y comentarios; la salida desensamblada se vuelve más difícil de interpretar para un humano que el código fuente anotado original. Algunos desensambladores hacen uso de la información de depuración simbólica presente en archivos objeto como ELF. El Desensamblador Interactivo permite al usuario humano crear símbolos mnemotécnicos para valores o regiones de código en una sesión interactiva: la perspicacia humana aplicada al proceso de desensamblado a menudo se asemeja a la creatividad humana en el proceso de escritura de código.

El desensamblado no es una ciencia exacta: en plataformas CISC con instrucciones de ancho variable, o en presencia de código automodificable, es posible que un solo programa tenga dos o más desensamblados razonables. Determinar qué instrucciones se encontrarían realmente durante la ejecución del programa se reduce al problema de la parada, que no tiene solución demostrada.

Escribir un desensamblador que produzca código que, al ser ensamblado, produzca exactamente el binario original es posible; sin embargo, a menudo hay diferencias. Esto plantea exigencias sobre la expresividad del ensamblador. Por ejemplo, un ensamblador x86 toma una elección arbitraria entre dos códigos binarios para algo tan simple como "MOV AX,BX". Si el código original usa la otra opción, el código original simplemente no puede ser reproducido en un punto dado. Sin embargo, incluso cuando se produce un desensamblado completamente correcto, persisten problemas si el programa requiere modificación. Por ejemplo, la misma instrucción de salto en lenguaje máquina puede ser generada por código ensamblador para saltar a una ubicación especificada (por ejemplo, para ejecutar código específico), o para saltar un número específico de bytes (por ejemplo, para saltar sobre una rama no deseada). Un desensamblador no puede saber lo que se pretende y puede usar cualquiera de las dos sintaxis, generando un desensamblado que reproduce el binario original [cita requerida]. Sin embargo, si un programador desea agregar instrucciones entre la instrucción de salto y su destino, es necesario comprender el funcionamiento del programa para determinar si el salto debe ser absoluto o relativo, es decir, si su destino debe permanecer en una ubicación fija o desplazarse para saltar tanto las instrucciones originales como las agregadas.

 

Ejemplos de desensambladores

Un desensamblador puede ser autónomo o interactivo. Un desensamblador autónomo, al ejecutarse, genera un archivo de lenguaje ensamblador que se puede examinar; uno interactivo muestra el efecto de cualquier cambio que el usuario realice de inmediato. Por ejemplo, es posible que el desensamblador inicialmente no sepa que una sección del programa es realmente código y la trate como datos; si el usuario especifica que es código, el código desensamblado resultante se muestra de inmediato, lo que permite al usuario examinarlo y tomar más acciones durante la misma ejecución.
Cualquier depurador interactivo incluirá alguna forma de ver el desensamblado del programa que se está depurando. A menudo, la misma herramienta de desensamblado se empaquetará como un desensamblador autónomo distribuido junto con el depurador. Por ejemplo, objdump, parte de GNU Binutils, está relacionado con el depurador interactivo gdb.

IDA
OllyDbg es un depurador de análisis a nivel de ensamblador de 32 bits
OLIVER y SIMON incluyen desensambladores para Ensamblador, COBOL y PL/1

 

 

Decompilador

Un decompilador es un programa informático que realiza la operación inversa a la de un compilador. Es decir, traduce el código de programa en un nivel de abstracción relativamente bajo (generalmente diseñado para ser legible por computadora en lugar de por humanos) a una forma con un nivel de abstracción más alto (generalmente diseñado para ser legible por humanos). Los decompiladores generalmente no reconstruyen perfectamente el código fuente original y pueden variar ampliamente en la inteligibilidad de sus salidas. No obstante, los decompiladores siguen siendo una herramienta importante en la ingeniería inversa de software.

El término decompilador se aplica más comúnmente a un programa que traduce programas ejecutables (la salida de un compilador) a código fuente en un lenguaje de alto nivel (relativamente) que, cuando se compila, producirá un ejecutable cuyo comportamiento es el mismo que el programa ejecutable original. En comparación, un desensamblador traduce un programa ejecutable a lenguaje ensamblador (y un ensamblador podría usarse para ensamblarlo de nuevo a un programa ejecutable).
La descompilación es el acto de usar un decompilador, aunque el término también puede referirse a la salida de un decompilador. Se puede usar para la recuperación de código fuente perdido, y también es útil en algunos casos para la seguridad informática, la interoperabilidad y la corrección de errores.[1][fuente no fiable] El éxito de la descompilación depende de la cantidad de información presente en el código que se descompila y la sofisticación del análisis realizado sobre él. Los formatos de bytecode utilizados por muchas máquinas virtuales (como la Máquina Virtual Java o el Common Language Runtime de .NET Framework) a menudo incluyen metadatos extensos y características de alto nivel que hacen que la descompilación sea bastante factible. La presencia de datos de depuración puede hacer posible reproducir los nombres originales de variables y estructuras e incluso los números de línea. El lenguaje máquina sin dichos metadatos o datos de depuración es mucho más difícil de descompilar.[2]
Algunos compiladores y herramientas posteriores a la compilación producen código ofuscado (es decir, intentan producir una salida que sea muy difícil de descompilar). Esto se hace para dificultar la ingeniería inversa del ejecutable.

 

Diseño

Los decompiladores se pueden considerar compuestos por una serie de fases, cada una de las cuales contribuye con aspectos específicos del proceso general de descompilación.

 

Cargador

La primera fase de descompilación carga y analiza el formato de archivo binario del programa de entrada en código máquina o lenguaje intermedio. Debe ser capaz de descubrir datos básicos sobre el programa de entrada, como la arquitectura (Pentium, PowerPC, etc.) y el punto de entrada. En muchos casos, debería poder encontrar el equivalente de la función main de un programa en C, que es el inicio del código escrito por el usuario. Esto excluye el código de inicialización en tiempo de ejecución, que no debe descompilarse si es posible. Si están disponibles, también se cargan las tablas de símbolos y los datos de depuración. El front-end puede identificar las bibliotecas utilizadas incluso si están enlazadas con el código, lo que proporcionará interfaces de biblioteca. Si puede determinar el compilador o los compiladores utilizados, puede proporcionar información útil para identificar modismos de código.

 

Desensamblado

La siguiente fase lógica es el desensamblado de las instrucciones de código máquina en una representación intermedia (IR) independiente de la máquina. Por ejemplo, la instrucción Pentium
mov eax, [ebx+0x04]
podría traducirse a la IR
eax := m[ebx+4];

 

Modismos

Las secuencias de código máquina idiomáticas son secuencias de código cuya semántica combinada no es inmediatamente evidente a partir de la semántica individual de las instrucciones. Ya sea como parte de la fase de desensamblado o como parte de análisis posteriores, estas secuencias idiomáticas deben traducirse a una IR equivalente conocida. Por ejemplo, el código ensamblador x86:
cdq eax ; edx se establece con la extensión de signo de eax
xor eax, edx
sub eax, edx
podría traducirse a
eax := abs(eax);
Algunas secuencias idiomáticas son independientes de la máquina; algunas involucran solo una instrucción. Por ejemplo, xor eax, eax limpia el registro eax (lo establece a cero). Esto se puede implementar con una regla de simplificación independiente de la máquina, como a xor a = 0.
En general, es mejor retrasar la detección de secuencias idiomáticas si es posible, para etapas posteriores que se vean menos afectadas por el orden de las instrucciones. Por ejemplo, la fase de programación de instrucciones de un compilador puede insertar otras instrucciones en una secuencia idiomática, o cambiar el orden de las instrucciones en la secuencia. Un proceso de coincidencia de patrones en la fase de desensamblado probablemente no reconocería el patrón alterado. Las fases posteriores agrupan expresiones de instrucciones en expresiones más complejas y las modifican a una forma canónica (estandarizada), lo que hace más probable que incluso el modismo alterado coincida con un patrón de nivel superior más adelante en la descompilación.
Es particularmente importante reconocer los modismos del compilador para llamadas a subrutinas, manejo de excepciones y sentencias switch. Algunos lenguajes también tienen un amplio soporte para cadenas o enteros largos.

 

Análisis de programa

Se pueden aplicar varios análisis de programa a la IR. En particular, la propagación de expresiones combina la semántica de varias instrucciones en expresiones más complejas. Por ejemplo,
mov eax,[ebx+0x04]
add eax,[ebx+0x08]
sub [ebx+0x0C],eax

podría resultar en la siguiente IR después de la propagación de expresiones:
m[ebx+12] := m[ebx+12] - (m[ebx+4] + m[ebx+8]);

La expresión resultante se parece más a un lenguaje de alto nivel y también ha eliminado el uso del registro de máquina eax. Los análisis posteriores pueden eliminar el registro ebx.

 

Análisis de flujo de datos

Los lugares donde se definen y utilizan los contenidos de los registros deben rastrearse mediante el análisis de flujo de datos. El mismo análisis se puede aplicar a ubicaciones que se utilizan para temporales y datos locales. Luego se puede formar un nombre diferente para cada conjunto conectado de definiciones y usos de valores. Es posible que la misma ubicación de variable local se haya utilizado para más de una variable en diferentes partes del programa original. Peor aún, es posible que el análisis de flujo de datos identifique una ruta por la cual un valor pueda fluir entre dos usos, aunque en realidad nunca sucedería o importaría. Esto puede llevar, en malos casos, a la necesidad de definir una ubicación como una unión de tipos. El decompilador puede permitir al usuario romper explícitamente tales dependencias no naturales, lo que llevará a un código más claro. Esto, por supuesto, significa que se usa una variable potencialmente sin inicializar, lo que indica un problema en el programa original.

 

Análisis de tipos

Un buen decompilador de código máquina realizará un análisis de tipos. Aquí, la forma en que se utilizan los registros o las ubicaciones de memoria da lugar a restricciones sobre el tipo posible de la ubicación. Por ejemplo, una instrucción and implica que el operando es un entero; los programas no utilizan tal operación en valores de punto flotante (excepto en código de biblioteca especial) ni en punteros. Una instrucción add da lugar a tres restricciones, ya que los operandos pueden ser ambos enteros, o un entero y un puntero (con resultados enteros y de puntero respectivamente; la tercera restricción proviene del orden de los dos operandos cuando los tipos son diferentes).

Se pueden reconocer varias expresiones de alto nivel que desencadenan el reconocimiento de estructuras o arreglos. Sin embargo, es difícil distinguir muchas de las posibilidades, debido a la libertad que permiten el código máquina o incluso algunos lenguajes de alto nivel como C con conversiones y aritmética de punteros.

El ejemplo de la sección anterior podría resultar en el siguiente código de alto nivel:
struct T1 *ebx;
struct T1 {
int v0004;
int v0008;
int v000C;
};
ebx->v000C -= ebx->v0004 + ebx->v0008;

 

Estructuración

La penúltima fase de descompilación implica la estructuración de la IR en construcciones de nivel superior, como bucles while y sentencias condicionales if/then/else. Por ejemplo, el código máquina
xor eax, eax
l0002:
or ebx, ebx
jge l0003
add eax,[ebx]
mov ebx,[ebx+0x4]
jmp l0002
l0003:
mov [0x10040000],eax
podría traducirse a:
eax = 0;
while (ebx < 0) {
eax += ebx->v0000;
ebx = ebx->v0004;
}
v10040000 = eax;

El código no estructurado es más difícil de traducir a código estructurado que el código ya estructurado. Las soluciones incluyen replicar algo de código o agregar variables booleanas.

 

Generación de código

La fase final es la generación del código de alto nivel en el back-end del decompilador. Así como un compilador puede tener varios back-ends para generar código máquina para diferentes arquitecturas, un decompilador puede tener varios back-ends para generar código de alto nivel en diferentes lenguajes de alto nivel.

Justo antes de la generación de código, puede ser deseable permitir una edición interactiva de la IR, quizás usando alguna forma de interfaz gráfica de usuario. Esto permitiría al usuario ingresar comentarios y nombres de variables y funciones no genéricos. Sin embargo, estos se ingresan casi con la misma facilidad en una edición posterior a la descompilación. El usuario puede querer cambiar aspectos estructurales, como convertir un bucle while en un bucle for. Estos son menos fáciles de modificar con un editor de texto simple, aunque las herramientas de refactorización de código fuente pueden ayudar con este proceso. El usuario puede necesitar ingresar información que no se pudo identificar durante la fase de análisis de tipos, por ejemplo, modificar una expresión de memoria a una expresión de arreglo o estructura. Finalmente, es posible que sea necesario corregir la IR incorrecta o realizar cambios para que el código de salida sea más legible.

Preguntas generales sobre extracción de firmware de microcontroladores


  • ¿Es seguro enviar un pago a MikaTech?

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

    Entonces, ¡la respuesta es SÍ! Somos buena gente.

    Por qué elegir Mikatech, haga clic aquí para descubrirlo


  • ¿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 hecho con la misma tecnología, sería bastante imposible enumerar todos los números de pieza donde nuestra tecnología se puede aplicar, como MYSON, STK, FEELING, ANALOG, FUJITSU, NOVATEK, LG/HYNDAI.

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

  • ¿Se protegerá mi privacidad?

    Mikatech Innovative Limited entiende la importancia de la privacidad de sus clientes. En el momento en que contacta a Mikatech, la información personal que nos proporciona quedará bajo la protección de nuestras normas de gestión, desarrolladas a lo largo de años de práctica. Mikatech utiliza esta información para personalizar su servicio para usted; nunca divulgará esta información a terceros por ningún motivo.
    En cada proyecto que realizamos, eliminaremos todos los datos, materiales y códigos 60 días después de la entrega de los archivos; esto nos protege a nosotros y protege su privacidad.

  • ¿Es legal obtener el servicio 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; consulte sus leyes locales. Mikatech no asume ninguna responsabilidad en relación con el uso de los servicios mencionados que pueda considerarse ilegal.


    La legalidad de la ingeniería inversa de microcontroladores

    La legalidad de la ingeniería inversa de microcontroladores no es un asunto binario; depende en gran medida del contexto y difiere sustancialmente entre jurisdicciones legales. El núcleo del asunto depende de dos factores críticos: el propósito de la actividad de ingeniería inversa y el tipo de información o contenido que se extrae durante el proceso.

    El siguiente análisis detalla las consideraciones legales fundamentales que rigen la ingeniería inversa de microcontroladores en todo el mundo:

    1. Primacía del propósito previsto

    Propósitos de interoperabilidad e investigación de seguridad: La mayoría de las jurisdicciones principales, incluidos Estados Unidos y la Unión Europea, han establecido excepciones legales para la ingeniería inversa realizada para permitir la interoperabilidad con software desarrollado de forma independiente o para realizar evaluaciones y pruebas de seguridad legítimas. Tales prácticas generalmente se consideran legalmente permisibles.

    Explotación comercial y replicación infractora: La ingeniería inversa realizada para extraer, replicar y reutilizar firmware binario propietario de microcontroladores para el desarrollo, producción o venta de productos comerciales competidores es abrumadoramente ilegal. Esta conducta constituye una violación directa de las leyes de derechos de autor vigentes en la mayoría de las regiones.

    2. Riesgos de infracción de derechos de autor para software embebido

    La principal responsabilidad legal asociada con la ingeniería inversa de microcontroladores proviene del software embebido almacenado dentro del chip. Fallos judiciales en numerosos países han confirmado que el código binario en el chip califica como software informático y, por lo tanto, tiene derecho a la protección completa de derechos de autor.

    La ingeniería inversa de un microcontrolador para extraer su código binario propietario, seguida de la replicación, apropiación o distribución comercial no autorizada de ese código, constituye una infracción explícita de derechos de autor. Esta sigue siendo la violación legal fundamental en la mayoría de los casos recientes de aplicación de la ley, tanto penales como civiles, relacionados con la ingeniería inversa de chips.

    3. Marcos regulatorios legales regionales

    Estados Unidos

    La legalidad en EE. UU. está regulada por la ley federal de derechos de autor y la Ley de Derechos de Autor del Milenio Digital (DMCA). En particular, la Sección 1201 de la DMCA establece disposiciones estrictas contra la elusión, que penalizan la elusión de medidas tecnológicas de protección (como protocolos de cifrado) que restringen el acceso a obras protegidas por derechos de autor.

    Si bien la DMCA establece excepciones limitadas para la ingeniería inversa legítima, la investigación de cifrado y las pruebas de ciberseguridad, estas exenciones se definen de manera estrecha y se interpretan estrictamente. El cumplimiento legal estricto es obligatorio para cualquier actividad técnica relacionada.

    Unión Europea

    La Directiva de Software de la UE proporciona el marco regulatorio unificado para las prácticas de ingeniería inversa dentro de los estados miembros. La descompilación (una forma central de ingeniería inversa) está legalmente permitida únicamente para lograr la interoperabilidad con programas de software creados de forma independiente.

    El régimen regulatorio de la UE es altamente restrictivo: prohíbe explícitamente las actividades de ingeniería inversa de segunda etapa realizadas para todos los fines no exentos, limitando la ingeniería inversa legal a escenarios extremadamente específicos.

    China

    La posición legal de China sobre la ingeniería inversa es matizada y se ha aclarado aún más mediante interpretaciones judiciales recientes y fallos judiciales históricos. El Tribunal Popular Supremo ha reconocido formalmente la ingeniería inversa como un método técnico legítimo en sí mismo.

    Sin embargo, la legitimidad del método técnico no equivale a la inmunidad frente a responsabilidades por infracción de propiedad intelectual. Como lo ejemplifican los fallos del Tribunal Popular del Distrito de Beilun de Ningbo y múltiples casos judiciales posteriores, realizar ingeniería inversa para extraer el programa propietario central de un microcontrolador para su replicación y explotación comercial constituye un delito penal. Este principio judicial se ha mantenido consistentemente en la práctica judicial china.

    4. Secretos comerciales y restricciones contractuales

    Protección de secretos comerciales: Los parámetros de diseño central y las especificaciones de fabricación de los microcontroladores son secretos comerciales legalmente reconocibles. Si bien la ingeniería inversa de productos comerciales adquiridos legalmente se considera generalmente un medio legítimo para descubrir información de secretos comerciales, esta excepción no autoriza la replicación no autorizada de software embebido o el diseño físico del circuito del chip del microcontrolador.

    Obligaciones contractuales: Los Acuerdos de Licencia de Usuario Final (EULA) y otros términos contractuales vinculantes incluyen rutinariamente cláusulas explícitas que prohíben la ingeniería inversa. Cualquier violación de estas disposiciones contractuales puede dar lugar a responsabilidad civil por incumplimiento de contrato, independientemente de las leyes de derechos de autor o secretos comerciales.

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

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



    tiempo de hackeo de microcontrolador

    Años

    28 +
    países de hackeo de microcontroladores

    Países

    110 +
    clientes de ataque a microcontroladores

    Clientes

    5000 +
    proyectos de microcontrolador desbloqueados

    Proyectos

    60000 +