Elektrikoff09.ru

Журнал "Электросети"
24 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Вытаскиваем ПО из запароленного микроконтроллера Renesas M16C

Вытаскиваем ПО из запароленного микроконтроллера Renesas M16C

Есть у меня знакомый, который занимается ремонтом автомобильного железа. Он как-то принес мне микроконтроллер, выпаянный из блока управления автономного отопителя. Сказал, что его программатор это не берет, а ему хотелось бы иметь возможность переливать прошивки туда-сюда, т.к. блоков много, в железе они часто одинаковые, а вот агрегаты, которыми они управляют отличаются. И вроде и блок есть взамен неисправного, но ПО разное и заменить просто так нельзя. Так как задачка была интересной, решил покопаться. Если тема интересна и вам, прошу под кат.

Подопытным оказался M306N5FCTFP. Это микроконтроллер группы M16C/6N5. Ядро M16C/60 разработано Mitsubishi, а т.к. преемником этой компании по части МК с 2003 года является Renesas, то сейчас эти микроконтроллеры известны именно под этим брендом.

Немного о самом микроконтроллере

Камешек представляет собой 16-разрядный микроконтроллер в 100-выводном QFP корпусе. Ядро имеет 1 МБайт адресного пространства, тактовая частота 20МГц для автомобильного исполнения. Набор периферии так же весьма обширный: два 16-разрядных таймера и возможность генерации 3-фазного ШИМ для управления моторами, всякие UART, SPI, I2C естественно, 2 канала DMA, имеется встроенный CAN2.0B контроллер, а также PLL. На мой взгляд очень неплохо для старичка. Вот обзорная схемка из документации:

Так как моя задача выдрать ПО, то так же весьма интересует память. Данный МК выпускался в двух вариантах: масочном и Flash. Ко мне попал, как выше уже упоминалось, M306N5FCTFP. Про него в описании сказано следующее:

  • Flash memory version
  • 128 KBytes + 4K (дополнительные 4K — так называемый блок А в подарок пользователю для хранения данных, но может хранить и программу)
  • V-ver. (автомобильное исполнение с диапазоном +125°C)

Как вытащить из устройства то, что разработчики втащили

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

Как видно из картинки выше, память разбита на 2 части: пользовательская область, и область загрузчика. Во второй как раз с завода залит загрузчик по умолчанию, который умеет писать, читать, стирать пользовательскую память и общается через асинхронный, синхронный, либо CAN-интерфейс. Указано, что он может быть переписан на свой, а может быть и не переписан. В конце концов это легко проверяется попыткой постучаться к стандартному загрузчику хотя-бы через UART… Забегая вперед: производитель отопителя не стал заморачиваться своим загрузчиком, поэтом копать дальше можно в этом направлении. Сразу оговорюсь, что есть еще способ параллельного программирования, но т.к. программатора для этого у меня не было, я не рассматривал этот вариант.

Вход в режим работы загрузчика обеспечивается определенной комбинацией на входах CNVSS, P5_0, P5_5 во время аппаратного сброса. Дальше либо написать свою утилиту для копирования содержимого памяти, либо использовать готовую. Renesas предоставляет свою утилиту, которая называется «M16C Flash Starter», но функция чтения у нее урезана. Она не сохраняет прочитанное на диск, а сравнивает его с файлом с диска. Т.е. по сути это не чтение, а верификация. Однако есть немецкая свободная утилитка с названием M16C-Flasher, которая вычитывать прошивку умеет. В общем начальный инструментарий подобрался.

О защите от считывания

Все бы было совсем просто, если бы в загрузчике не была предусмотрена защита от несанкционированного доступа. Я просто приведу очень вольный перевод из мануала.

Читайте так же:
Что такое выключатели с реостатом

Функция проверки идентификатора

Используется в последовательном и CAN режимах обмена. Идентификатор, переданный программатором, сравнивается с идентификатором, записанным во flash памяти. Если идентификаторы не совпадают, команды, отправляемые программатором, не принимаются. Однако, если 4 байта вектора сброса равны FFFFFFFFh, идентификаторы не сравниваются, позволяя всем командам выполняться. Идентификатор — это 7 байт, сохраненных последовательно, начиная с первого байта, по адресам 0FFFDFh, 0FFFE3h, 0FFFEBh, 0FFFEFh, 0FFFF3h, 0FFFF7h, и 0FFFFBh.

Таким образом, чтобы получить доступ к программе, нужно знать заветные 7 байт. Опять же, забегая вперед, я подключился к МК, используя тот же «M16C Flash Starter» и убедился, что комбинации из нулей и FF не проходят и этот вопрос придется как то решать. Здесь сразу же всплыла мысль с атакой по сторонним каналам. Уже начал прикидывать в голове платку, позволяющую измерять ток в цепи питания, но решил, что интернет большой и большинство велосипедов уже изобретено. Вбив несколько поисковых запросов, довольно быстро нашел на hackaday.io проект Serge ‘q3k’ Bazanski, с названием «Reverse engineering Toshiba R100 BIOS». И в рамках этого проекта автор решал по сути точно такую же задачу: добыча встроенного ПО из МК M306K9FCLR. Более того — на тот момент задача им была уже успешно решена. С одной стороны я немного расстроился — интересная загадка разгадана не мной. С другой — задача превратилась из поиска уязвимости, в ее эксплуатацию, что обещало гораздо более скорое решение.

В двух словах, q3k точно по такой же логике начал изучение с анализа потребляемого тока, в этом плане он был в гораздо более выгодных условиях, т.к. у него был ChipWhisperer, этой штукой я до сих пор не обзавелся. Но т.к. его первый зонд для снятия тока потребления оказался неподходящим и вычленить из шумов что-то полезное у него не получилось, он решил попробовать простенькую атаку на время отклика. Дело в том, что загрузчик во время выполнения команды дергает вывод BUSY, чтобы проинформировать хост о том, занят он, или готов выполнять следующую команду. Вот, по предположению q3k, замер времени от передачи последнего бита идентификатора до снятия флага занятости мог послужить источником информации при переборе. При проверке этого предположения перебором первого байта ключа действительно было обнаружено отклонение по времени только в одном случае — когда первый байт был равен FFh. Для удобства измерения времени автор даже замедлил МК, отключив кварцевый резонатор и подав на тактовый вход меандр 666кГц, для упрощения процедуры измерений. После чего идентификатор был успешно подобран и ПО было извлечено.

Первый блин — граблями

Ха! Подумал я… Сейчас я быстренько наклепаю программку к имевшейся у меня STM32VLDiscovery c STM32F100 на борту, которая будет отправлять код и измерять время отклика, а в терминал выплевывать результаты измерений. Т.к. макетная плата с целевым контроллером до этого подключалась к ПК через переходник USB-UART, то, дабы ничего не менять на макетке, работать будем в асинхронном режиме.

Когда при старте загрузчика вход CLK1 притянут к земле, он понимает, что от него хотят асинхронного общения. Собственно потому я его и использовал — подтяжка была уже припаяна и я просто соединил проводами две платы: Discovery и макетку с целевым M306.

Читайте так же:
Сенсорный выключатель диммер схема

Заметка по согласованию уровней:

Т.к. M16 имеет TTL-уровни на выводах, а STM32 — LVTTL (упрощенно, в даташите подробнее), то необходимо согласование уровней. Т.к. это не устройство, которое, как известная батарейка, должно работать, работать и работать, а по сути подключается разок на столе, то с трансляторами уровней я не заморачивался: выходные уровни от STM32 пятивольтовый МК переварил, в смысле 3 вольта как «1» воспринимает, выходы от М16 подаем на 5V tolerant входы STM32 дабы ему не поплохело, а ногу, которая дергает RESET M16 не забываем перевести в режим выхода с открытым стоком. Я вот забыл, и это еще +2ч в копилку упущенного времени.
Этого минимума достаточно, чтобы железки друг друга поняли.

