Frp на телефоне. что это
FRP (Factory Reset Protection) — это особый защитный механизм Android, который блокирует несанкционированное использование устройства посторонними людьми. Он нужен на случай, если его украдут или найдут. Благодаря FRP случайный владелец не сможет получить доступ к данным бывшего пользователя, а также получить полны контроль над устройством. Мало того, что он не сможет восстановить резервную копию, он ещё и не сможет пользоваться Google Play и другими сервисами.
Factory Reset Protection – это аналог блокировки активации на iOS. Благодаря ему рациональность кражи смартфонов практически сводится на нет, потому что без пароля от аккаунта Google его будет не активировать.
Несмотря на это, отключить FRP на Android всё равно можно. Причём сразу несколькими способами. А вот сложность разблокировки будет зависеть от версии Android. Чем она выше, тем сложнее будет снять блокировку, потому что с каждой новой версией своей ОС Google всё больше и больше совершенствовала защиту от несанкционированного доступа.
Как вытащить из устройства то, что разработчики втащили
Вполне естественно, что начинать попытки достать что-то из микроконтроллера нужно с изучения механизмов, которые встроены разработчиком чипа для задач программирования памяти. В мануале указано, что производитель любезно разместил в памяти загрузчик, для нужд внутрисхемного программирования устройства.
Как видно из картинки выше, память разбита на 2 части: пользовательская область, и область загрузчика. Во второй как раз с завода залит загрузчик по умолчанию, который умеет писать, читать, стирать пользовательскую память и общается через асинхронный, синхронный, либо CAN-интерфейс.
Указано, что он может быть переписан на свой, а может быть и не переписан. В конце концов это легко проверяется попыткой постучаться к стандартному загрузчику хотя-бы через UART… Забегая вперед: производитель отопителя не стал заморачиваться своим загрузчиком, поэтом копать дальше можно в этом направлении.
Вход в режим работы загрузчика обеспечивается определенной комбинацией на входах CNVSS, P5_0, P5_5 во время аппаратного сброса. Дальше либо написать свою утилиту для копирования содержимого памяти, либо использовать готовую. Renesas предоставляет свою утилиту, которая называется «M16C Flash Starter», но функция чтения у нее урезана.
Она не сохраняет прочитанное на диск, а сравнивает его с файлом с диска. Т.е. по сути это не чтение, а верификация. Однако есть немецкая свободная утилитка с названием M16C-Flasher, которая вычитывать прошивку умеет. В общем начальный инструментарий подобрался.
Как запустить autotune и понять правильные значения блокировки lhr
В тех же настройках Gminer прописываем —lhr_mode 0
И карта начинает режим адаптации, т.е. она меняет сама проценты и подбирает оптимальный, между подборами есть небольшие аптаймы, когда карта не майнит. Поэтому важно не держать карту в режиме авто подбора постоянно, т.к. вы будет терять время майнинга на длинной дистанции. Так же в авто режиме будет скакать потребление карты.
Если вы меняете настройки карты, частоту ядра или памяти, вам нужно званого прогонять вычисления оптимального процента разблокировки LHR.
Выбирайте правильный пул для майнинга ETH — Binance Pool.
Топ 5 бирж для торговли и инвестирования в криптовалюты
Как и где это прописывать для обхода lhr?
Переходим в Hive OS.
Заходим в полетный лист, в столбце Miner должен быть выбран майнер GMiner, и нажимаем Setup Miner Config.
В поле Extra config arguments вписываем следующие значения:
—lhr_autotune 0 — что бы не увеличивалось энергопотребление.
—lhr_tune 74 — устанавливаем процент разблокировки LHR. Но прежде чем его ставить, вы должны запустить майнер и понять какой процент Gminer подберет как оптимальный. Для этого запускаем майнер минут на 30-60. Если вы поставите значение в процентах большее чем может карта, вы получите ошибку lock_detected. И ваша блокировка отключится.
Для майнинга на видеокартах, рекомендуем пул Binance, самый надежный и удобный, так как это и биржа и пул вместе c минимальными комиссионными. Как майнить на Binance Pool читайте на сайте. А так же операционную систему Hive OS. Ссылка на регистрацию Hive OS (с промокодом InsidePC получаете 10$ на счет).
Для стабильной работы видеокарт в риге, выполните правильные настройки материнской платы для майнинга.
Как обойти аккаунт гугл без компьютера
Впрочем, это не единственный способ снять блокировку FRP на Android. Получить тот же результат можно с утилитой Pangu FRP Bypass Unlocker. Это разработка тех же людей, которые сделали джейлбрейк для iPhone. Однако для обхода Гугл-аккаунта используется другая программа, принцип действия которой довольно ощутимо отличается от взлома iOS, хоть результат и тут, и там будет примерно одинаковый.
Этот способ хорош всем, кроме того, что подходит далеко не всем. По неизвестной причине ряд смартфонов просто не поддерживает сброс Гугл-аккаунта таким способом. Например, аппараты Huawei и Honor наотрез отказываются разблокироваться таким способом.
Как обойти гугл-аккаунт на самсунге
Вопреки высокому уровню защиты смартфонов Samsung, почему-то именно на них обойти аккаунт Google проще всего. Правда, следует помнить золотое правило — чем ниже версия Android, тем проще процесс разблокировки. Например, на ранних версиях Android вы можете снять блокировку FRP на Samsung при помощи штатных инструментов самого смартфона. Главное — следуйте положениям инструкции, приведённой ниже:
- Сбросьте настройки своего смартфона до заводских;
- Начните активацию, выберите язык и подключитесь к Wi-Fi;
- После появления экрана ввода данных учётной записи нажмите и удерживайте символ @ на клавиатуре;
- Выберите «Настройки клавиатуры Google»;
- Нажмите на три точки в правом верхнем углу и выберите «Помощь»;
- Выберите «Использование клавиатуры Google», выделите любой фрагмент текста и нажмите «Поиск в интернете»;
- Введите «Настройки» в строке поиска и перейдите в раздел «Об устройстве»;
- Нажмите 10 раз на номер сборки для активации меню разработчика;
- Вернитесь в настройки и перейдите в «Для разработчика», а затем активируйте «Разблокировка, предусм. произв. ОЕМ» и нажмите «Назад»;
- Перезагрузите устройство, подключитесь к Wi-Fi и завершите активацию.
Как сбросить аккаунт google
Поскольку предыдущий метод разблокировки FRP требует, чтобы ваш смартфон работал на одной из старых версий Android, и зачастую это условие оказывается невыполнимым, есть альтернативный способ. Это утилита Tenorshare 4uKey for Android.
- На главном экране 4uKey выберите «Удалить блокировку Google»;
- Выберите версию ОС своего смартфона и нажмите «Начать»;
- Убедитесь, что смартфон подключен к Wi-Fi и отправьте с компьютера уведомление от 4uKey;
- Следуйте инструкции, представленной на экране, а затем установите пин-код;
- Перезагрузите устройство и введите пин-код, который вы установили на предыдущем этапе;
- Отключите устройство и активируйте его заново с новым аккаунтом Google.
Немного о самом микроконтроллере
Камешек представляет собой 16-разрядный микроконтроллер в 100-выводном QFP корпусе. Ядро имеет 1 МБайт адресного пространства, тактовая частота 20МГц для автомобильного исполнения. Набор периферии так же весьма обширный: два 16-разрядных таймера и возможность генерации 3-фазного ШИМ для управления моторами, всякие UART, SPI, I2C естественно, 2 канала DMA, имеется встроенный CAN2.0B контроллер, а также PLL. На мой взгляд очень неплохо для старичка. Вот обзорная схемка из документации:
Так как моя задача выдрать ПО, то так же весьма интересует память. Данный МК выпускался в двух вариантах: масочном и Flash. Ко мне попал, как выше уже упоминалось, M306N5FCTFP. Про него в описании сказано следующее:
О защите от считывания
Все бы было совсем просто, если бы в загрузчике не была предусмотрена защита от несанкционированного доступа. Я просто приведу очень вольный перевод из мануала.
Функция проверки идентификатора
Используется в последовательном и CAN режимах обмена. Идентификатор, переданный программатором, сравнивается с идентификатором, записанным во flash памяти. Если идентификаторы не совпадают, команды, отправляемые программатором, не принимаются. Однако, если 4 байта вектора сброса равны FFFFFFFFh, идентификаторы не сравниваются, позволяя всем командам выполняться.
Таким образом, чтобы получить доступ к программе, нужно знать заветные 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ч в копилку упущенного времени.Этого минимума достаточно, чтобы железки друг друга поняли.
Логика атакующего ПО следующая:
- Устанавливаем соединение с контроллером. Для этого необходимо дождаться, пока завершится сброс, затем передать 16 нулевых символов с интервалом более, чем 20 мс. Это для того, чтобы отработал алгоритм автоопределения скорости обмена, т.к. интерфейс асинхронный, а МК о своей частоте ничего не знает. Стартовая скорость передатчика должна быть 9600 бод, именно на эту скорость рассчитывает загрузчик. После этого при желании можно запросить другую скорость обмена из пяти доступных в диапазоне 9600-115200 (правда в моем случае на 115200 загрузчик работать отказался). Мне скорость менять не нужно, поэтому я для контроля синхронизации просто запрашивал версию загрузчика. Передаем FBh, загрузчик отвечает строкой вроде «VER.1.01».
- Отправляем команду «unlock», которая содержит текущую итерацию ключа, и замеряем время до снятия флага занятости.
Команда состоит из кода F5h, трех байт адреса, где начинается область идентификатора (в моем случае, для ядра M16C, это 0FFFDFh), длина (07h), и сам идентификатор. - Измеряем время между передачей последнего бита идентификатора и снятием флага занятости.
- Увеличиваем перебираемый байт ключа (KEY1 на начальном этапе), возвращаемся к шагу 2 до тех пор, пока не переберем все 255 значений текущего байта.
- Сбрасываем статистику на терминал (ну или выполняем анализ «на борту»).
Для общения с целевым МК я использовал USART в STM32, для измерения времени — таймер в режиме Input Capture. Единственное, для простоты я измерял время не между последним битом ключа и снятием флага, а между началом передачи и флагом. Причиной было то, что последний бит может меняться, а в асинхронном режиме прицепить вход захвата особо не к чему. В то же время UART аппаратный и время передачи в принципе идентично и ощутимых погрешностей набегать не должно.
В итоге, для всех значений результаты были идентичны. Полностью идентичны. Тактовая частота таймера у меня была 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 все решилось подпайкой пары проводов и копированием прошивки штатной утилитой.
Ссылки: