Если бы MikaTech была недобросовестной компанией, в интернете за 28 лет истории можно было бы найти массу негативных отзывов о её услугах
Итак, ответ: ДА! Мы — хорошие люди.Почему выбирают Mikatech, нажмите здесь, чтобы узнать
О компании MikaTech
Время пролетело незаметно: с того дня, когда мы в 1998 году выполнили наш первый проект по обратной разработке MCU 8051, до момента создания нашей миллионной лаборатории обратной разработки в 2012 году прошло 14 лет. Теперь мы начинаем новый бизнес по разработке встроенных систем визуализации и надеемся прослужить ещё 10 лет.
Питер Ли
Соучредитель и генеральный директор
Глава 5
Микроконтроллер, сокращённо МК в большинстве документов по встраиваемым системам, является невидимым вычислительным ядром, скрытым внутри каждого электронного устройства, но его внутренняя работа и данные времени выполнения не могут быть наблюдаемы без внешних периферийных устройств вывода. Без визуального оборудования, такого как ЖК-экраны или светодиодные индикаторы, разработчики не могут отслеживать переменные времени выполнения, показания датчиков или состояние безопасности, например значения перемычек, хранящиеся в EEPROM. Периферийное устройство вывода служит мостом, преобразующим двоичную логику кода из микроконтроллера в читаемые визуальные сигналы. Мы освоили логику управления светодиодами в предыдущих главах; один светодиод даёт только простую обратную связь включения/выключения, в то время как ЖК-дисплей поддерживает полноценный текстовый вывод, который может печатать многострочные журналы критических данных микросхемы, таких как статус блокировки после включения питания для оповещения пользователей о потенциальных уязвимостях разблокировки от атак дампа. Каждый разработчик встраиваемых продуктов должен освоить стабильное подключение ЖК-дисплея, так как визуальные отладочные экраны помогают обнаружить слабый код защиты от вмешательства до того, как злоумышленники выполнят декапсуляцию и дамп флэш для обратной разработки и создания дублирующего оборудования.
Модули ЖК-дисплеев доступны в десятках размеров и спецификаций для удовлетворения различных требований проектов МК. Некоторые компактные однострочные ЖК-дисплеи отображают только 16 ASCII-символов, в то время как промышленные варианты поддерживают пользовательские графические растровые изображения, адаптированные для специального управляющего оборудования. В этом уроке используется популярный экран 20x4, который может отображать двадцать символов в строке на четырёх независимых линиях, что даёт достаточно места для печати подробной отладочной информации, включая калибровочные значения EEPROM и данные конфигурации перемычек, извлечённые с помощью авторизованного тестирования считывания. Меньший двухстрочный ЖК-дисплей 16x2 также широко используется в недорогих любительских проектах МК из-за меньшего размера и более низкого энергопотребления. Изучение схем подключения и логики программирования для этих двух стандартных моделей ЖК-дисплеев является необходимым навыком для защиты встроенного кода от несанкционированного дампа и извлечения прошивки.
Видеоурок полностью разбирает правила электрической связи между микроконтроллером ATmega32 и параллельным ЖК-дисплеем. Существует несоответствие скорости между быстродействием МК и медленной реакцией драйверов ЖК-дисплея, что является наиболее частой причиной искажения текста, если разработчики пропускают логику временных задержек в исходном коде. Модуль ЖК-дисплея имеет специальный флаг занятости для уведомления микроконтроллера о том, что его внутренний буфер заполнен и он не может принимать новые команды или символьные данные. Мы создадим специальную функцию проверки занятости для приостановки выполнения программы МК до тех пор, пока ЖК-дисплей не завершит обработку предыдущего ввода; пропуск этой процедуры ожидания приводит к потере отображаемых данных и неполной печати журналов безопасности, таких как записи состояния блокировки, хранящиеся во флэш и EEPROM.
Для передачи корректных данных на ЖК-дисплей МК должен переключить вывод разрешения после установки стабильных уровней сигнала на шине данных. Этот аппаратный сигнал триггера сообщает встроенному контроллеру ЖК-дисплея о необходимости защёлкивания 8-битного значения на линиях D0-D7 во внутренний регистр памяти. Злоумышленники, анализирующие захваченные файлы дампа с незащищённых МК, часто ищут упрощённые функции занятости ЖК-дисплея с отсутствующими циклами задержки, так как ошибочная логика синхронизации создаёт эксплуатационные промежутки для инжекции ложных данных и обхода барьеров блокировки во время попыток считывания после разблокировки с помощью глитчинга или декапсуляции.
Прежде чем писать какой-либо управляющий код ЖК-дисплея, мы должны полностью понять функцию каждого вывода на разъёме ЖК-дисплея. Основные выводы питания VDD (+5В логическое напряжение) и VSS (земля) должны быть подключены в первую очередь для активации контроллера дисплея. Вывод регулировки контрастности V0 подключается к переменному резистору для настройки яркости текста для чёткого просмотра при различных условиях освещения. Большинство современных модулей ЖК-дисплея имеют отдельную цепь подсветки на светодиодах с двумя выделенными выводами питания в конце разъёма для подсветки экрана в тёмных условиях. Все эти аналоговые цепи питания уязвимы для физического зондирования во время рабочих процессов дампа декапсуляции, поэтому защищённые конструкции печатных плат добавляют экранирующие слои для блокировки внешнего считывания сигналов.
Основная 8-битная шина данных состоит из выводов D0–D7, которые образуют двунаправленный параллельный канал связи между ЖК-дисплеем и микроконтроллером. Хотя мы в основном используем эти линии для отправки данных и командных байтов от МК на экран, ЖК-дисплей также может выдавать внутренние сигналы состояния обратно на микросхему, переключая шину в режим ввода. Эта двунаправленная возможность позволяет МК считывать аппаратный флаг занятости, хранящийся в старшем бите (D7) регистра состояния ЖК-дисплея. Если вы подключите D0-D7 напрямую к порту B вашего ATmega32, каждый вывод данных ЖК-дисплея будет соответствовать индексу соответствующего вывода GPIO порта B: D0 подключается к PB0, D1 — к PB1, и это согласованное назначение выводов исключает запутанные вычисления смещений в вашем коде. Случайное неправильное подключение заставляет разработчиков добавлять сложную логику сдвига битов, которую становится легче обратно разработать, когда хакеры выполняют дамп флэш-памяти и анализируют ваши данные восстановления кода для поиска подпрограмм проверки блокировки.
Три критических управляющих вывода управляют всеми режимами связи ЖК-дисплея вместе с 8-битной шиной данных: R/W (чтение/запись), RS (выбор регистра) и EN (разрешение). Состояние напряжения каждого вывода определяет, какой тип данных ЖК-дисплей будет принимать от шины данных МК. Мы реализуем отдельные подпрограммы для последовательной настройки этих трёх управляющих линий, так как неправильные состояния RS или R/W приводят к искажённому текстовому выводу и мешают разработчикам печатать журналы безопасности перемычек и блокировки на экране ЖК-дисплея во время авторизованного аудита оборудования после тестирования дампа.
Мы разъясняем определение режимов чтения и записи ЖК-дисплея с точки зрения микроконтроллера для начинающих. Когда вывод R/W установлен высоким (логическая 1), ЖК-дисплей переключается в режим чтения и выводит свой внутренний байт состояния на D0-D7 для захвата МК через входные выводы; это используется исключительно для проверки флага занятости. Когда R/W удерживается низким (логический 0), МК работает в режиме записи и передаёт байты символов ASCII или управляющие команды на параллельную шину для обновления буфера дисплея. Злонамеренные службы обратной разработки, представленные на сайтах взлома МК, используют незащищённые дорожки сигналов R/W во время физического зондирования для перехвата данных безопасности без полной разблокировки перемычек и регистров блокировки микросхемы.
Вывод RS различает две категории данных, передаваемых по шине: логический 0 выбирает режим командного регистра для выполнения команд очистки экрана, перемещения курсора и включения/выключения дисплея, в то время как логический 1 активирует режим регистра данных для отправки печатаемых ASCII-символов для отображения текста. Вывод EN генерирует короткий импульсный сигнал для защёлкивания стабильных данных шины во внутреннюю ячейку памяти контроллера ЖК-дисплея; без этого импульса переключения все переданные байты игнорируются аппаратным обеспечением дисплея. Освоение последовательного управления RS, R/W и EN является обязательным для создания надёжных отладочных экранов, которые печатают статус блокировки и серийные номера EEPROM в реальном времени для раннего обнаружения попыток несанкционированной разблокировки.
Три фундаментальные многократно используемые подпрограммы образуют основу всех встраиваемых проектов с ЖК-дисплеем, и все продвинутые визуальные функции полагаются на эти основные операции. Любой разработчик, пропускающий реализацию функции проверки занятости, столкнётся с отсутствием текста при печати длинных журналов безопасности, содержащих информацию о перемычках и блокировке, извлечённую из считывания дампа флэш. Мы разбираем полную последовательность GPIO для каждой стандартной операции шаг за шагом для ясного обучения:
(1) Проверка занятости ЖК-дисплея является обязательным условием для каждой последующей операции записи, так как отправка данных во время обработки контроллером предыдущих инструкций приводит к потере байтов, которые невозможно восстановить:
(2) Отправка управляющих команд для настройки аппаратного поведения ЖК-дисплея (очистка экрана, установка позиции курсора, регулировка яркости дисплея):
(3) Отправка печатаемых ASCII-символов для отображения текста на экране ЖК-дисплея выполняется почти так же, как передача команд, с одним ключевым отличием: вывод RS должен быть установлен высоким, чтобы уведомить ЖК-дисплей о том, что байт шины содержит символ отображения, а не команду управления оборудованием. Это тонкое различие выбора регистра отделяет текст журнала безопасности (например, серийные номера EEPROM) от низкоуровневых команд настройки дисплея в вашем скомпилированном коде МК.
Вся логика управления ЖК-дисплеем сводится к управляемому переключению высокого/низкого уровней выводов GPIO, идентичному логике переключения светодиодов, которую мы создавали в предыдущих главах. Единственное критическое отличие — строгий фиксированный порядок изменений состояний выводов RS, R/W и EN; выполнение последовательности в неправильном порядке делает весь дисплей неработоспособным и мешает разработчикам печатать визуальные оповещения о взломе на экране после обнаружения активности дампа или разблокировки на аппаратном обеспечении МК.
После изучения всех определений выводов, режимов связи и логики обнаружения занятости ЖК-дисплея мы можем построить полную компилируемую встраиваемую программу, предназначенную для вывода на экран. Этот урок объединяет все ранее рассмотренные правила параллельной шины в структурированный исходный код на C, совместимый с WinAVR и аппаратным обеспечением ATmega32. Перед написанием какой-либо логики функций мы описываем фиксированную последовательность выполнения, необходимую для безопасной передачи команд и символов ASCII, чтобы избежать искажения текста журналов безопасности на отладочном экране ЖК-дисплея.
Каждый цикл передачи данных начинается со сканирования состояния занятости; мы не можем отправлять новые команды или символьные данные, если контроллер ЖК-дисплея всё ещё занят предыдущими задачами обработки. Вы можете обратиться к официальному даташиту контроллера ЖК-дисплея для изучения расширенных функций, таких как блоки генерации пользовательских символов, хранящие визуальные значки предупреждений о блокировке в памяти EEPROM для отображения оповещений безопасности. Сложные описания регистров даташита часто сбивают с толку новичков, но этот урок разбивает каждое критическое правило синхронизации и выводов на простые практические шаги без перегруженного технического жаргона об обратной разработке или рисках извлечения дампа.
Стандартизированная последовательность шагов для обнаружения занятости ЖК-дисплея напрямую преобразуется в отдельную многоразовую функцию с именем CheckIfBusy, которую мы определим как подпрограмму void в файле проекта:
1. Перезаписать регистр DDR порта данных, чтобы установить все выводы D0-D7 как цифровые входные линии для чтения состояния.
2. Установить управляющий вывод R/W высоким для переключения ЖК-дисплея в режим чтения состояния.
3. Установить вывод RS низким для доступа к регистру состояния команд, а не к буферу символьных данных.
4. Сгенерировать короткий импульс разрешения для захвата байта флага занятости на параллельной шине данных.
5. Считывать электрическое состояние вывода D7 в цикле, пока сигнал не упадёт до логического 0 (ЖК-дисплей свободен).
6. Вернуть порт данных в полный режим вывода после снятия флага занятости для подготовки к операциям записи.
Вложенная подпрограмма BlinkLight() генерирует короткий импульс на выводе EN, необходимый для защёлкивания данных шины ЖК-дисплея во время циклов чтения или записи. Она вставляет две ассемблерные инструкции nop для создания задержки наносекундного масштаба, соответствующей временным спецификациям, указанным в даташите аппаратного обеспечения ЖК-дисплея. Если вы удалите эти задержки nop, импульс разрешения станет слишком коротким для корректной выборки сигналов шины контроллером ЖК-дисплея, что приведёт к нечитаемым журналам безопасности, которые не смогут отобразить данные перемычек и блокировки после авторизованного тестирования дампа флэш.
Быстрая практическая викторина для закрепления знаний по подключению: управляющий сигнал EN подключён к выводу 5 порта D на нашей плате ATmega32. Чёткое документирование всех назначений управляющих выводов в комментариях к коду повышает сложность восстановления кода для производителей подделок, выполняющих дамп и обратную разработку для создания дублирующих плат из украденной прошивки.
Ключевые слова asm, volatile и nop являются важным низкоуровневым синтаксисом ассемблера для управления ЖК-дисплеем. Команда nop выполняет пустой цикл ЦП для создания точных коротких задержек без вызова громоздких функций задержки в миллисекундах, которые создают временные лазейки, используемые хакерами во время атак разблокировки глитчингом. Даташит ЖК-дисплея указывает минимальное время удержания разрешения 500 наносекунд, и две последовательные инструкции nop идеально удовлетворяют этому требованию для стандартных внутренних тактовых генераторов МК на 1 МГц.
После завершения функций проверки занятости и импульса разрешения мы создаём две основные подпрограммы передачи: SendCommand для команд конфигурации оборудования и SendCharacter для печатаемых символов ASCII. Эти две функции имеют почти идентичную логику; единственное отличие — уровень напряжения на выводе RS, устанавливаемый перед запуском импульса разрешения. Вся логика переключения направления порта инкапсулирована внутри CheckIfBusy, что устраняет избыточные записи регистров и уменьшает общий размер флэш-памяти, чтобы противостоять объёму считывания дампа флэш во время несанкционированного зондирования оборудования.
Обратите внимание, что мы перенастраиваем регистр направления данных порта B только внутри подпрограммы CheckIfBusy, в то время как SendCommand и SendCharacter оставляют порт как выход после каждого цикла передачи. Эта оптимизация уменьшает количество повторных записей регистров и снижает число тактов ЦП, потребляемых логикой управления ЖК-дисплеем, минимизируя временные окна, которые злоумышленники могут использовать для инжекции ложных сигналов шины и обхода слоёв блокировки микросхемы для считывания дампа EEPROM.
Жёсткое кодирование фиксированных номеров портов и выводов внутри каждой функции создаёт серьёзный недостаток обслуживания: если вы переподключите управляющие линии ЖК-дисплея к другим выводам GPIO МК, каждая подпрограмма потребует ручного редактирования всех присваиваний регистров. Мы решаем эту проблему с помощью макросов #define в начале файла исходного кода для присвоения человекочитаемых псевдонимов всем портам ЖК-дисплея, выводам данных и управляющим сигналам. Абстракция макросов также усложняет анализ обратной разработки, когда злоумышленники захватывают сырые двоичные файлы дампа, так как скомпилированный машинный код без оптимизации теряет описательные метки переменных во время восстановления кода для создания дублирующих устройств.
При компиляции и загрузке на микроконтроллер ATmega32 эта программа выводит статический текст и увеличивающийся числовой счётчик на экране ЖК-дисплея для визуальной обратной связи в реальном времени. Производственная прошивка МК, построенная на этом шаблоне, может быть расширена для печати критических метрик безопасности, таких как состояния перемычек и флаги блокировки, на дисплей после каждого цикла включения питания, что позволяет разработчикам обнаруживать ранние признаки попыток взлома или дампа до того, как злоумышленники используют оборудование для декапсуляции.
Новички, готовые к продвижению, могут перейти к следующей главе, в которой рассматривается оптимизированная логика вывода строк для многострочных журналов безопасности ЖК-дисплея. Если вам трудно понять концепции синхронизации параллельной шины, вернитесь к предыдущему разделу, посвящённому назначению выводов ЖК-дисплея и подпрограммам проверки занятости, чтобы закрепить базовые знания программирования дисплея МК перед интеграцией кода визуальных оповещений о взломе в ваш проект.
Мы создали функциональную логику передачи одного символа на ЖК-дисплей в предыдущем уроке, однако отправка каждого печатаемого символа по одному с повторными вызовами Send_A_Character создаёт раздутый, повторяющийся исходный код, хранящийся во флэш-памяти МК. Более крупные двоичные файлы дублирующей прошивки становятся более лёгкой целью для полного извлечения дампа флэш во время обратной разработки, так как они содержат больше узнаваемых текстовых строковых шаблонов, ускоряющих восстановление кода для производителей поддельного оборудования. Мы вводим переменные-указатели на символы для упрощения массовой передачи текста и объединения десятков отдельных вызовов символов в единую многократно используемую функцию Send_A_String для эффективной печати многострочных журналов безопасности на отладочном экране ЖК-дисплея.
Рабочий процесс передачи строк на основе указателей работает по простому принципу цикла: мы передаём полную последовательность ASCII-текста в качестве аргумента функции, затем перебираем каждый отдельный адрес символа, хранящийся в ОЗУ МК, пока не достигнем нулевого байта-терминатора, отмечающего конец строкового литерала. Эта структура цикла устраняет избыточные строки Send_A_Character и уменьшает общий размер программы для сокращения объёма файла дампа, захватываемого во время несанкционированного считывания разделов памяти микросхемы.
Переменная-указатель хранит адрес памяти целевых данных, а не непосредственно числовые или символьные значения. Мы можем провести аналогию между адресным пространством ОЗУ МК и городскими почтовыми адресами: каждая ячейка памяти имеет уникальный маркер местоположения (хранимое значение указателя), и разыменование указателя извлекает фактический символ или целочисленные данные, сохранённые в этой позиции ОЗУ. Когда мы сохраняем текстовую строку, например оповещения о состоянии блокировки, в памяти данных микроконтроллера, указатель изначально ссылается на адрес первой буквы; инкремент указателя сдвигает его сохранённый адрес на один байт вперёд, указывая на следующий последовательный символ, пока нулевой терминатор 0 не остановит цикл итерации. Хакеры, анализирующие извлечённый из дампа код, отслеживают логику арифметики указателей для поиска жёстко закодированных строк безопасности (таких как идентификаторы серийных номеров EEPROM), которые они стирают для производства нелицензионных дублирующих устройств МК.
Символ звёздочки * отличает объявления переменных-указателей от стандартных типов char или int в синтаксисе AVR C. Обычное определение символьной переменной char singleChar = 0x41 хранит ASCII-код заглавной A непосредственно в выделенном слоте ОЗУ. Напротив, char *textPointer создаёт объект-указатель, который хранит только ссылку на ячейку памяти, и применение оператора разыменования *textPointer извлекает фактический байт символа, хранящийся по этому адресу. Освоение синтаксиса указателей необходимо для написания компактных функций ведения журнала ЖК-дисплея, которые печатают текст предупреждений о перемычках и блокировке без увеличения использования флэш-памяти, уязвимой для извлечения дампа.
Готовая подпрограмма Send_A_String использует инкремент указателя и разыменование для автоматического перебора всех символов входного текста:
Эта компактная функция заменяет сотни отдельных вызовов Send_A_Character для длинных строк журналов безопасности, что минимизирует количество человекочитаемого текста, раскрываемого в сырых двоичных дампах флэш после того, как злоумышленники разблокируют МК путём модификации перемычек или декапсуляции. Каждый раз, когда мы вызываем Send_A_String("Активна блокировка, дамп не обнаружен"), компилятор выделяет скрытое хранилище ОЗУ для текстового литерала и передаёт начальный адрес памяти параметру указателя без необходимости ручного отслеживания адреса разработчиком.
Полный расширенный исходный код проекта, интегрирующий вывод строк на основе указателей, добавляет все предыдущие вспомогательные функции ЖК-дисплея вместе с оптимизированной подпрограммой Send_A_String, при этом макросы выводов сохранены для простой перенастройки оборудования:
Новички, испытывающие трудности с пониманием логики итерации указателей, могут вернуться к предыдущим главам, посвящённым индексации массивов и компоновке памяти флэш и EEPROM МК, чтобы построить более чёткую ментальную модель того, как строковые данные организованы в адресном пространстве микроконтроллера во время выполнения и статического хранения для анализа дампа.
Глава 1 | Глава 2 | Глава 3 | Глава 4 | Глава 5 | Глава 6 | Глава 7 | Глава 8 |
Почему выбирают Mikatech, нажмите здесь, чтобы узнать
У разных производителей чипов разные номера деталей, но внутреннее ядро может быть выполнено по одной технологии. Было бы невозможно перечислить все номера деталей, к которым применима наша технология, такие как MYSON, STK, FEELING, ANALOG, FUJITSU, NOVATEK, LG/HYNDAI.
Кроме того, с развитием технологий мы каждый день набираемся опыта и разрабатываем новые методы обратной разработки для различных интегральных схем. Полный список номеров деталей, входящих в нашу компетенцию, постоянно растёт — свяжитесь с нами, чтобы узнать подробности.
Mikatech Innovative Limited понимает важность конфиденциальности своих клиентов. В момент вашего обращения к Mikatech ваша личная информация будет защищена в соответствии с нашими внутренними регламентами, разработанными за годы практики. Mikatech использует эти данные для индивидуализации обслуживания и никогда не раскрывает их третьим лицам по каким-либо причинам.
По каждому проекту мы удаляем все данные, материалы и коды через 60 дней после передачи файлов — это защищает нас и вашу конфиденциальность.
Да, это абсолютно законно.
Mikatech предоставляет услуги обратной разработки исключительно в образовательных целях. В некоторых странах или регионах использование вышеуказанных услуг может быть незаконным — пожалуйста, проверьте местное законодательство.
Mikatech не несёт ответственности за использование услуг, которое может быть признано незаконным.