Логика атакующего ПО следующая:

  1. Устанавливаем соединение с контроллером. Для этого необходимо дождаться, пока завершится сброс, затем передать 16 нулевых символов с интервалом более, чем 20 мс. Это для того, чтобы отработал алгоритм автоопределения скорости обмена, т.к. интерфейс асинхронный, а МК о своей частоте ничего не знает. Стартовая скорость передатчика должна быть 9600 бод, именно на эту скорость рассчитывает загрузчик. После этого при желании можно запросить другую скорость обмена из пяти доступных в диапазоне 9600-115200 (правда в моем случае на 115200 загрузчик работать отказался). Мне скорость менять не нужно, поэтому я для контроля синхронизации просто запрашивал версию загрузчика. Передаем FBh, загрузчик отвечает строкой вроде «VER.1.01».
  2. Отправляем команду «unlock», которая содержит текущую итерацию ключа, и замеряем время до снятия флага занятости.

    Команда состоит из кода F5h, трех байт адреса, где начинается область идентификатора (в моем случае, для ядра M16C, это 0FFFDFh), длина (07h), и сам идентификатор.
  3. Измеряем время между передачей последнего бита идентификатора и снятием флага занятости.
  4. Увеличиваем перебираемый байт ключа (KEY1 на начальном этапе), возвращаемся к шагу 2 до тех пор, пока не переберем все 255 значений текущего байта.
  5. Сбрасываем статистику на терминал (ну или выполняем анализ «на борту»).

В итоге, для всех значений результаты были идентичны. Полностью идентичны. Тактовая частота таймера у меня была 24Мгц, соответственно разрешение по времени — 41,6 нс. Ну ок, попробовал замедлить целевой МК. Ничего не поменялось. Здесь в голове родился вопрос: что я делаю не так, как это делал q3k? После сравнения разница нашлась: он использует синхронный интерфейс обмена (SPI), а я асинхронный (UART). И где-то вот здесь я обратил внимание на тот момент, который упустил вначале. Даже на схемах подключения для синхронного и асинхронного режимов загрузчика вывод готовности назван по-разному:

В синхронном это «BUSY», в асинхронном это «Monitor». Смотрим в таблицу «Функции выводов в режиме Standart Serial I/O»:


«Семён Семёныч…»

Упущенная вначале мелочь завела не туда. Собственно, если в синхронном режиме это именно флаг занятости загрузчика, то в асинхронном (тот, который serial I/O mode 2) — просто «мигалка» для индикации работы. Возможно вообще аппаратный сигнал готовности приемопередатчика, оттого и удивительная точность его поднятия.

В общем перепаиваем резистор на выводе SCLK с земли на VCC, припаиваем туда провод, цепляем все это к SPI и начинаем сначала…

Читайте так же:
Трехфазный выключатель по времени

Успех!

В синхронном режиме все почти так же, только не требуется никакой предварительной процедуры установки соединения, упрощается синхронизация и захват времени можно выполнить точнее. Если бы сразу выбрал этот режим сохранил бы время… Я снова не стал усложнять и измерять время именно от последнего бита, а запускал таймер перед началом передачи последнего байта ключа, т.е. включаем таймер и отправляем в передатчик KEY7 (на скриншоте выше, из логического анализатора, видно расстояние между курсорами. Это и есть отсчитываемый отрезок времени).

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

По оси абсцисс у нас количество дискрет счетчика, по оси ординат, соответственно, передаваемое значение ключа. Отношение сигнал/шум такое, что даже никаких фильтров не требуется, прямо как в школе на уроке информатики: находим максимум в массиве и переходим в подбору следующего байта. Первые 6 байт подбираются легко и быстро, чуть сложнее с последним: там просто наглый перебор не проходит, нужен сброс «жертвы» перед каждой попыткой. В итоге на каждую попытку уходит что-то около 400 мс, и перебор идет в худшем случае в районе полутора минут. Но это в худшем. После каждой попытки запрашиваем статус и, как только угадали, останавливаемся. Я вначале вообще просто быстренько ручками перебрал идентификатор, вставляя в excel вывод консоли и строя график, тем более, что это была разовая задача, но уже для статьи решил дописать автоматический перебор, ради красивой консольки…

