Разборка прошивки электросамоката Xiaomi M365

Форум / Электротранспорт / Электросамокаты / Xiaomi Mijia Electric Scooter / Разборка прошивки электросамоката Xiaomi M365
#прошивка
Форум / Электротранспорт / Электросамокаты / Xiaomi Mijia Electric Scooter / Разборка прошивки электросамоката Xiaomi M365
25 january 2019, 13:09
Posted: 25 january 2019, 13:09
Это вики-сообщение, которое может редактировать любой пользователь с рейтингом 10 и выше
Редактировать сообщение   Посмотреть историю изменений

Это шапка темы, которую может редактировать любой пользователь с рейтингом 10 и выше
Станьте первым, кто внесет сюда важную информацию! :)

 

Восстановление прошивки по инструкции:

https://electro.club/f/48886

Последнее редактирование: 11 august 2019, 7:27,
Причина: Не указана
Vladimir Lavrulin
Раздаю лайки
МоскваRating: 4836
Vladimir Lavrulin
20 february 2017, 14:38
Posted: 20 february 2017, 14:38
​​​Предлагаю здесь делиться информацией о прошивке и работе приложений для Xiaomi M365. 

Основная задача - сделать аппарат наиболее опциональным.
Чтобы ограничение максимальной скорости было опцией
Чтобы Zero-Start был опцией
​​Ну и т.д. и т.п. :)

Что сейчас есть:
1. История версий прош​​​ивки в txt:
https://electro.club/data/users/2193/files/Xiaomi/CNESCVersion.txt

2. Декомпилированный APK-файл приложения MiHome (одна из версией, распаковалась криво, но много познавательного кода имеется):
https://electro.club/data/users/2193/files/Xiaomi/MiHome_4.0.8_source_from_JADX.rar

Answers: 1
 1   
nicomunet123
Форумчанин
Rating: 146
nicomunet123
20 february 2017, 22:02
Posted: 20 february 2017, 22:02
Владимир, попобуйте посмотреть, куда MiHome лезет, когда ищет обновления. Это тоже будет полезно. 
Vladimir Lavrulin
Раздаю лайки
МоскваRating: 4836
Vladimir Lavrulin
03 march 2017, 20:54
Posted: 03 march 2017, 20:54
​Прошу прощения за такую задержку :) Никак не доходили руки поставить снифер на роутер.

В общем, лезет он на ​​58.83.160.17/app/home/latest_version
(домен api.io.mi.com)

Скрин во вложении.

Файл для Wireshark:​​​
https://electro.club/data/users/2193/files/Xiaomi/xiaomi-m365-check_firmware_ver.zip

Жду дальнейших инструкций :) Я понимаю, что лучше всего мне откатиться и перехватить все пакеты во время обновления. Но я пока не знаю как откатиться и чем это грозит :)​​

 2   
nicomunet123
Форумчанин
Rating: 146
nicomunet123
03 march 2017, 23:32
Posted: 03 march 2017, 23:32
Не уверен я, что можно откатиться...

А пока я приблизительно понял, где запрос на сервер формируется в коде...​​
Vladimir Lavrulin
Раздаю лайки
МоскваRating: 4836
Vladimir Lavrulin
04 march 2017, 8:50
Posted: 04 march 2017, 8:50
[quote="nicomunet123"]А пока я приблизительно понял, где запрос на сервер формируется в коде...​​[/quote]
Так поделитесь, пожалуйста :)
Answers: 1
Vladimir Lavrulin
Раздаю лайки
МоскваRating: 4836
Vladimir Lavrulin
07 march 2017, 13:52
Posted: 07 march 2017, 13:52
​Откатиться у владельцев NineBot Mini получалось не просто, но получалось. Возможно, к самокату такой же метод подойдет:
http://forum.electricunicycle.org/topic/4257-how-to-downgrade-your-ninebot-xiaomi-nine-9-segway-mini-mini-pro-from-128-to-117-firmware/

Для этого требовалось обмануть приложение, направить на свой сервер и подсунуть любую прошивку под видом последней версии. Просто подняв DNS-сервер и заменив адрес. Все необходимое они собрали в один файл и инструкцию:
https://electro.club/data/users/2193/files/Xiaomi/9BDgrader.rar

И главное! Использовать версию приложения ДО 3.6.0
Приведенные там ссылки на старые версии не работают, постараюсь еще где-то найти.

Инструкцию выложу отдельно:​
https://electro.club/data/users/2193/files/Xiaomi/NineBot%20Mini%20Downgrade%20Readme.pdf​​

Проблема только в том, что самих прошивок нет :) И, кстати, на сайте ninebot.cn все старые прошивки трутся (или они поменяли адрес?). В общем, сейчас их там нет.

На всякий случай дублирую то, что удалось найти nicomunet123 на наш сервер, чтобы никуда не делось :) Но пытаться обновиться до этой версии я не рискну :)
https://electro.club/data/users/2193/files/Xiaomi/ESC_Driver_V1.0.4.zip
nicomunet123
Форумчанин
Rating: 146
nicomunet123
07 march 2017, 21:17
Posted: 07 march 2017, 21:17
Ответ пользователю
Vladimir Lavrulin : 04 march 2017, 8:50
на это сообщение (развернуть)
[цитата nicomunet123] Так поделитесь, пожалуйста :)
[quote="nicomunet123"]А пока я приблизительно понял, где запрос на сервер формируется в коде...​​[/quote]
Так поделитесь, пожалуйста :)
​Новые все прошивки качаются с сайта Xiaomi. Ну я так понял.
Я просто вбил в поиске по коду строчки из WireShark'a...
Приблизительное место нашел, но потом что-то подзабыл об этом.
(http://electrotransport.ru/ussr/index.php?topic=43910.msg1029960#msg1029960)​​​​
OLEG
Участник
Rating: 39
OLEG
09 march 2017, 16:25
Posted: 09 march 2017, 16:25
​​Найти Ninebot 3.5.1 не составило труда:
https://electro.club/data/users/2209/files/Ninebot351.rar

С процедурой даунгрейда тоже все понятно.​ Сложно будет разобрать, изменить и собрать прошивку в формате​​ bin. Как вы собираетесь это делать?
Answers: 1
Vladimir Lavrulin
Раздаю лайки
МоскваRating: 4836
Vladimir Lavrulin
09 march 2017, 16:54
Posted: 09 march 2017, 16:54
Ответ пользователю
OLEG : 09 march 2017, 16:25
на это сообщение (развернуть)
​​Найти Ninebot 3.5.1 не составило труда:https://electro.club/data/users/2209/files/Ninebot351.rarС процедурой даунгрейда тоже все...
​​Найти Ninebot 3.5.1 не составило труда:
https://electro.club/data/users/2209/files/Ninebot351.rar

С процедурой даунгрейда тоже все понятно.​ Сложно будет разобрать, изменить и собрать прошивку в формате​​ bin. Как вы собираетесь это делать?
​Приветствую, OLEG! А мы вот ждем когда к этой затее присоединиться еще и хороший низкоуровневый программист :) У Вас, случайно, нет подобных навыков?

Ну и гугл нам в помощь, конечно...​​
OLEG
Участник
Rating: 39
OLEG
09 march 2017, 22:03
Posted: 09 march 2017, 22:03
Нет, к сожалению я не по этой части.
Vladimir Lavrulin
Раздаю лайки
МоскваRating: 4836
Vladimir Lavrulin
06 april 2017, 10:22
Posted: 06 april 2017, 10:22
Ну вот с соседнего форума прилетели логи bluetooth обновления с 1.2.9 до 1.3.0

Снимались по этому методу:
http://stackoverflow.com/questions/23877761/sniffing-logging-your-own-android-bluetooth-traffic

Внутри два лога:
1. Соединение, обновление, отсоединение.
2. Соединение, отсоединение.

Файл копирую на наш диск для сохранности:
https://electro.club/data/users/2193/files/Xiaomi/xiaomi_bt_log.zip
 1   
lukaville
Гость
Rating: 2
lukaville
08 april 2017, 0:34
Posted: 08 april 2017, 0:34
Отписался на этом форуме:
 http://electrotransport.ru/ussr/index.php?topic=42849.msg1058294#msg1058294

Там есть ссылка на прошивку 1.3.0 и на proof-of-concept Android приложение, которое может отправлять запросы на самокат.
 2   
