Обратная разработка MCU

Разблокировка микроконтроллеров — MikaTech

Наши ценности и цели

О компании MikaTech

Время пролетело незаметно: с того дня, когда мы в 1998 году выполнили наш первый проект по обратной разработке MCU 8051, до момента создания нашей миллионной лаборатории обратной разработки в 2012 году прошло 14 лет. Теперь мы начинаем новый бизнес по разработке встроенных систем визуализации и надеемся прослужить ещё 10 лет.

подпись Питер Ли Соучредитель и генеральный директор

Учебник для начинающих по микроконтроллеру ATmega32 AVR и настройке SPI, часть 6

Часть 16 – Отображение чисел на ЖК-дисплее

В предыдущих уроках мы освоили отправку фиксированных текстовых строк и отдельных символов ASCII на ЖК-экран, подключённый к нашему ATmega32. Статический жёстко заданный текст, такой как «Welcome», подходит для простых меток, но реальные встраиваемые проекты почти всегда требуют вывода динамических числовых значений, получаемых от датчиков, таймеров или счётчиков времени выполнения, хранящихся в SRAM и EEPROM. Многие новички поначалу думают, что можно заключить сырые числа в двойные кавычки и передать их напрямую в Send_A_String, однако этот трюк работает только для статических цифровых текстов, а не для переменных целых чисел или показаний с плавающей запятой, которые обновляются во время работы микроконтроллера. Изучение преобразования изменяющихся числовых переменных в печатаемые символьные последовательности является ключевым навыком встраиваемой разработки, и этот рабочий процесс также важен для отладки безопасности: мы можем выводить на ЖК-дисплей значения перемычек в реальном времени, статус блокировки и коды ошибок считывания дампа флэш для обнаружения попыток несанкционированной разблокировки до того, как злоумышленники выполнят декапсуляцию и полное извлечение прошивки для создания дублирующих устройств.

 

При отладке логики безопасности МК нам часто требуется печатать критическую числовую статистику в фиксированных координатах экрана, вместо того чтобы позволить тексту прокручиваться по всему буферу ЖК-дисплея. Если мы непрерывно обновляем показания датчика на той же строке без сброса позиции курсора, старые цифры будут накладываться на новые, создавая нечитаемый искажённый вывод. Выделенная функция позиционирования курсора полностью решает эту проблему, и мы можем повторно использовать ту же логику управления координатами для размещения предупреждающих строк, которые информируют пользователей о потенциальных рисках дампа или обратной разработки на дисплее.

 

Основное значение команды 0x80 управляет позиционированием курсора ЖК-дисплея для всех параллельных 20x4 символьных модулей. В 8-битном двоичном представлении 0x80 соответствует 0b10000000; старший бит действует как флаг, сообщающий контроллеру ЖК-дисплея, что остальные семь младших битов хранят смещение адреса памяти экрана. Семь двоичных цифр могут кодировать десятичные значения от 0 до 127, что даёт аппаратному обеспечению ЖК-дисплея 128 уникальных слотов памяти для хранения символьных данных для каждой подключённой строки дисплея. Этот стандарт отображения памяти является универсальным для всех символьных ЖК-микросхем, производимых для интеграции с микроконтроллерами.

 

Наш ЖК-дисплей с 20 столбцами и 4 строками использует только 80 из 128 доступных позиций памяти, что оставляет много неиспользуемого адресного пространства для более крупных промышленных ЖК-панелей с дополнительными строками и столбцами. Каждый совместимый символьный экран следует этому же правилу компоновки памяти на 128 слотов, поэтому код позиционирования курсора, который мы пишем для ATmega32, будет легко переноситься на другие МК без серьёзной переработки. Эта кроссплатформенная совместимость также упрощает синтаксический анализ сырых данных дампа флэш для хакеров во время восстановления кода, если вы не включили надлежащую защиту блокировки с помощью запрограммированных перемычек.

 

При вызове Send_A_Command(0x80) курсор ЖК-дисплея переходит в самый первый слот символов в верхнем левом углу экрана. Передача 0x8A в качестве команды сдвигает курсор на десять позиций вправо вдоль первой строки дисплея. Распространённая ошибка новичков заключается в непонимании того, как адресное пространство памяти переходит между строками: увеличение смещения памяти за пределы столбца 19 первой строки не автоматически перемещает курсор на вторую строку. Вместо этого компоновка памяти равномерно разделяет 128-слотовый буфер на два 64-адресных сегмента. Первый сегмент (0–63) обслуживает строки 1 и 3, в то время как второй сегмент (64–127) обслуживает строки 2 и 4. Это фиксированное разделение гарантирует согласованное поведение курсора как на маленьких двухстрочных ЖК-дисплеях 16x2, так и на больших многострочных промышленных экранах.

 

Это правило разделения памяти гарантирует единообразие логики программирования независимо от размеров ЖК-дисплея. Даже теоретический двухстрочный экран с 64 полными столбцами полностью занял бы каждый сегмент памяти без нарушения логики расчёта координат. Любители и коммерческие разработчики встраиваемых систем могут повторно использовать одинаковую математику курсора при смене дисплеев, что сокращает избыточный код, хранящийся во флэш-памяти МК, и уменьшает объём данных, захватываемых во время несанкционированных операций считывания дампа.

 

Ручное вычисление значений смещения памяти каждый раз при перемещении курсора занимает время и приводит к человеческим ошибкам. Мы можем абстрагировать всю арифметику адресов в многоразовую функцию GotoMrLCDsLocation, которая принимает простые координаты X (столбец) и Y (строка), например GotoLocation(6, 4) для размещения текста на шесть столбцов вправо на четвёртой строке дисплея. Без этой вспомогательной подпрограммы разработчикам пришлось бы вручную вычислять смещения, например 90 для шестого символа четвёртой строки, где 64 отмечает начало строк 2/4, добавляя 20 для каждой полной строки и шесть дополнительных столбцов для достижения целевой позиции.

 

Для создания этой функции позиционирования на основе координат мы сначала создаём массив, хранящий начальное смещение памяти для каждой строки дисплея на нашем 20x4 ЖК-дисплее. Каждая запись в массиве firstColumnPositionsForMrLCD содержит базовое значение адреса для строк 1, 2, 3 и 4 соответственно. Мы выбираем тип данных char, потому что все значения смещения находятся в диапазоне 0–127, поддерживаемом 8-битной знаковой символьной переменной, что минимизирует потребление ОЗУ на ресурсо-ограниченном оборудовании МК.

char firstColumnPositionsForMrLCD[4] = {0, 64, 20, 84};

Длинное имя переменной соответствует стандартным лучшим практикам встраиваемого кодирования для устранения двусмысленности и предотвращения случайных конфликтов имён переменных в многофайловых библиотечных проектах. Когда мы разделим нашу логику ЖК-дисплея на отдельные .h и .c библиотечные файлы в части 17, эта описательная метка массива позволит избежать конфликтов имён с другими глобальными переменными, обрабатывающими координаты журналов дампа EEPROM или числовые значения отслеживания блокировки.

 

Мы можем дополнительно оптимизировать определение массива с помощью макроса препроцессора #define для количества столбцов, что позволит разработчикам изменять значение один раз для соответствия разной ширине ЖК-дисплея вместо перезаписи каждого номера смещения внутри массива:

#define numberOfColumns 20; char firstColumnPositionsForMrLCD[4] = {0, 64, numberOfColumns , 64 + numberOfColumns };

Эта макрос-ориентированная конфигурация упрощает переход на другое оборудование при замене экрана 20x4 на 16x2 во время ревизий прототипа и уменьшает количество жёстко заданных числовых литералов, видимых в извлечённом из дампа коде во время анализа обратной разработки.

 

Полная функция GotoMrLCDsLocation объединяет базовое смещение строки, полученное из массива, с целевым значением столбца, а также обязательным битом флага адреса памяти 0x80, требуемым аппаратным обеспечением контроллера ЖК-дисплея:

void GotoMrLCDsLocation(uint8_t x, uint8_t y) {
Send_A_Command(0x80 + firstColumnPositionsForMrLCD[y-1] + (x-1));
}

Операции вычитания (y-1 и x-1) существуют исключительно для удобного пользовательского ввода, позволяя разработчикам ссылаться на строки и столбцы, начиная с номера один, вместо нулевых позиций памяти, соответствующих структуре массива. Если вы предпочитаете стандартную нулевую логику координат для всех операций программирования, просто удалите вычисления минус один из аргументов функции. Это небольшое изменение логики курсора создаёт различия в коде, которые повышают сложность прямого восстановления кода после того, как злоумышленники выполнят дамп флэш-памяти для клонирования дублирующей прошивки МК.

 

Далее мы рассматриваем динамическую печать числовых переменных — обязательную функцию для регистраторов данных датчиков, таймеров и панелей статуса безопасности МК, показывающих сырые десятичные значения перемычек и блокировки на ЖК-дисплее. Статические строки цифр не могут представлять изменяющиеся числовые данные, поэтому мы используем стандартные библиотечные функции преобразования itoa и dtostrf для перевода целочисленных значений и чисел с плавающей запятой в печатаемые массивы ASCII-символов, совместимые с нашей подпрограммой Send_A_String. Оба инструмента преобразования требуют включения заголовочного файла <stdlib.h> в начало каждого файла исходного кода МК. Хакеры ищут вызовы itoa и dtostrf в данных дампа для поиска логики печати метрик безопасности во время обратной разработки украденного встроенного кода.

 

Разбор параметров функций преобразования чисел:

itoa(целочисленное значение, строка для хранения чисел, основание); dtostrf(значение двойной точности, ширина, точность, строка для хранения чисел);
  • Value (Значение): Сырая целочисленная переменная или переменная с плавающей запятой, считанная из ОЗУ МК, хранилища EEPROM или значений регистров периферии, таких как счётчики таймеров и показания регистров блокировки.
  • Base (Основание): Радикс системы счисления для выходного текста: основание 2 для двоичных журналов памяти дампа, основание 10 для стандартных десятичных значений безопасности, основание 16 для шестнадцатеричных данных адресов перемычек при считывании.
  • Width (Ширина, только dtostrf): Общее количество символов, выделенных для строки числа, включая знак минус и десятичную точку, используемые при печати отрицательных значений флагов разблокировки из EEPROM.
  • Precision (Точность, только dtostrf): Определяет, сколько десятичных цифр отображается после разделителя для показаний аналоговых датчиков напряжения.
  • String buffer (Буфер строки): Массив char, зарезервированный в ОЗУ МК для хранения преобразованного текста перед передачей в Send_A_String для рендеринга на ЖК-дисплее.

 

Пример объявления базовой переменной и буфера для целочисленного преобразования:

char aNumberAsString[4]; int x = 432;

Вызовите itoa для преобразования целого числа в текстовый буфер:

itoa(x, aNumberAsString, 10);

Выведите преобразованную числовую строку в любые координаты ЖК-дисплея:

Send_A_String(aNumberAsString);

 

Полная интегрированная программа, объединяющая все ранее созданные вспомогательные функции ЖК-дисплея, позиционирование курсора и логику динамического преобразования чисел, показана ниже. Это полное демо непрерывно выводит текущие значения координат X/Y на экран 20x4 и может быть модифицировано для отображения критических данных безопасности, таких как серийные номера EEPROM после авторизованного тестирования считывания:

 

Часть 17 – Отделение кода от основной программы для формирования библиотеки

Все подпрограммы управления ЖК-дисплеем, которые мы написали до этого момента, образуют многократно используемый программный модуль, который мы можем упаковать в отдельные библиотечные файлы вместо загромождения основного исходного кода приложения. Разделение логики периферии на библиотеки даёт огромные преимущества для крупных проектов МК с десятками драйверов оборудования и антитамперных функций безопасности, проверяющих состояние блокировки и перемычек для блокировки считывания дампа флэш. Для разработки AVR существуют две стандартные структуры библиотечных файлов: однострочные библиотеки только с заголовочным файлом и раздельные библиотеки с .h заголовком и .c файлом реализации. Простые проекты на основе заголовочных файлов упрощают любительские сборки, в то время как раздельные файлы заголовков и исходников рекомендуются для промышленной прошивки со сложными слоями защиты от обратной разработки, предотвращающими клонирование оборудования после атак разблокировки декапсуляцией.

 

Критическая техническая проблема возникает при импорте одной и той же библиотеки заголовков в несколько файлов исходного кода проекта: повторное включение вызывает ошибки компилятора из-за дублирования прототипов функций и макросов. Мы решаем это с помощью стандартной логики защиты препроцессора #ifndef, которая ограничивает каждый заголовочный файл одним проходом синтаксического анализа во время компиляции. Без этих защитных условных блоков при каждом импорте библиотеки ЖК-дисплея в другой драйверный файл (например, модуль ведения журнала дампа EEPROM) компилятор выдаёт ошибки переопределения, полностью останавливающие сборку прошивки.

 

Ключевое слово #ifndef переводится как «если не определено» в синтаксисе препроцессора. В самом верху каждого .h заголовка мы добавляем уникальную метку #define, эксклюзивную для этой библиотеки; если метка уже была зарегистрирована во время предыдущего импорта файла, весь код между #ifndef и #endif пропускается компилятором. Этот механизм защиты универсально применяется в официальных заголовках инструментальной цепочки AVR, таких как avr/io.h, которые содержат определения регистров для каждой периферии МК, включая адреса памяти блокировки и перемычек, используемые во время авторизованного аудита безопасности считывания.

Выделенная функция-обёртка InitializeMrLCD объединяет всю логику инициализации ЖК-дисплея, которая ранее занимала начало main(), очищая основной файл приложения и отделяя последовательности запуска оборудования от основной логики программы, которая отслеживает флаги обнаружения разблокировки и атак дампа, хранящиеся в EEPROM.

 

При компиляции многофайловых проектов AVR через makefile-скрипты сборки вы должны добавить имя файла MrLCD.c в список переменной SRC, чтобы компилятор обрабатывал реализацию библиотеки вместе с вашим основным файлом main.c:


# List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c MrLCD.c

Только эта одна строка в makefile требуется для интеграции раздельных библиотечных файлов в ваш рабочий процесс сборки для проектов прошивки на ATmega32.

Второй метод: библиотека только с заголовочным файлом

Этот упрощённый подход встраивает каждый макрос, глобальную переменную и полную реализацию функций непосредственно в один автономный заголовочный файл MrLCD.h, устраняя необходимость в отдельном .c файле и правках makefile. Это значительно ускоряет разработку небольших любительских прототипов, но становится громоздким для крупной промышленной прошивки, содержащей десятки подпрограмм безопасности, сканирующих перемычки и блокирующих считывание дампа флэш после попыток декапсуляции.

 

Пример минимального приложения main.c, использующего библиотеку ЖК-дисплея только с заголовочным файлом:

 

Часть 18 – Использование альтернативных источников питания

Каждая схема на микроконтроллере ATmega32 требует стабильного регулируемого источника питания постоянного тока для предотвращения повреждения оборудования, сбоев во время выполнения или повреждения памяти EEPROM, хранящей критически важные конфигурации безопасности перемычек и блокировки. Для любительских и коммерческих сборок МК существуют три основных варианта питания: одноразовые/перезаряжаемые батарейные блоки, сетевые адаптеры постоянного тока и USB-порты компьютера на 5В. Допустимый диапазон входного напряжения вашего микроконтроллера и всех подключённых периферийных устройств полностью определяет, какую топологию питания вы можете безопасно реализовать. Нестабильные нерегулируемые скачки напряжения могут временно нарушить логику защиты блокировки, создавая окно для злоумышленников для выполнения считывания и дампа флэш-данных до повторной активации постоянной аппаратной блокировки при стабильном питании.

 

Каждый вариант МК указывает строгие пределы рабочего напряжения постоянного тока в своём официальном даташите, и напряжение питания напрямую влияет на максимальную стабильную тактовую частоту, на которой микросхема может работать без ошибок синхронизации. Оригинальная модель ATmega32 поддерживает только вход 4,5–5,5 В постоянного тока, оставляя минимальный допуск для нерегулируемых батарейных блоков, которые проседают по мере разряда. Её преемник ATmega324A расширяет рабочий диапазон до 1,8–5,5 В, что идеально подходит для маломощных устройств на батарейках, хранящих журналы атак дампа в EEPROM. Вариант ATmega324P сужает нижний предел до 2,7 В, сохраняя поддержку как 3,3-вольтовых маломощных датчиков, так и стандартных 5-вольтовых ЖК-периферийных устройств, используемых в наших отладочных схемах.

 

При проектировании многопериферийного оборудования МК всегда выбирайте датчики, ЖК-экраны и коммуникационные микросхемы, работающие от единого напряжения, соответствующего номинальному диапазону вашего микроконтроллера. Смешение 3,3-вольтовых аналоговых акселерометров с ATmega32, требующим минимум 4,5 В, требует двух регулируемых шин питания на вашей PCB, что добавляет дополнительные цепи, которые злоумышленники могут зондировать во время декапсуляции и физического считывания для захвата данных смешанных сигналов напряжения для обратной разработки и создания дублирующей прошивки.

 

Разбор источников питания

1. Батарейное питание

Батарейные блоки обеспечивают полную портативность без проводной сети, что делает их основным выбором питания для беспроводных устройств МК, таких как удалённые регистраторы данных и портативные управляющие гаджеты. Все типы батарей имеют номинал ёмкости в мА·ч (миллиампер-час), определяющий общую запасённую энергию, которая показывает, сколько часов элемент может питать фиксированный ток нагрузки в миллиамперах до исчерпания заряда. Батарея на 1000 мА·ч, питающая схему МК с током 100 мА, теоретически может работать десять часов подряд, пока напряжение не упадёт ниже минимального порога работоспособности микросхемы. Для долгосрочных проектов настоятельно рекомендуются перезаряжаемые литий-ионные или никель-металлгидридные элементы для снижения отходов и затрат, и они минимизируют частые циклы включения-выключения, которые рискуют повредить данные EEPROM при внезапных падениях напряжения, временно разблокирующих перемычки и допускающих частичные операции дампа.

 

Стандартные одноэлементные батареи AA, AAA, C и D выдают по 1,5 В каждая. Последовательное соединение элементов складывает их напряжения для получения требуемой шины питания: две батареи AA дают примерно 3 В, три — 4,5 В, а четыре — 6 В. Четыре батареи по 1,5 В выдают 6 В, что превышает максимальный безопасный вход ATmega32 (5,5 В) и может вывести из строя кремний микроконтроллера, если между батарейным блоком и выводом VCC МК не установлен стабилизатор напряжения для понижения избыточного напряжения до 5 В. Последовательное соединение батарей просто подключает положительный вывод одного элемента к отрицательному выводу следующего в цепочке.

 

2. Сетевые адаптеры питания

Также называемые «сетевыми блоками» из-за их громоздкого дизайна, эти адаптеры преобразуют высокое переменное напряжение сети в низковольтный постоянный ток для схем МК. Всегда проверяйте две указанные на корпусе адаптера характеристики: входное напряжение переменного тока, соответствующее вашей розетке (110–130 В переменного тока для Северной Америки), и чистое выходное напряжение постоянного тока, совместимое с вашим стабилизатором и оборудованием МК. Если ваша схема использует понижающий стабилизатор, выбирайте адаптер, сырое выходное напряжение постоянного тока которого на 1–2 В выше целевой регулируемой шины 5 В для поддержания должного запаса по напряжению для стабильной работы МК.

 

3. Питание от USB компьютера

USB-кабели обеспечивают удобный встроенный источник чистого питания 5 В постоянного тока для макетирования и временных сеансов загрузки прошивки при использовании программаторов USBTinyISP для записи кода или выполнения авторизованного тестирования считывания дампа флэш- и EEPROM-памяти МК. Внутри любого стандартного USB-кабеля красный провод несёт +5В питания, а чёрный служит опорной землёй; все остальные цветные провода предназначены для данных USB и могут быть безопасно обрезаны для чистой подачи питания. Добавление небольших входных и выходных сглаживающих конденсаторов на клеммы питания USB устраняет незначительные пульсации напряжения, которые могут создавать временные лазейки, используемые хакерами для обхода слоёв блокировки при попытках несанкционированного доступа к микросхеме.

 

Интегральные стабилизаторы напряжения

Интегральные стабилизаторы решают проблему несоответствия напряжений батарей или сетевых адаптеров, создавая фиксированную стабильную шину постоянного тока, совместимую с вашим ATmega32. Три распространённые модели стабилизаторов широко используются в любительских схемах для выходного напряжения 5 В:

Линейный стабилизатор 7805

Повсеместный линейный стабилизатор 7805 выдаёт постоянное напряжение 5 В при условии, что его входное питание поддерживает минимум 7 В (падение напряжения 2 В выше целевой шины). Для максимальной стабильности и устойчивости к пульсациям входного напряжения подавайте на 7805 8 В или выше, но никогда не превышайте 30 В на его входном выводе, чтобы избежать катастрофического пробоя внутренней микросхемы, который замкнёт питание на МК и повредит всю хранящуюся прошивку во флэш и EEPROM. Этот стабилизатор используется в миллионах потребительских электронных устройств, полагающихся на нерегулируемые сетевые адаптеры для питания ядра МК.

 

Малопадные стабилизаторы MAX603 / MAX604

MAX603 выдаёт регулируемое 5 В с чрезвычайно низким падением напряжения, что делает его идеальным для четырёх последовательных батарей AA, дающих в сумме 6 В для ATmega32. Вариант MAX604 выдаёт фиксированное 3,3 В для маломощных датчиков, не переносящих 5-вольтовые логические уровни. Обе модели имеют строгий абсолютный максимум входного напряжения 11,5 В постоянного тока; превышение этого предела расплавит внутренние кремниевые цепи и сделает стабилизатор бесполезным, что мгновенно подаст нерегулируемое высокое напряжение на ваш микроконтроллер и сотрёт данные блокировки/перемычек в EEPROM. Существуют регулируемые версии этих стабилизаторов, выдающие пользовательские уровни напряжения путём подключения точных резистивных делителей к их выводам обратной связи, как показано в сопроводительном видео.

 

Правила проектирования входных и выходных конденсаторов

Стабилизаторы напряжения создают небольшие высокочастотные пульсации на выходе постоянного тока из-за внутренних переключающих или линейных схем балансировки тока. Небольшие керамические и электролитические конденсаторы, включённые между входными и выходными клеммами стабилизатора, сглаживают эти быстрые колебания напряжения, обеспечивая чистую стабильную шину питания для вывода VCC МК. Неотфильтрованные пульсации создают нестабильные логические уровни на сигнальных дорожках GPIO, что злоумышленники могут использовать для электрического глитчинга с целью временной разблокировки барьеров блокировки микросхемы и запуска полных последовательностей считывания дампа флэш до восстановления стабильного питания и активного состояния блокировки. В видеоуроке показана полная визуальная демонстрация размещения конденсаторов на макетных платах стабилизаторов для всех трёх топологий питания, рассматриваемых в этой главе.

 

Глава 1 | Глава 2 | Глава 3 | Глава 4 | Глава 5 | Глава 6 | Глава 7 | Глава 8

Общие вопросы об извлечении прошивок микроконтроллеров


  • Безопасно ли отправлять оплату в MikaTech?

    Если бы MikaTech была недобросовестной компанией, в интернете за 28 лет истории можно было бы найти массу негативных отзывов о её услугах

    Итак, ответ: ДА! Мы — хорошие люди.

    Почему выбирают Mikatech, нажмите здесь, чтобы узнать


  • Может ли Mikatech взломать микросхемы, не указанные на этом сайте?

    У разных производителей чипов разные номера деталей, но внутреннее ядро может быть выполнено по одной технологии. Было бы невозможно перечислить все номера деталей, к которым применима наша технология, такие как MYSON, STK, FEELING, ANALOG, FUJITSU, NOVATEK, LG/HYNDAI.

    Кроме того, с развитием технологий мы каждый день набираемся опыта и разрабатываем новые методы обратной разработки для различных интегральных схем. Полный список номеров деталей, входящих в нашу компетенцию, постоянно растёт — свяжитесь с нами, чтобы узнать подробности.

  • Будет ли защищена моя конфиденциальность?

    Mikatech Innovative Limited понимает важность конфиденциальности своих клиентов. В момент вашего обращения к Mikatech ваша личная информация будет защищена в соответствии с нашими внутренними регламентами, разработанными за годы практики. Mikatech использует эти данные для индивидуализации обслуживания и никогда не раскрывает их третьим лицам по каким-либо причинам.
    По каждому проекту мы удаляем все данные, материалы и коды через 60 дней после передачи файлов — это защищает нас и вашу конфиденциальность.

  • Законно ли пользоваться услугами Mikatech?

    Да, это абсолютно законно.
    Mikatech предоставляет услуги обратной разработки исключительно в образовательных целях. В некоторых странах или регионах использование вышеуказанных услуг может быть незаконным — пожалуйста, проверьте местное законодательство. Mikatech не несёт ответственности за использование услуг, которое может быть признано незаконным.


  • Я отправил вам письмо, почему нет ответа?

    • A. Наш почтовый сервер временно вышел из строя, ваше сообщение не было доставлено в наш почтовый ящик, даже если на экране отображается сообщение об успешной отправке. Пожалуйста, свяжитесь с нами снова.
    • B. Наш email распознаётся как спам вашим почтовым сервером, поэтому наш ответ был отклонён или перенаправлен в папку спама. Пожалуйста, удалите наш адрес из списка спама или проверьте папку спама, или используйте другой email для связи, например Gmail.
    • C. Ваше письмо распознано как спам нашим почтовым сервером и помещено в папку спама. Пожалуйста, используйте другой email для связи.



    Услуги разблокировки MCU


    время взлома микроконтроллера

    Лет

    28 +
    страны взлома микроконтроллеров

    Стран

    110 +
    клиенты по атакам на микроконтроллеры

    Клиентов

    5000 +
    разблокированные проекты микроконтроллеров

    Проектов

    60000 +