Конечно, если бы разработчик затер загрузчик (заменил своим), так просто выкрутиться не получилось бы, но в автомобильной электронике частенько МК вообще не закрыты. В частности в блоке управления с другого отопителя, в котором был установлен V850 того же Renesas все решилось подпайкой пары проводов и копированием прошивки штатной утилитой. Это в мире ЭБУ двигателем целые криптовойны. Видимо не нравится производителям явление чип-тюнинга и других видов вмешательства… Хотя это как гонка брони и снаряда — железки круче, дороже, но победителя нет…

Устройство и принцип работы

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

Внешний вид термопредохранителя

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

Конструктивно данный защитный элемент состоит из двух частей:

  • электрической с нормально замкнутыми контактами;
  • механической с биметаллической пластиной, соединенной с контактами электрической части.

Электрическая часть, как правило, заключена в термостойкий пластик, а механическая часть — в корпус из алюминия.

Взрывозащищенные кабельные вводы КОВ (FECA, FECAS) для бронированного кабеля с двойным уплотнением для всех типов брони/оплетки

Взрывозащищенные кабельные вводы КОВ (FECA, FECAS) для бронированного кабеля с двойным уплотнением для всех типов брони/оплетки

Взрывозащищенные кабельные вводы КОВ для бронированного кабеля с двойным уплотнением для всех типов брони/оплетки надежно защищают кабель от случайного выдергивания, используются в местах, где необходимо иметь уплотнение IP 66/67/68 на внешней оболочке кабеля и взрывозащищенное уплотнение на оболочке под броней. Взрывозащищенные кабельные вводы КОВ в соответствии с нормами могут применяться для прямого ввода в составе взрывонепроницаемых оболочек подгрупп IIА, IIВ+Н2, IIC, объем которых превышает 2000 куб. см. Это позволяет отказаться от кабельных вводов с разделительным барьером под заливку компаундом.

Читайте так же:
Расчет автоматического выключателя для однофазной сети

Самым важным нововведением является использование одного уплотнительного кольца на весь диапазон диаметров обжимаемого кабеля, которое надежно обжимает входящий кабель и обеспечивает взрывозащиту вида “Exd”. Одно уплотнительное кольцо в сборе с оправкой или кабелем, выдерживает усилие в Ньютонах, равное 20-кратному значению диаметра (в миллиметрах) оправки или кабеля. Это позволяет использовать взрывозащищенные кабельные вводы без дополнительного обеспечения разгрузки кабеля.

Увеличенная толщина стенок корпусов кабельных вводов производства ГОРЭЛТЕХ позволяет значительно повысить их прочность по сравнению с кабельными вводами других производителей.

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

Зажимное кольцо брони позволяет использовать кабельный ввод КОВ для всех типов брони/оплетки кабеля: с проволочной броней, с оплеткой, с ленточной броней, с проволочной броней. Зажимное кольцо брони позволяет обжимать броню/оплетку толщиной от 0 до 3,5 мм (КОВ01-. -КОВ5 от 0 до 2,5 мм, начиная с КОВ6 от 0 до 3,5 мм). Внешнее уплотнительное кольцо для защиты IP предотвращает попадание влаги в кабельный ввод, что может стать причиной разрушения брони/оплетки.

Взрывозащищенные кабельные вводы КОВ обеспечивают непрерывность цепи заземления между броней/оплеткой кабеля и корпусом ввода зажимным кольцом брони/оплетки, обеспечивают защиту от электромагнитных помех. Для защиты при длительном затоплении брони/оплетки кабеля применяется водонепроницаемая изоляция ПГ-ГЕРМЕТИК. Кабельные вводы соответствуют требованиям DTS01.