Vladimir Lavrulin
Раздаю лайки
МоскваRating: 4836
Vladimir Lavrulin
08 april 2017, 9:23
Posted: 08 april 2017, 9:23
lukaville, благодарю! :)

Ну и опять-таки, поскольку на электротранспорте все что касается прошивки находится в 10-ти сообщениях и разнесено в сотнях страниц 3-х разных тем, то я продолжаю пытаться соединить все в одно целое в этой теме :)

Перехваченный файл обновления представляет собой ZIP-архив:
https://electro.club/data/users/2193/files/Xiaomi/xiaomi_m365_update_130.zip

Также автором было разработано приложение, которое собирает все возможные значения. Рабочее название "Mijia Scooter Bluetooth Protocol Reverse Engineering" :) Исходники любезно предоставлены общественности:
https://github.com/lukaville/mijia-scooter-reverse-engineering

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


В целом проделана большая работа в этом направлении, автору однозначный респект! :)
 3   
Тарас
Участник
Rating: 42
Тарас
18 august 2017, 9:52
Posted: 18 august 2017, 9:52
всем привет. все прошивки которые сдесь выложены, на MAIN плату,не рабочие! При прошивке контроллера - ноль!
как проверял? брал обсолутно новую плату выпаивал контроллер, дабы сохранить прошивку, запаивал новый - шил на выходе полный ноль. Новая плата полностью рабочая НО в ПО зашито другие серийники на что идет постоянный писк, а в Ninebot apk показывает ошибку серийкиков. При этом все работает, но скорость макс ~12кмч точно не смотрел.  
 4   
Ed01
Продвинутый форумчанин
Rating: 584
Ed01
08 february 2018, 23:32
Posted: 08 february 2018, 23:32
[quote="Тарас"]Новая плата полностью рабочая НО в ПО зашито другие серийники на что идет постоянный писк[/quote]

Т.е был неактивированный контроллер? Вполне интересный результат.


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


Индивидуальные данные, возможно находятся в энергонезависимой памяти EEPROM (внутри чипа). Они похоже и отсутствуют.


Процесс обновления этих данных - есть Активация.  Вопрос лишь в том, затирается ли область EEPROM при снятии фьюза (защиты чипа ROP). То, что затирается прошивка во  Flash-памяти, это понятно. Но это другая область. Все ИМХО

Answers: 1
Тарас
Участник
Rating: 42
Тарас
10 february 2018, 2:45
Posted: 10 february 2018, 2:45

В srt32 нет eeprom.

Ed01
Продвинутый форумчанин
Rating: 584
Ed01
10 february 2018, 3:30
Posted: 10 february 2018, 3:30
[quote="Тарас"]В srt32 нет eeprom.[/quote]

Точно. C STM8 перепутал. В STM8 3 вида памяти.

Тогда проблема. И в каких адресах активация, совершенно не известно (

 1   
demonizer
Участник
Rating: 78
demonizer
19 february 2018, 23:15
Posted: 19 february 2018, 23:15
Ответ пользователю
Ed01 : 08 february 2018, 23:32
на это сообщение (развернуть)
[цитата Тарас] Т.е был неактивированный контроллер? Вполне интересный результат.Серийный номер контроллера...
[quote="Тарас"]Новая плата полностью рабочая НО в ПО зашито другие серийники на что идет постоянный писк[/quote]

Т.е был неактивированный контроллер? Вполне интересный результат.


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


Индивидуальные данные, возможно находятся в энергонезависимой памяти EEPROM (внутри чипа). Они похоже и отсутствуют.


Процесс обновления этих данных - есть Активация.  Вопрос лишь в том, затирается ли область EEPROM при снятии фьюза (защиты чипа ROP). То, что затирается прошивка во  Flash-памяти, это понятно. Но это другая область. Все ИМХО

Думаю, имеется в виду новый контроллер с родным STM-ом.

Если залить прошивку в голый камень, скорее всего, результат и будет нулевым.

Вариантов программной защиты может быть много, даже с корректным бинарником.


Например:

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

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

Ну это как вариант. Думаю, без дизассемблера здесь не обойтись. Буду качать ida и ковыряться.


 2   
demonizer
Участник
Rating: 78
demonizer
19 february 2018, 23:30
Posted: 19 february 2018, 23:30

Хотя, врядли что-то закодировано, в бинарнике в явном виде просмативается :"FLASH_NAME" (46 4c 41 53 48 5f 4e 41). Врядли это простое совпадение



 3   
Ed01
Продвинутый форумчанин
Rating: 584
Ed01
21 february 2018, 8:12
Posted: 21 february 2018, 8:12

BMS основана на микроконтроллере STM8L151K6T6.

Подключился к контактам не распаянного разьема через ST-Link. Он имеет SWIM-интерфейс.

Питание BMS было от самой батареи, поэтому 4-й контакт SWIM (3.3V) не использовался.

7931-84.jpg7933-84.jpg


С помощью программы STVP посмотрел две БМС. Защита ROP не установлена. Все фьюзы по умолчанию.

Прошивка хранится во Flash, серийный номер и прочее в EEPROM. В программе все данные разбиты по типам:

Program Memory, Data Memory и Оption Вyte. Это удобно для выборочной записи и чтения.

7934-84.jpg7935-84.jpg7936-84.jpg


Слил дамп памяти сток-прошивок v1.0.7 и 1.1.5 (включая boot) в HEX-формате:

bms_program_memory_v1.0.7.zipbms_program_memory_v1.1.5.zip


Дампы прошивок универсальны, а дамп EEPROM подходит только для родной БМС. Поэтому его не выкладываю.

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


Откатил версию прошивки вперед и назад - все отлично. Перепрошивка не затрагивает область данных.

Поменял в прошивке число 7800 (0x1E78) на реальную емкость своей батареи. Оно там встречается 4 раза.

---

p.s Все действия на свой страх и риск. Если потерять содержимое области данных, можно потерять БМС.

Answers: 1

 10   
demonizer
Участник
Rating: 78
demonizer
21 february 2018, 11:56
Posted: 21 february 2018, 11:56
Ответ пользователю
Ed01 : 21 february 2018, 8:12
на это сообщение (развернуть)
BMS основана на микроконтроллере STM8L151K6T6.Подключился к контактам не распаянного разьема через...

BMS основана на микроконтроллере STM8L151K6T6.

Подключился к контактам не распаянного разьема через ST-Link. Он имеет SWIM-интерфейс.

Питание BMS было от самой батареи, поэтому 4-й контакт SWIM (3.3V) не использовался.

7931-84.jpg7933-84.jpg


С помощью программы STVP посмотрел две БМС. Защита ROP не установлена. Все фьюзы по умолчанию.

Прошивка хранится во Flash, серийный номер и прочее в EEPROM. В программе все данные разбиты по типам:

Program Memory, Data Memory и Оption Вyte. Это удобно для выборочной записи и чтения.

7934-84.jpg7935-84.jpg7936-84.jpg


Слил дамп памяти сток-прошивок v1.0.7 и 1.1.5 (включая boot) в HEX-формате:

bms_program_memory_v1.0.7.zipbms_program_memory_v1.1.5.zip


Дампы прошивок универсальны, а дамп EEPROM подходит только для родной БМС. Поэтому его не выкладываю.

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


Откатил версию прошивки вперед и назад - все отлично. Перепрошивка не затрагивает область данных.

Поменял в прошивке число 7800 (0x1E78) на реальную емкость своей батареи. Оно там встречается 4 раза.

---

p.s Все действия на свой страх и риск. Если потерять содержимое области данных, можно потерять БМС.

Очень интересная инфа, спасибо!.


По поводу прошивки контроллера, появилась мысль написать свою, в сущности, задача довольно тривиальная: Управление BLDC-мотором, примеров в сети валом, да и ST-шники выпустили апноуты. Обратная связь - датчики Холла + BackEMF.

Сопряжение с головной платой и бмс. По протоколам обмена проблем нет, положения курка газа и рычага тормоза уже прилетают в цифре.

Что потеряем: скорее всего, возможность обновления прошивки через штатное приложение.

Что приобретем: невероятно гибкую настройку, работу с любыми батареями без обманок, как минимум, сэкономится место в деке)

 6