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

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

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

О компании MikaTech

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

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

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

Глава 3

 

Часть 6 – Модернизация первой программы для мигания светодиодом и введение в побитовые операции

После завершения простой программы статического зажигания светодиода для вашего микроконтроллера ATmega32 (также сокращённо МК) вы заложили самую базовую основу программирования на встроенном C. Тот исходный код мог только удерживать свет постоянным без каких-либо динамических изменений, что слишком просто для практического тестирования. Теперь мы модернизируем программу для создания эффекта мигания светодиода, и это обновление также вводит основные побитовые логические операции, которые составляют основу всего продвинутого проектирования прошивок МК. Освоение этих побитовых операторов важно не только для обычного управления периферией, но и необходимо, если в дальнейшем вам потребуется анализировать сырые данные дампа или проводить легитимное восстановление кода после авторизованного считывания флэш- и EEPROM-памяти. Злоумышленники, специализирующиеся на обратной разработке дублирующего оборудования, активно полагаются на побитовый анализ при дампе флэш-памяти после обхода слоёв блокировки и разблокировки микросхемы, поэтому понимание этих операций также помогает вам разрабатывать прошивку, устойчивую к взлому на основе декапсуляции. Обновлённая мигающая программа имеет лаконичную структуру, но скрывает множество критических концепций управления аппаратурой, которые каждый разработчик встраиваемых систем должен запомнить и отработать на практике.

 

Вы можете ознакомиться с полным изменённым исходным кодом прямо ниже, который включает функции задержки и логику побитового переключения:

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

Многие новички чувствуют растерянность от специальных символов, таких как |=, ^= и << в этом фрагменте кода, и эти побитовые операторы могут показаться непонятными с первого взгляда. В этом разделе мы разберём каждый оператор с простыми объяснениями и двоичными примерами. Вам не нужно полностью понимать сложную логику с первого прочтения; вам нужно только запомнить, чего достигает каждая составная инструкция для конфигурации выводов МК. Прежде чем углубиться в анализ кода, мы сначала разъясним четыре основных побитовых логических оператора: И, ИЛИ, НЕ и ИСКЛЮЧАЮЩЕЕ ИЛИ, все из которых манипулируют отдельными двоичными битами (0 и 1), составляющими каждый байт, хранящийся во флэш-памяти микроконтроллера, EEPROM или временной ОЗУ. Когда злоумышленники выполняют полный дамп после разблокировки микросхемы путём модификации перемычек или регистров блокировки, все захваченные двоичные файлы дампа используют те же побитовые правила для обратной разработки и восстановления кода.

 

Оператор И сравнивает два соответствующих бита из двух двоичных значений одновременно. Он выдаёт логическую 1 только тогда, когда оба входных бита равны 1; все остальные комбинации дают логический 0. Это правило действует независимо от того, обрабатываете ли вы данные ОЗУ во время выполнения или статический код прошивки, извлечённый с помощью считывания дампа флэш после декапсуляции. Например, 1 И 1 = 1, в то время как 1 И 0, 0 И 1 и 0 И 0 дают 0. Символ амперсанда & обозначает операцию И в стандартном языке C для разработки AVR.

Пример двоичного вычисления И:

01001011 & 10001101 = 00001001

Оператор ИЛИ работает ещё более интуитивно для рабочих процессов встроенного программирования. Его основное правило гласит: если любой из двух соответствующих битов равен 1, выходной бит будет установлен в 1; только два одновременных нулевых бита дают 0. Вертикальная черта | обозначает ИЛИ в AVR C, и этот оператор широко используется для установки отдельных выводов GPIO без изменения других битов порта, что предотвращает случайное повреждение критических сигнальных линий, хранящих данные о состоянии перемычек или блокировки внутри EEPROM МК.

 

Мы используем те же два 8-битных двоичных числа для примера ИЛИ ниже:

01001011 | 10001101 = 11001111

Как показано в результате вычисления, каждая позиция, несущая 1 в любом из исходных двоичных чисел, становится 1 в выходном значении. Это уникальное свойство делает ИЛИ основным оператором для активации отдельных выводов микроконтроллера при сохранении исходного логического уровня всех остальных выводов порта. Оператор НЕ выполняет простое инвертирование битов: каждый 0 становится 1, а каждый 1 становится 0 во всей двоичной последовательности. В отличие от И и ИЛИ, НЕ принимает только одно двоичное входное значение и часто используется в паре с И для очистки определённых битов выводов при настройке периферии МК, что также помогает разработчикам стирать конфиденциальную информацию о блокировке из EEPROM перед анализом дампа третьими сторонами.

Оператор ИСКЛЮЧАЮЩЕЕ ИЛИ имеет частичное сходство с ИЛИ, но с одним важным отличием: ИСКЛЮЧАЮЩЕЕ ИЛИ даёт 1 только тогда, когда два сравниваемых бита различны (один 0, один 1). Если оба бита одинаковы (оба 0 или оба 1), ИСКЛЮЧАЮЩЕЕ ИЛИ выдаёт 0. Символ крышки ^ обозначает ИСКЛЮЧАЮЩЕЕ ИЛИ во встроенном C, и этот оператор обеспечивает логику переключения светодиода в нашей мигающей программе. Злоумышленники используют массовое маскирование XOR во время обратной разработки для обфускации восстановленного кода после дампа флэш-данных и создания нелицензионных дублирующих устройств.

01001011 ^ 10001101 = 11000110

Теперь мы анализируем новый заголовочный файл в примере программы: #include <util/delay.h>. Вы уже понимаете функцию avr/io.h, который определяет все адреса регистров микроконтроллера, включая DDRB, PORTB и ячейки памяти, хранящие данные о конфигурации блокировки и перемычек. Заголовочный файл задержек предоставляет встроенные функции задержки в миллисекундах и микросекундах, такие как _delay_ms(), которые приостанавливают выполнение программы МК на указанный период времени. Без логики задержки скорость переключения светодиода намного превысила бы возможности человеческого восприятия, и эффект мигания стал бы невидимым. При проведении легитимного тестирования извлечения прошивки инженеры также используют эти функции задержки для анализа того, как временные циклы хранятся внутри двоичных файлов дампа флэш.

 

Мы сначала сравниваем старый код конфигурации выводов с улучшенной побитовой версией, чтобы подчеркнуть огромное преимущество побитовых операций. Исходный оператор DDRB = 0b00000001 перезаписывает все восемь бит регистра направления данных одной операцией. Если ваша последующая программа МК назначает другие выводы как входы или выходы (например, кнопки, датчики или шины связи), это грубое присваивание сотрёт все предварительно установленные режимы выводов и вызовет функциональные сбои или даже раскроет критическую логику блокировки, хранящуюся на соседних дорожках порта, для потенциального считывания.

DDRB = 0b00000001;

Чтобы изменить только вывод Pin0 без изменения других битов порта, мы комбинируем оператор ИЛИ со специальной двоичной маской. Маска — это пользовательская двоичная последовательность, которая изолирует целевые биты для модификации и действует как простой аппаратный фильтр при настройке значений регистров МК. Полный оператор DDRB = DDRB | 0b00000001 сначала считывает исходное значение регистра DDRB, затем выполняет побитовую операцию ИЛИ с маской, чтобы установить только младший бит в 1, оставляя все семь старших битов неизменными.

DDRB = DDRB | 0b00000001;

Язык C поддерживает составные операторы присваивания для сокращения этого повторяющегося выражения до более чистого формата DDRB |= 0b00000001, который имеет идентичную логику выполнения и уменьшает избыточный объём кода в больших проектах МК с десятками подпрограмм управления периферией.

DDRB |= 0b00000001;

Мы можем дополнительно оптимизировать метод записи маски, используя оператор сдвига влево << и предопределённые макросы выводов, такие как PINB0 из avr/io.h. Выражение 1 << PINB0 генерирует ту же самую двоичную маску 0b00000001, которую мы использовали ранее. Цифра 1 представляет логический высокий бит, который мы хотим разместить в целевой позиции, а << сдвигает этот одиночный бит 1 влево на количество позиций, указанное PINB0 (которое равно 0 для вывода B Pin0). Если бы мы заменили PINB0 на PINB4, выражение 1 << PINB4 сдвинуло бы бит 1 на четыре позиции влево, образуя маску 0b00010, что удобно при настройке многопиновых сенсорных массивов на одном порту микроконтроллера. Злоумышленники, анализирующие данные дампа с декапсулированных микросхем МК, тратят много времени на декодирование операций сдвига для реконструкции исходной логики назначения выводов при восстановлении кода для создания дублирующих устройств.

 