Взрывозащищенные кабельные вводы КОВ могут применяются для кабелей с рабочим напряжением более 3,3 кВ.

Взрывозащищенные кабельные вводы КОВ полностью совместимы для использования с оборудованием, имеющим маркировку ExnR.

Взрывозащищенные кабельные вводы КОВ по конструкции обеспечивают разгрузку кабеля. Данные кабельные вводы обеспечивают защиту от выдергивания, не повреждая структуру оболочки кабеля и проводников, а так же не допускают их пережатия.

Взрывозащищённые вводы серии КОВ — это продукция российской разработки (Патент №155936, правообладатель OOO «ЗАВОД ГОРЭЛТЕХ» (ранее ООО «КОРТЕМ-ГОРЭЛТЕХ»)), эксплуатационные характеристики которой значительно превосходят аналогичную продукцию, представленную как отечественными, так и зарубежными производителями.

Область применения — подземные выработки рудников и шахт, опасные по газу (метану), угольной пыли; взрывоопасные зоны помещений и наружных установок согласно маркировке взрывозащиты, ГОСТ 30852.13-2002 (МЭК 60079-14:1996), опасные производственные объекты I, II, III, IV классов опасности, поднадзорные Ростехнадзору РФ и национальным техническим надзорам стран ТС и СНГ.

Рудничные изделия

Для I группы электрооборудования используется специальное разгрузочное устройство /РКР, позволяющее обеспечить прямой ввод без применения промежуточной клеммной коробки.

СООТВЕТСТВИЕ СТАНДАРТАМ

СЕРТИФИКАТЫ

ТУ 27.33.13-031-72453807-2017

Методы замены термопредохранителя

Диагностика подтвердила, что предохранитель сгорел – это веская причина позаботиться о состоянии цепи в которой он находится. Скорее всего ей пришел конец.

Читайте так же:
Розетки выключатели какие модные

Например, для замены одноразового термопредохранителя альтернативы нет. Можно лишь на время замкнуть цепь надежным способом:

  1. впаять простой плавкий предохранитель в соответствии с амперами;
  2. или заменить медной проволочкой из расчета: Ток 1А-диаметр 0.04; 2А – 0.07; 3А – 0.11; 5А – 0.18; 7А – 0.21; 10А – 0.25; 15А – 0.32; 20А – 0.39; 25А – 0.46;
  3. пружиной от зажигалки.

WP_20170617_011.jpg

Если в домашних условиях выполнить такую процедуру не получается, лучше обратиться к специалисту, так будет надежнее и техника прослужит дольше.

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

Чем заменить термопредохранитель

  • Pavel к записи Как отличить подделку зажигалки IMCO
  • Наталия к записи Проверить БАТЧ-КОД онлайн на подлинность
  • Олег к записи Как отличить оригинальный коньяк “Бахчисарай”
  • Алексей к записи Как отличить оригинальные джинсы Wrangler от подделки
  • Геннадий к записи Обзор Marlboro Duty Free как отличить подделку

Наборы инструментов SATA как отличить подделку

Как отличить настоящую бензопилу Stihl от подделок

Как отличить оригинальную болгарку Makita от подделки

Privacy Overview

Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.

CookieDurationDescription
cookielawinfo-checbox-analytics11 monthsThis cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category «Analytics».
cookielawinfo-checbox-functional11 monthsThe cookie is set by GDPR cookie consent to record the user consent for the cookies in the category «Functional».
cookielawinfo-checbox-others11 monthsThis cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category «Other.
cookielawinfo-checkbox-necessary11 monthsThis cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category «Necessary».
cookielawinfo-checkbox-performance11 monthsThis cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category «Performance».
viewed_cookie_policy11 monthsThe cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.

Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.

Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.

Other uncategorized cookies are those that are being analyzed and have not been classified into a category as yet.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector