Блог об электронике
Привет друзья.
Меня попросили рассказать о клонировании микроконтроллеров. Просили — выполняю!
Кратко о чём я хочу рассказать в данном видео:
Я расскажу две коротенькие истории, чтобы вы лучше поняли, что такое клонирование и как всё происходит.
Второе — я сделаю клон данного устройства, точнее сделаю клон микроконтроллера.

Так же я вам расскажу, что клонирование чипов не всегда возможно, более того, можно сказать даже по другому, практически всегда клонирование чипов не возможно. Я, так же в конце расскажу, какие бывают способы клонирования, даже если производитель не хочет чтобы клонировали его устройство, производитель устройства, не хочет этого, то есть варианты, есть способы, и о них я расскажу дальше. Так же есть способ о котором многие знают, но даже и не догадываются что они его знают, как можно клонировать устройство со 100% результатом. О нем, конечно же я расскажу в самом конце, так что если вам интересно — обязательно досмотрите этот ролик до конца.
Первая история. Представим, что я наконец-то доделал своё устройство, которое я никак доделать не могу. И скажем, продаю его примерно за 100 $. Потом у меня кто-то его покупает, Вася допустим, и Вася смышлёный парень, он видит, что этот микроконтроллер стоит 2 $, дисплей — 3 $, кнопочки вообще копейки, пару транзисторов, пару резисторов. Он понимает, что данное устройство стоит максимум 20 $, как я его мог купить за 100 $. И он думает, нужно сделать копии таких устройств (клонировать чипы) и продавать их не за 100 $ как продаёт бедный инженер Аурел, а продавать их за 50$. Вот он считает, что навар 30 $, всё круто, через годик он на машинке будет ездить, через два уже на хорошей машинке и так далее и тому подобное. Такой вариант — кормить нахлебников — он никого не устраивает. Поэтому производители всех микроконтроллеров устанавливают, точнее задают возможность защиты содержимого микроконтроллера от чтения, конечно же эти защиты можно обойти, но как правило, простыми способами этого не сделать. О способах клонирования чипов я расскажу в самом конце. Всё это приводит к битам защиты, и я на этом сам попался. Принесли отремонтировать плату управления холодильником. Плата работала, индикация работала, единственное что не работало — устройство которое включало компрессор. который гоняет фреон по теплообменнику, который перегоняет тепло из холодильной камеры наружу. Было очень похоже на то, что просто сгорел данный пин микроконтроллера. Был бы у меня исходный код, я бы перекинул управление данным исполнительным устройством на какой-то соседний пин, которых свободных было огромное количество. Но исходного кода естественно у меня не было. Оставался второй вариант — копировать прошивку и залить её в нормальный микроконтроллер, потому что там была, кажется, AtMega8. Естественно у меня этот вариант не получился, потому что стояли биты защиты.
И третий вариант который я попробовал — написать изготовителю и попросить его, чтобы он выслал *.hex файл. Естественно он меня вежливо отшил, сказал что они *.hex не распространяют, никому не отправляют, и если вы хотите — вы можете у нас купить плату. Сказал мне стоимость. Сказал стоимость доставки. Короче, суммы были не маленькие.
То есть вот такая вот реальная ситуация, у меня не получилось это всё сделать. Теперь давайте, все-таки перейдём к самому процессу клонирования чипов. У меня есть плата А, эта плата работает, как вы видите тут меню переключается, всё прекрасно работает. Мне нужно сделать такое же устройство. Устройство сделать просто, у меня плата односторонняя, я вижу трассировку, я просто копирую трассировку, делаю новое устройство, но мне нужно как то сделать чтобы микроконтроллер также функционировал как и микроконтроллер в плате А. То есть для идентичного функционирования мне нужно чтобы fuse биты на обоих контроллерах были идентичные, содержимое flash памяти, там хранится ваша программа, тоже было идентичным, и содержимое eeprom памяти, там могут храниться какие-то важные константы, тоже было идентичным. То есть мне нужно с этого микроконтроллера (микроконтроллер А) считать все три составляющие — fuse, flash, eeprom и в тот микроконтроллер (микроконтроллер В) записать. Лучше записывать таким образом, чтобы сначала записать flash, потом eeprom, ну или наоборот, ну и самым последним самое главное записать fuse. Потому что, если у вас микроконтроллер в плате имеет какой то кварцевый генератор, и он настроен fus-ами для работы от внешнего тактового сигнала, то при программировании микроконтроллера в панельке без кварца, как только вы переключите микроконтроллер для работы от кварца, он уже не запустится, потому что ему нужен внешний тактовый сигнал, которого нет в панельке. Вам придётся его паять в плату, где есть этот сигал, и потом уже зашивать в него eeprom и flash. Поэтому, сначала пишем eeprom и flash пока микроконтроллер работает от внутреннего генератора, потом переносим содержимое fuse, и если всё хорошо, то микроконтроллер, после конфигурирования fuse, просто перестанет определяться, но этого уже и не требуется, так как вы залили в него прошивку до fuse. Когда вы его вставите в плату, он у вас, так как на ней смонтирован кварц, сразу же и запустится.
Давайте непосредственно попробуем всё считать. Я себе сделал папку, вы видите, что она пустая, и попытаюсь считать с микроконтроллера сначала Flash. Выбираем путь, по которому хотим сохранить файл. Нужно как то назвать hex каким-то говорящим названием. Теперь жмём кнопку «Чтение». Вот как видите, у меня здесь появился файл на 9 кБайт.

Также самое читаем и eeprom. У меня конечно же в ней ничего нет, но в вашем случае может быть. Самими последними смотрим fuse. Нажимаем «Чтение», ОК, и fuse можно к примеру ALT+PrtSct и вставить в текстовый документ.

Ну всё, мы скопировали содержимое микроконтроллера.
Теперь я беру и подключаю сюда другой микроконтроллер (микроконтроллер В). У меня другой платы нет, я сделаю вот так — «Стереть всё». Кристалл чист, но для того, чтобы вы видели, что у меня другое устройство, я разверну провод))).

Я беру второе устройство, вставляю его в компьютер, подключаю программатор, устройство абсолютно чистое, ничего у нас не работает, теперь мне нужно сюда залить eeprom, hex, и в конце fuse. То есть я точно также выбираю hex, жму «Программирование», ОК.

Дальше мне нужна eeprom, также выбираю и жму «Программирование». И также мне нужны fuse. То есть я беру сначала читаю то, что у меня установлено, и затем сверяю с тем, что мне нужно. При необходимости их корректирую. У меня всё установлено так как нужно. Ну всё, я вас поздравляю, у вас устройство и чип клонированы, оно работает, и всё классно.

Но это слишком просто, так не бывает. Дело в том, что у любого микроконтроллера есть вот такие два fuse защиты. У других микроконтроллеров механизмы защиты могут быть другими, но все они имеют механизмы защиты. К примеру, я беру и удаляю данные два fuse, я их не то что удалил, я их установил. Они равны значению всегда установленного бита SPIEN. И теперь я хочу сделать всё тоже самое что я делал до этого.

Я создам другой файл, допустим, с окончанием LOCK, и прочту в него.

Как видите всё читается, казалось бы никаких проблем нет, то есть чтение у нас не запрещено, всё классно, НО, если мы сейчас эти два файла откроем в текстовом редакторе. Смотрите. Они разные.

Даже в первой строчке, видим, что здесь 028D, а в этом уже 0F00, то есть программатор считал не нужную информацию, а у микроконтроллера словно включается какой то генератор случайных чисел и он просто плюёт ерундой. Давайте убедимся, что мы считали не то, что нужно, давайте запрограммируем микроконтроллер hex файлом с окончанием LOCK. Убедимся что у нас дисплей не включится. Всё ОК, прошло программирование, прошло верификацию, но дисплей не включается. Чтобы вы не делали, у вас ничего не получится. И я думаю, что многие начинающие сразу подумают, что что-то не так с микроконтроллером, либо программатор не работает, либо ещё что-то. Потому что всё считалось. Поэтому просто берём, читаем у микроконтроллера, который мы хотим клонировать, fuse, и если установлены fuse защиты, то ни flash ни eeprom не имеет никакого смысла читать дальше.
Теперь о том, как же можно считать с залоченного чипа информацию? Скажу сразу, если всё хорошо, то считать её либо не реально, либо сама процедура считывания будет стоить на много дороже чем написание нового софта. Какие бывают варианты обхода битов защиты?
Ну первое — это ошибка, ошибка разработчиков данного чипа. Может быть такое, что разработчики где то ошиблись, и эту защиту как-то можно просто обойти. Такое бывает, но это редкость.
Второе — берут, и на специальном оборудовании, микрон за микроном снимают слоями данный компаунд, и добираются до кристалла. Затем находят область памяти, это тоже какая то ПЗУ (постоянное запоминающее устройство) где хранятся биты конфигурации. И каким то способом, либо лазером, либо электромагнитным импульсом направленным, пытаются изменить состояние бита защиты, затем читают программатором с микроконтроллера прошивку. Естественно что для того, чтобы это сделать, нужно знать топологию микроконтроллера, нужно знать где что находится, где какой бит, возможно также нужно будет испортить огромное кол-во работающих устройство для исследование методом проб и ошибок. Более того, снятие послойное компаунда, для этого нужно иметь супер точное оборудование, это всё стоит огромных денег.
Третий вариант, который у вас всегда будет работать, который я и обещал показать, который 100% работает на всех микроконтроллерах, это изучить, как работает ваше устройство, и не клонировать его чип, а сделать своё новое устройство, которое по функционалу не будет отличаться от данного устройства. Так же будет отвечать на ваши кнопки, на все ваши нажатия. Да, я понимаю, вы чувствуете, что я вас обманул, но не обманывайте и вы себя, потому что простыми способами сделать копию устройства не получится. Потому что никто, ни разработчики, естественно, раз разработчики этого не хотят, то и производители микроконтроллеров никак не допустят того, чтобы кто-то мог взять и спокойно сделать копию микроконтроллера с прошивкой (клонирование чипа).
14 комментария
Стиль написания это просто пиздец . Складывается впечатление что все ваше образование — это два класса церковно- приходской школы. Читать просто невозможно
Да, Вы правы, статьи никуда не годятся. Это не совсем статьи, это текст из видео практически без изменений. Я выставляю его для поисковиков, чтобы для них сайт не был пустым. (Ну на крайний случай, для пользователей с очень плохим интернетом) Для людей есть видео, оно первично, хотя и оно не лишено недостатков, но видео ещё нормально смотрится, так как там больше интереса представляет картинка, а мои комментарии просто дополнения. Вам спасибо за критику, которая заставляет расти, а не стоять на месте.
Отличный ролик и хорошее описание . А критиков не слушай. Кто такой Вася? Если слишком умный пусть на сайтах для профессионалов критикует.
Спасибо за видео! Всё ясно и понятно, а главное очень интересно! Что касается стиля — пусть Вася читает художественную литературу, там со стилем всё ОК!
В настоящее время, все больше людей, интересующихся электроникой, и конструирующих самостоятельно различные устройства, собирают устройства с применением микроконтроллеров. Даже начинающие, рано или поздно приходят к мысли, о необходимости их изучения, потому — что за ними будущее. Из наиболее широко распространенных, и относительно простых для изучения, по крайней мере, относительно других МК, могу назвать микроконтроллеры PIC и AVR.
По микроконтроллерам AVR, семейств Mega и Tiny, есть много информации в интернете, и огромное количество готовых схем и прошивок для них. Выбравшие для изучения AVR микроконтроллеры (МК), думаю, чаще всего собирают себе, сперва для прошивания МК Программатор Громова. Это очень легкий в сборке программатор, не содержит дефицитных деталей, не требует наладки, и собрать его может даже школьник. Главным недостатком его является то, что для его подключения к компьютеру необходим СОМ порт, который часто отсутствует на современных компьютерах. Я являюсь обладателем относительно современного системного блока, на материнской плате которого производители оставили СОМ порт, и разумеется, собрал себе Программатор Громова, начав свое знакомство с МК AVR.
Выбор оболочек работающих с этим программатором не велик, наиболее распространенные, это Ponyprog и Uniprof. Испробовав в работе обе из них, понял, что к Ponyprog, у меня почему-то душа не лежит, зато Uniprof меня полностью устроила. Так выглядит её рабочее окно:
В настоящий момент программатор не подключен, после подключения программатора к программируемому МК, и подаче на него питания, вместо надписи синим текстом UNKNOWN будет показана модель микроконтроллера. В случае каких-либо проблем, с автоматическим определением типа МК, можно вручную указать его тип в появившемся меню. В настоящее время мощность современных компьютеров очень высока, для того чтобы прошить МК без ошибок, нужно поставить галочку Тормоз, в рабочем окне программы. Особенно это касается прошивания выставленных фьюзов.
Разберем подробнее основные пиктограммы, используемые при работе с оболочкой.
- READ. Считать прошивку с микроконтроллера. Кликнув по этой иконке, мы считываем записанную ранее прошивку, с чипа микроконтроллера в буфер программы.
- PROG. Записать прошивку в микроконтроллер. С помощью этой иконки мы записываем прошивку, из буфера программы в память чипа, или прошиваем МК.
- TEST. Сверка прошивки, записанной в память чипа, с прошивкой в буфере программы.
- FUSE. Выставление фьюзов. Установка фьюз битов, задающих параметры работы микроконтроллера. О них ниже поговорим отдельно.
- ERASE. Стереть прошивку микроконтроллера. Перед тем, как залить в чип новую прошивку, мы должны удалить старую из его памяти. С помощью этой иконки, мы и осуществляем стирание.
- HEX Загрузить прошивку в буфер, (иконка папки). Перед тем как прошить микроконтроллер, мы должны загрузить прошивку в буфер программы, сделать это можно с помощью этой иконки.
- HEX Сохранить прошивку из буфера (иконка дискеты). Служит для сохранения на компьютере прошивки, снятой с чипа микроконтроллера, и загруженной в буфер. Сохранить прошивку можно, только если микроконтроллер не был защищен от копирования его прошивки, с помощью выставления определенных фьюз битов.
Рассмотрим что это такое, фьюз биты. Такое окно появляется, если мы кликнем на иконку Фьюзы:
У некоторых типов микроконтроллеров, часть фьюзов представленных на скрине может отсутствовать, у других наоборот, могут быть дополнительные фьюзы, которых нет на этом рисунке. Фьюзы делятся на несколько групп: Перечислим их так, как они идут на рисунке, слева направо, это Lock Байт, установка lock битов, защищает прошивку от копирования, Low Байт, это Младший байт. High Байт, это Старший байт. Ext Байт, это Дополнительный байт.
Узнать, для чего нужны каждые из этих битов, можно скачав Даташит на данный микроконтроллер. Либо можно воспользоваться Онлайн калькулятором фьюзов, там будет приведено краткое пояснение, для некоторых из фьюз битов. Для того чтобы перейти на эту страницу, нужно набрать Онлайн калькулятор фьюзов в поисковом запросе.
При выставлении фьюзов, нужно быть очень внимательным, потому что ошибочное выставление некоторых из них, приведет к тому, что микроконтроллер залочится, и перепрошить его через последовательный интерфейс (SPI) будет невозможно. В таком случае если вы все же напутали с выставлением фьюзов, поищите среди своих знакомых радиолюбителя, с параллельным (высоковольтным) программатором или Реаниматором МК AVR. Также, если вы случайно выставили тактирование, не от внутреннего генератора МК, а от внешнего кварца, и микроконтроллер перестал быть “виден” при прошивании, нужно будет подключить кварц и 2 конденсатора в соответствии со схемой и распиновкой из даташита.
Выше на рисунке, обведены красным те фьюзы, которые изменять не нужно, иначе микроконтроллер залочится. Это RSTDISABLE, выбор этого бита, отключает работу вывода RESET, и превращает его в еще один вывод порта микроконтроллера. SPIEN, этот бит, собственно и включает последовательное программирование. В некоторых программах-оболочках стоит защита от его изменения. DWEN, это бит служащий для отладки микроконтроллера, если его изменить, МК будет также недоступен для программирования по SPI. Также нужно обратить внимание, что в некоторых программах-оболочках, фьюз биты выставляются инверсно, Uniprof относиться именно к таким программам. То есть в одних, наличие галочки означает, что бит не запрограммирован, а в других наоборот. Для того что не ошибиться, можно ориентироваться по биту Spien, есть на нем галочка или нет, так как если микроконтроллер виден, бит Spien запрограммирован, этот бит бывает установлен по умолчанию. В программе-оболочке Ponyprog, галочки ставятся инверсно относительно Uniprof. Автор статьи — AKV.
Ответы на часто задаваемые вопросы:
1. Для кого предназначен этот FAQ?
Большинство специалистов разрабатывающие устройства на микроконтроллерах уже знакомы с темой защиты программ микроконтроллеров, поэтому можно считать, что данный раздел им ни о чем новом не расскажет. Однако имеется огромная армия инженеров и простых потребителей электронных устройств не знакомых с детальной организацией подобной защиты, но желающих либо разобраться в деталях работы имеющегося устройства, либо создать подобное устройство, для них то и предназначен этот сборник ответов на вопросы.
2. Для чего и от кого делается защита микроконтроллеров?
Многие производители электронных устройств стараются защитить свое устройство от возможности простого копирования его другим производителем. Им навстречу пошли производители микроконтроллеров, введя в функционал своих изделий защиту от копирования программы (микропрограммы) содержащийся в памяти микроконтроллера. Используя эту защиту от чтения микропрограммы (прошивки) производители электронных устройств могут защитить свой продукт от простого копирования другим производителем.
3. Что представляет собой защита от копирования в микроконтроллере, и почему я сам не могу считать защищенную микропрограмму (прошивку)?
Обычно защита от копирования устанавливается во время программирования микроконтроллера путем установки специального бита защиты или нескольких бит в слове конфигурации микроконтроллера. Физически эти биты располагаются в специальных ячейках памяти на кристалле микроконтроллера. Иногда используются другие методы защиты, например защита паролем, но принцип сохраняется. Чтобы снять защиту обычно необходимо изменить значение этого бита или нескольких битов, хотя часто могут использоваться и другие методы считывания содержимого памяти программы микроконтроллера. Обычными методами, например программатором, это сделать не удастся, необходимо сложное дорогостоящее оборудования, которого обычный разработчик электронных устройств не имеет. Поэтому мы, имея необходимое оборудование, знания и опыт, специализируемся на предоставлении подобного рода услуг.
4. Что дает мне снятие защиты от чтения микропрограммы (прошивки)?
Допустим, у Вас есть устройство, которое Вы приобрели у одного из производителей электронных устройств и Вы хотите производить такое же, но модифицированное устройство. Но исходников микропрограммы или готовой прошивки у Вас естественно нет, и Вам будет необходимо полностью с нуля разрабатывать и отлаживать микропрограмму. На это, по сравнению с копированием электронной составляющей устройства (схемы), придется потратить много денег и времени. Пользуясь нашими профессиональными услугами, Вы сэкономите и деньги и время на разработку устройства. При наличии устройства или его электрической схемы мы можем восстановить полностью алгоритм его работы и текст микропрограммы на языке программирования Си или Ассемблер.
5. Какова законность таких действий с точки зрения законодательства?
Все микропрограммы (прошивки) мы считываем по заказу клиента с целью ремонта его устройства, либо для ознакомления с алгоритмом работы микропрограммы. Вся дальнейшая ответственность за незаконное распространение микропрограммы или иные действия с ней или с её помощью ложится полностью на заказчика.
Наша компания работает на территории РФ, поэтому ниже приведем цитату из закона. Законодательство других стран декларирует аналогичную позицию.
Статья 1280 ГК РФ. "Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ".
2. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения изучать, исследовать или испытывать функционирование такой программы в целях определения идей и принципов, лежащих в основе любого элемента программы для ЭВМ, путем осуществления действий, предусмотренных подпунктом 1 пункта 1 настоящей статьи.
3. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения воспроизвести и преобразовать объектный код в исходный текст (декомпилировать программу для ЭВМ) или поручить иным лицам осуществить эти действия, если они необходимы для достижения способности к взаимодействию независимо разработанной этим лицом программы для ЭВМ с другими программами, которые могут взаимодействовать с декомпилируемой программой.
6. Что представляет собой дополнительная защита от чтения и почему она лучше обычной?
Дополнительная трёхуровневая защита предназначена для создания условий невозможности чтения микропрограммы (прошивки) известными методами. Она может включать в себя от одного до трёх уровней защиты: защита от вскрытия корпуса, скрытый внутрикорпусной обрыв ножки используемой программатором для чтения, скрытое внутрикристальное удаление логики управления ножкой используемой для чтения.
Первый уровень представляет собой стойкий к кислотам и растворителям тугоплавкий полимер, что не позволяет добраться до кристалла.
Второй уровень делает невозможной процедуру считывания программатором без специальных дорогостоящих инструментов.
Третий уровень выполняет аналогичную второму функцию, но при этом внутрикристальное восстановление логики управления на внутренних слоях практически не возможно, либо требует очень дорогостоящего оборудования.
Учитывая, что в подавляющем большинстве случаев обычная заводская защита легко обходится, дополнительная защита для многих дорогостоящих и сложных устройств является крайне необходимой мерой для предотвращения материальных потерь связанных с попаданием плодов интеллектуальной деятельности в руки третьих лиц.
7. Я хочу установить дополнительную защиту, но я боюсь, что вы считаете мою суперсекретную программу перед установкой защиты. Есть ли какой-то способ установить дополнительную защиту на микросхему, перед тем как я ее окончательно запрограммирую?
В данном случае перед установкой нашей дополнительной защиты можно прошить только бутлоадер без основной программы. После того, как мы установим дополнительную защиту, вы уже сможете запрограммировать основную память. Причем бутлоадер для загрузки основной программы должен использовать любой другой интерфейс отличный от основного, использующегося для стандартного программирования, так как основной интерфейс будет отключен после установки нашей дополнительной защиты. Обычно сам бутлоадер не представляет никакого интереса для копирования. В качестве бутлоадера можно использовать свой, либо модифицированный из примеров от производителя микроконтроллера.
8. Я боюсь, что после считывания моя программа может быть передана или использована третьими лицами.
Это исключено, мы никогда никому не передаем считанные микропрограммы и восстановленные исходники, не храним и не используем их сами в своих целях.