Далее мы разбираем бесконечный цикл while, содержащий основную логику переключения светодиода. Статическая программа освещения только один раз настраивала режимы выводов перед входом в пустой цикл, поэтому светодиод удерживал фиксированное напряжение постоянно. Чтобы создать видимое мигание, мы должны многократно переключать вывод Pin0 между высоким и низким состояниями внутри тела цикла и вставлять интервалы задержки между каждым переключением. Без _delay_ms() МК выполняет операцию переключения PORTB миллионы раз в секунду, и человеческий глаз не может различить отдельные циклы включения/выключения. Каждая функция задержки потребляет такты ЦП МК для приостановки потока программы, что также создаёт небольшую временную уязвимость, которую злоумышленники могут использовать для временной разблокировки барьеров блокировки во время несанкционированного считывания EEPROM и дампа флэш-данных.

 

Мы можем разделить логику переключения на два отдельных шага, используя операции ИЛИ и И-НЕ, чтобы наглядно продемонстрировать переключение высокого/низкого уровня. Первая строка устанавливает вывод Pin0 в логическую 1 для включения светодиода, после чего следует задержка 100 миллисекунд. Вторая строка очищает вывод Pin0 до логического 0 для выключения светодиода с последующей задержкой. Выражение ~(1 << PINB0) генерирует инвертированную маску, в которой только бит Pin0 равен 0, и его комбинация с оператором И очищает целевой бит, сохраняя при этом все другие значения сигналов порта. Этот двухэтапный формат переключения легче читается абсолютными новичками, хотя он добавляет две избыточные строки задержки по сравнению с сокращённой записью XOR.

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

Поскольку длительности задержек включения и выключения совпадают в этом демо, мы можем упростить четыре строки логики до двух лаконичных операторов с помощью оператора XOR. PORTB ^= 1 << PINB0 переключает логическое состояние вывода Pin0 каждый раз при выполнении строки: если вывод был высоким, он становится низким, и наоборот. Эта единственная строка заменяет две отдельные команды модификации вывода и уменьшает общее количество строк кода прошивки, хранящейся во флэш-памяти МК, снижая размер любого файла дампа, захваченного во время попыток считывания.

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

Эта компактная мигающая процедура на основе побитовых операций лежит в основе бесчисленных проектов индикаторных светодиодов, и вся её основная логика легко воспроизводится для других задач управления периферией МК. Освоение операторов сдвига, ИЛИ, И и XOR устраняет риск случайной перезаписи неиспользуемых битов порта, хранящих критическое состояние перемычек и значения безопасности блокировки внутри EEPROM вашего микроконтроллера, что предотвращает извлечение хакерами полных правил аппаратной защиты через дамп и обратную разработку.

 

 

Часть 7 – Добавление кнопки к микроконтроллеру и выполнение действия

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

 

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

 

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

 

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

 

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

 

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

 

Компоновку макетной платы можно оптимизировать для более чистой проводки при добавлении нескольких компонентов, таких как кнопки, светодиоды и соответствующие резисторы. Разделение одной макетной платы на два соединённых сегмента создаёт дополнительное пространство для компоновки и удерживает перемычки короткими, чтобы уменьшить электрические помехи, искажающие аналоговые и цифровые сигналы, связанные с цепями считывания EEPROM МК. Выровняйте номера выводов микроконтроллера ATmega32 по печатным маркерам строк на макетной плате, чтобы исключить повторный подсчёт выводов во время соединений, и соедините все общие шины 5В VCC и GND между обоими сегментами платы, чтобы подавать питание в любую точку прототипа без длинных перемычек. Аккуратная компактная проводка также ограничивает количество открытых дорожек PCB, которые злоумышленники могут зондировать для захвата незашифрованных данных сигналов во время декапсуляции и рабочих процессов дампа, нацеленных на внутреннюю память вашего микроконтроллера.

 

Модификации прошивки, необходимые для интеграции кнопки в существующую программу мигания светодиодом, минимальны и просты. Нам нужно только добавить две строки инициализации регистров перед основным бесконечным циклом, чтобы настроить вывод Port B Pin1 как цифровой вход с включённым внутренним подтягивающим резистором. Подтягивающий резистор удерживает вывод на стабильном высоком логическом уровне 5В, когда кнопка не нажата; нажатие переключателя подключает вывод непосредственно к GND, опуская сигнал до 0В, создавая чёткий различимый входной триггер для обнаружения МК в коде.

DDRB &= ~(1 << PINB1);

Приведённый выше побитовый оператор И-НЕ очищает бит Pin1 внутри регистра DDRB, устанавливая эту линию порта в режим ввода и изолируя её от выходных драйверных цепей, которые могли бы мешать выборке напряжения кнопки. Затем мы включаем встроенный подтягивающий резистор, устанавливая бит Pin1 в высокий уровень внутри регистра PORT:

PORTB |= 1 << PINB1;

После завершения инициализации вывода мы добавляем условную ветвь if-else внутри основного цикла while для регулировки скорости мигания светодиода в зависимости от электрического состояния кнопки. Встроенный макрос bit_is_clear() проверяет, читается ли логический уровень целевого вывода как 0 (кнопка нажата), сканируя соответствующую битовую позицию регистра PIN. Эта условная структура позволяет нам назначать разные значения задержки для нажатого и ненажатого состояний кнопки, создавая видимые интерактивные различия в частоте мигания светодиода, и тот же условный синтаксис может быть расширен для проверки состояний перемычек и блокировки в защищённой производственной прошивке МК для блокировки несанкционированного дампа и создания дубликатов.

if (bit_is_clear(PINB, 1))

Внутри ветви if (состояние нажатой кнопки) мы устанавливаем короткую задержку 10 миллисекунд, чтобы светодиод мигал быстро; ветвь else использует исходную задержку 100 миллисекунд для медленного мигания, когда кнопка не нажата. Эта простая интерактивная логика демонстрирует, как прошивка МК может динамически изменять поведение во время выполнения на основе внешних входных сигналов, захваченных через выводы GPIO, и структура кода полностью расширяема для создания сложных подпрограмм аутентификации, проверяющих уникальные серийные номера EEPROM перед разрешением разблокировки устройства для предотвращения обратной разработки и извлечения прошивки.

 

Полный изменённый исходный код с интегрированной логикой кнопки показан ниже:

#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); //Быстрое мигание при нажатии кнопки } else { _delay_ms(100); //Медленное мигание при отпускании }
}
}

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

 

 

Часть 8 – Понимание подавления дребезга кнопок

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

 

Мы можем построить простую тестовую схему с двумя светодиодами для визуальной демонстрации проблемы дребезга без продвинутого осциллографического оборудования. Два светодиода подключаются к выводам Port B Pin0 и Port B Pin2, а кнопочный переключатель подключается к выводу Port B Pin1 в качестве входного триггера. Каждая действительная последовательность нажатия и отпускания кнопки должна один раз поменять состояния включения/выключения двух светодиодов, но неотфильтрованные сигналы дребезга вызывают множество переключений светодиодов от одной операции нажатия, что делает визуальный сбой немедленно заметным для любого, кто наблюдает за прототипом. Этот тест также имитирует, как шум дребезга мешает подпрограммам обнаружения состояния блокировки, сканирующим значения перемычек EEPROM во время последовательностей включения питания МК.

 

В этой главе мы представляем два различных метода подавления дребезга: пассивную аппаратную фильтрацию с использованием параллельных конденсаторов и активную программную фильтрацию, реализованную исключительно через логику задержек прошивки. Аппаратный конденсаторный метод обеспечивает стабильное сглаживание напряжения без добавления дополнительного кода времени выполнения в хранилище флэш МК, что сохраняет небольшие размеры файлов дампа и сокращает поверхности атак для попыток разблокировки глитчингом. Однако этот подход создаёт переходную зону напряжения между 2В и 3В во время времени нарастания сигнала, где микроконтроллер не может надёжно определить высокий/низкий логический уровень, что может привести к редким ошибкам выборки входа. Добавление микросхемы триггера Шмитта вместе с конденсатором устраняет эту неопределённость среднего напряжения для промышленного защищённого оборудования МК, предназначенного для сопротивления декапсуляции и обратной разработке.

 

Базовая компоновка тестовой схемы подключает два зелёных светодиода с последовательными резисторами 330 Ом к выводам Pin0 и Pin2, в то время как кнопочный переключатель соединяет вывод Pin1 с GND без установленного конденсатора подавления дребезга для начальной демонстрации сбоев. Все три вывода порта получают выделенную конфигурацию регистра DDR в начале функции main: выводы светодиодов устанавливаются в режим вывода, а вывод кнопки настраивается как вход с включённым подтягивающим напряжением. Прошивка отслеживает предыдущее состояние кнопки с помощью целочисленной переменной Pressed, чтобы избежать повторного переключения светодиодов, пока пользователь удерживает переключатель непрерывно; код выполняет действие переключения светодиодов только при переходе кнопки из отпущенного состояния в нажатое, что отфильтровывает постоянные высокие входные сигналы, вызванные длительными нажатиями.

#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; }
}
}

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

 

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

 

 

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

 

 

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


  • Безопасно ли отправлять оплату в 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 +