{"id":480833,"date":"2026-05-24T21:13:51","date_gmt":"2026-05-24T21:13:51","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=480833"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=480833","title":{"rendered":"\u0420\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433 Xiaomi Smart Band 10"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<blockquote>\n<p><strong>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440:<\/strong>\u00a0\u0412\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0446\u0435\u043b\u044f\u0445 \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u043e\u0441\u0438\u0442 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0438\u0437\u044b\u0432\u043e\u0432 \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0447\u0443\u0436\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c, \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043a\u043b\u044e\u0447\u0435\u0439 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u043b\u0438\u0446.<\/p>\n<\/blockquote>\n<p>\u0423 \u043d\u043e\u0441\u0438\u043c\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441: \u0431\u0440\u0430\u0441\u043b\u0435\u0442 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u0432\u0430\u0448\u0438 \u043f\u0443\u043b\u044c\u0441, \u0441\u043e\u043d \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e API \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0411\u0414) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Xiaomi Mi Fitness \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u00ab\u0437\u0430\u043f\u0435\u0440\u0442\u044b\u043c\u0438\u00bb \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u0447\u0438\u0441\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439: \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e SQLite-\u0431\u0430\u0437\u0443 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u0441\u0435\u043c\u0435\u0439\u043d\u044b\u0439 Telegram-\u0431\u043e\u0442. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0440\u0430\u0441\u043b\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0430 \u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c Xiaomi, \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u0435\u0442\u0438. \u041d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u043a\u0430\u043a \u0438\u0445 \u0437\u0430\u0431\u0440\u0430\u0442\u044c.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f &#8212; \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0443\u0442\u0438 \u043e\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 CA \u0434\u043e \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430 RC4-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Xiaomi, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 AES\/CBC-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 FDS \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0441\u043d\u0430.<\/p>\n<h4>TL;DR (\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c)<\/h4>\n<ul>\n<li>\n<p><strong>\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435:<\/strong>\u00a0\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Mi Fitness \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c Xiaomi Health Cloud.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f:<\/strong>\u00a0\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0434\u0435\u043a\u0440\u0438\u043f\u0442 RC4-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 (\u0441 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0445 1024 \u0431\u0430\u0439\u0442 keystream) \u0438 AES\/CBC \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0441\u043b\u0435\u043f\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u0424\u043e\u0440\u043c\u0430\u0442:<\/strong>\u00a0\u041d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0430\u0440\u0441\u0435\u0440 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 Xiaomi FDS \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0441\u043d\u0430, \u043f\u0443\u043b\u044c\u0441\u0430 \u0438 \u043a\u0438\u0441\u043b\u043e\u0440\u043e\u0434\u0430 \u0432 \u043a\u0440\u043e\u0432\u0438 (SpO2).<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430:<\/strong>\u00a0\u041e\u0442\u043a\u0440\u044b\u0442\u00a0<a href=\"https:\/\/github.com\/iAlexeyRu\/miband-bot\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 GitHub<\/a>\u00a0\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d \u0432 \u0434\u0432\u0430 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0441 SQLite + Telegram-\u0431\u043e\u0442 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430).<\/p>\n<\/li>\n<\/ul>\n<h4>\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430<\/h4>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438, \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \/ \u0412\u0435\u0440\u0441\u0438\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Xiaomi Mi Fitness (Android) v3.55.0i<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Xiaomi Smart Band 10<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0410\u043a\u043a\u0430\u0443\u043d\u0442<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u0433\u0438\u043e\u043d: RU (Russian IDC)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0414\u0430\u0442\u0430 \u0430\u0443\u0434\u0438\u0442\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0430\u0439 2026 \u0433\u043e\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0421\u0442\u0435\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Python 3.11, SQLite, Docker, Aiogram<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0430\u0440\u0442\u0430 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043b\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 endpoint-\u044b, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4c9\/a6f\/f80\/4c9a6ff80f7f4f2a4663a53e4890e5c4.png\" alt=\"\u041a\u0430\u0440\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4c9\/a6f\/f80\/4c9a6ff80f7f4f2a4663a53e4890e5c4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4c9\/a6f\/f80\/4c9a6ff80f7f4f2a4663a53e4890e5c4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u0430\u0440\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0411\u0440\u0430\u0441\u043b\u0435\u0442 \u043e\u0442\u0434\u0430\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e. \u041e\u0431\u043b\u0430\u043a\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 JSON-\u043e\u0442\u0432\u0435\u0442\u0430\u0445, \u0430 \u0447\u0430\u0441\u0442\u044c &#8212; \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 FDS. \u041d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0435\u0437 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0432 \u0440\u0443\u043a\u0430\u0445.<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0439 \u0438\u0434\u0435\u0435\u0439 \u0431\u044b\u043b \u043f\u0440\u044f\u043c\u043e\u0439 Linux-sync \u0441 \u0431\u0440\u0430\u0441\u043b\u0435\u0442\u043e\u043c. \u0414\u043b\u044f \u0441\u0442\u0430\u0440\u044b\u0445 Mi Band \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0447\u0435\u0440\u0435\u0437 BLE, \u0434\u043b\u044f Gadgetbridge \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043d\u043e Mi Band 10 \u0438 \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438\u043c. \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c auth key, \u0431\u043e\u0440\u043e\u0442\u044c\u0441\u044f \u0441 BLE-\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0444\u0440\u043e\u043d\u0442.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u043e\u043a\u0443\u0441 \u0441\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u043d\u0430 \u043e\u0431\u043b\u0430\u043a\u043e Xiaomi. \u0415\u0441\u043b\u0438 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0440\u0430\u0441\u043b\u0435\u0442, \u043f\u0443\u0441\u0442\u044c \u043e\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u0414\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439: \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f, \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0439 \u0442\u0443\u043f\u0438\u043a: iOS, Stream \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 CONNECT<\/h3>\n<p>\u041d\u0430\u0447\u0430\u043b \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0433\u043e: \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e Mi Fitness \u043d\u0430 iPhone. \u0414\u043b\u044f iOS \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 Stream: \u043e\u043d\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 VPN\/HTTPS-\u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u0443\u043c\u0435\u044e\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c HAR.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442, \u043e\u0442\u043a\u0440\u044b\u043b Mi Fitness, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0431\u0440\u0430\u0441\u043b\u0435\u0442. \u0412 HAR \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438. \u041d\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f:<\/p>\n<pre><code>CONNECT ru.hlth.io.mi.com:443status: 0content: { size: 0, text: \"\" }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u043c\u043d\u043e\u0433\u043e. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u00a0<a href=\"http:\/\/ru.hlth.io.mi.com\" rel=\"noopener noreferrer nofollow\"><code>ru.hlth.io.mi.com<\/code><\/a>, \u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u043f\u0443\u0441\u0442\u043e. \u041f\u0440\u043e\u043a\u0441\u0438 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043c\u0430\u0448\u0438\u043d\u0430 \u043f\u043e\u0434\u044a\u0435\u0445\u0430\u043b\u0430 \u043a \u0432\u043e\u0440\u043e\u0442\u0430\u043c, \u043d\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u0431\u0430\u0433\u0430\u0436\u043d\u0438\u043a\u0435.<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 &#8212; SSL pinning. \u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u043c HTTPS \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0446\u0435\u043d\u0442\u0440\u0430\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. MITM-\u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u201c\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439\u201d, \u0438 \u0442\u0440\u0430\u0444\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u0436\u0435: \u043e\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Xiaomi \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e.<\/p>\n<p>\u042d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0435 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0430\u0441\u043f\u043e\u0440\u0442\u0430 \u043f\u043e \u0431\u0430\u0437\u0435, \u0430 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0443 \u043f\u0430\u043b\u044c\u0446\u0430. Stream \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, iOS \u043c\u043e\u0436\u0435\u0442 \u0435\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u043e Mi Fitness \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u201c\u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u043d\u0435 \u0442\u043e\u0442\u201d, \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/103\/72e\/613\/10372e613c2065ce6675b85bbb629eb5.png\" alt=\"\u041f\u043e\u0447\u0435\u043c\u0443 MITM \u043d\u0430 iOS \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e CONNECT\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/103\/72e\/613\/10372e613c2065ce6675b85bbb629eb5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/103\/72e\/613\/10372e613c2065ce6675b85bbb629eb5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0447\u0435\u043c\u0443 MITM \u043d\u0430 iOS \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e CONNECT<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 iOS \u0431\u0435\u0437 jailbreak \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c HTTPS sniffing, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d\u044b, \u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, HAR \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c\u00a0<code>CONNECT<\/code>.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0443\u0436\u0435\u043d Android.<\/p>\n<h3>Android \u0431\u0435\u0437 root: \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443<\/h3>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u0440\u0430\u0437\u0432\u0438\u043b\u043a\u0430: Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0443\u0442\u043e\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0446\u0435\u043d\u0442\u0440\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (CA) \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: \u043f\u0435\u0440\u0435\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c APK \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0440\u0435\u0434\u0435.<\/p>\n<p>\u0421\u043a\u0430\u0447\u0430\u043b Mi Fitness \u0441 APKMirror. \u0412\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e\u00a0<code>.apk<\/code>\u00a0\u043f\u0440\u0438\u0435\u0445\u0430\u043b \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439\u00a0<code>.apkm<\/code>\u00a0bundle: \u0432\u043d\u0443\u0442\u0440\u0438\u00a0<code>base.apk<\/code>\u00a0\u0438 \u043d\u0430\u0431\u043e\u0440 split APK \u043f\u043e\u0434 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u044f\u0437\u044b\u043a \u0438 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<pre><code class=\"bash\">unzip com.xiaomi.wearable_3.55.0i-...apkm -d mi_fitness_extractedls mi_fitness_extracted<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0431\u044b\u043b\u0438, \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e:<\/p>\n<pre><code>base.apksplit_config.arm64_v8a.apksplit_config.ru.apksplit_config.xxhdpi.apksplit_config.en.apk<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u0448\u0451\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Android-\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 pipeline:\u00a0<code>apktool<\/code>, network security config, \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 split APK. \u041d\u043e \u0431\u0435\u0437 \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0435 \u0432\u044b\u0448\u043b\u043e.<\/p>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u00a0<code>apk-mitm<\/code>\u00a0\u0443\u043f\u0430\u043b \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0435:<\/p>\n<pre><code>[Fatal Error] :1107:143: The entity name must immediately follow the '&amp;' in the entity reference.AndroidManifest.xml:1107: error: not well-formed (invalid token).<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043c\u044b\u0441\u043b \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u00a0<code>&amp;<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 XML-\u043f\u0430\u0440\u0441\u0435\u0440 \u0445\u043e\u0442\u0435\u043b \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u043a\u00a0<code>&amp;amp;<\/code>. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 Xiaomi \u0441 \u044d\u0442\u0438\u043c \u0436\u0438\u0432\u0451\u0442, \u0430 \u0441\u0442\u0440\u043e\u0433\u0438\u0439\u00a0<code>apktool<\/code>\u00a0\u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u0434\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e:<\/p>\n<pre><code class=\"bash\">apktool d mi_fitness_extracted\/base.apk -o mi_fitness_decoded<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u00a0<code>res\/xml\/network_security_config.xml<\/code>\u00a0\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;&lt;network-security-config&gt;    &lt;base-config cleartextTrafficPermitted=\"true\"&gt;        &lt;trust-anchors&gt;            &lt;certificates src=\"system\"\/&gt;            &lt;certificates src=\"user\"\/&gt;        &lt;\/trust-anchors&gt;    &lt;\/base-config&gt;&lt;\/network-security-config&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u00a0<code>AndroidManifest.xml<\/code>\u00a0\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430:<\/p>\n<pre><code class=\"xml\">android:networkSecurityConfig=\"@xml\/network_security_config\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e APK \u0441\u043e\u0431\u0440\u0430\u043b\u0441\u044f:<\/p>\n<pre><code class=\"bash\">apktool b mi_fitness_decoded -o mi_fitness_patched.apk<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e Android \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 APK \u0431\u0435\u0437 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u0410 split APK \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u043a\u043b\u044e\u0447\u043e\u043c. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<code>base.apk<\/code>, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u043e \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u043c\u00a0<code>jarsigner<\/code>, Android \u043c\u043e\u0436\u0435\u0442 \u0440\u0443\u0433\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 Signature Scheme v2.<\/p>\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438\u0441\u044c\u00a0<code>apksigner<\/code>\u00a0and\u00a0<code>zipalign<\/code>\u00a0(\u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0443\u0442\u044c \u0434\u043b\u044f macOS \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c Homebrew Android SDK; \u0434\u043b\u044f Linux \u0438 Windows \u043f\u0443\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u0430 \u0435\u0441\u043b\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 PATH, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u00a0<code>apksigner<\/code>):<\/p>\n<pre><code class=\"bash\"># \u0414\u043b\u044f macOS Homebrew \u043f\u0443\u0442\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a. \u0412 Windows\/Linux \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0432\u0430\u0448 \u043f\u0443\u0442\u044c \u043a Android SDK build-tools.APKSIGNER=\/opt\/homebrew\/share\/android-commandlinetools\/build-tools\/34.0.0\/apksignerfor apk in mi_fitness_patched.apk \\  mi_fitness_extracted\/split_config.arm64_v8a.apk \\  mi_fitness_extracted\/split_config.ru.apk \\  mi_fitness_extracted\/split_config.xxhdpi.apk \\  mi_fitness_extracted\/split_config.en.apk; do  \"$APKSIGNER\" sign --ks my.keystore \\    --ks-pass pass:&lt;LOCAL_PASSWORD&gt; \\    --key-pass pass:&lt;LOCAL_PASSWORD&gt; \\    \"$apk\"done<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0440\u043e\u043c\u0430\u043d\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u043d\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u201c\u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438 \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e\u201d \u0438\u0441\u0442\u043e\u0440\u0438\u044f, \u0430 \u0441\u0435\u0440\u0438\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0431\u044b\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a: \u043d\u0435 \u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u0434\u043e\u00a0<code>apksigner<\/code>, \u043f\u043e\u0434\u043f\u0438\u0441\u0438 v1 \u0432\u043c\u0435\u0441\u0442\u043e v2, split APK \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044f\u043c\u0438, \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u0438\u043d\u00a0<code>base.apk<\/code>\u00a0\u043d\u0430 ARM64-\u0442\u0435\u043b\u0435\u0444\u043e\u043d. \u041d\u043e \u0438\u0442\u043e\u0433 \u0431\u044b\u043b \u043d\u0443\u0436\u043d\u044b\u0439:\u00a0<strong>\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 Mi Fitness \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u043c Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0431\u0435\u0437 root<\/strong>.<\/p>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 patched APK \u0441\u0445\u0435\u043c\u0430 \u0441\u0442\u0430\u043b\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0439:<\/p>\n<pre><code>Android phone -&gt; Wi-Fi proxy -&gt; mitmproxy on Mac -&gt; Xiaomi Cloud<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b CA mitmproxy \u0447\u0435\u0440\u0435\u0437\u00a0<a href=\"http:\/\/mitm.it\" rel=\"noopener noreferrer nofollow\"><code>http:\/\/mitm.it<\/code><\/a>, \u0432 Wi-Fi \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0430 IP Mac \u0438 \u043f\u043e\u0440\u0442\u00a0<code>8080<\/code>. \u041d\u0430 Mac \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u00a0<code>mitmweb<\/code>\u00a0\u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u043e \u043d\u0443\u0436\u043d\u044b\u043c \u0434\u043e\u043c\u0435\u043d\u0430\u043c.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u044b\u0435\u00a0<code>CONNECT<\/code>, \u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 HTTPS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b:<\/p>\n<pre><code>ru.hlth.io.mi.comsts-hlth.io.mi.comru.watch.iot.mi.comaccount.xiaomi.com<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0440\u0435\u0434\u0438 \u043f\u0443\u0442\u0435\u0439 \u0431\u044b\u043b\u0438:<\/p>\n<pre><code>\/healthapp\/privacy\/get_privacy_change\/app\/v1\/data\/get_aggregated_fitness_data_by_watermark\/app\/v1\/data\/get_project_data_by_time\/app\/v1\/statistics\/get_stat_data_by_time\/app\/v1\/eco\/api_proxy\/healthapp\/service\/gen_download_url\/healthapp\/user\/get_miot_user_profile<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 cookies:<\/p>\n<pre><code>Cookie: cUserId=&lt;REDACTED&gt;; serviceToken=&lt;REDACTED&gt;; userId=&lt;REDACTED&gt;User-Agent: Android-16-3.55.0i-...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430\u0438\u0432\u043d\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c. \u0422\u043e\u043a\u0435\u043d \u043d\u0430 \u0440\u0443\u043a\u0430\u0445, endpoint-\u044b \u0442\u043e\u0436\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c Python-\u043a\u043b\u0438\u0435\u043d\u0442.<\/p>\n<p>\u041d\u0435\u0442.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 curl \u043f\u043e\u043b\u0443\u0447\u0438\u043b 401<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442 \u0431\u044b\u043b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c: \u0432\u0437\u044f\u0442\u044c\u00a0<code>serviceToken<\/code>,\u00a0<code>cUserId<\/code>,\u00a0<code>User-Agent<\/code>\u00a0\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437\u00a0<code>curl<\/code>.<\/p>\n<pre><code class=\"bash\">curl -i -X POST \\  'https:\/\/ru.hlth.io.mi.com\/healthapp\/privacy\/get\\_privacy\\_change?locale=ru\\_by' \\  -H \"Cookie: cUserId=&lt;REDACTED&gt;; serviceToken=&lt;REDACTED&gt;; locale=ru_by\" \\  -H \"User-Agent: Android-16-3.55.0i-...\" \\  -H \"Content-Type: application\/json; charset=utf-8\" \\  --data '{}'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u0432\u0435\u0442:<\/p>\n<pre><code class=\"json\">{\"code\":0,\"message\":\"auth err\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b \u0432\u0430\u0436\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442. \u0422\u043e\u043a\u0435\u043d \u0438\u0437 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u0431\u044b\u043b \u0436\u0438\u0432\u043e\u0439: \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0438\u043c \u0445\u043e\u0434\u0438\u043b\u043e. \u041d\u043e Xiaomi Health API \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u201c\u0433\u043e\u043b\u044b\u0439\u201d JSON-\u0437\u0430\u043f\u0440\u043e\u0441. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code>_noncedatasignaturerc4_hash__ssecurity<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445 HTTPS \u0431\u044b\u043b \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u0439. HTTPS \u0437\u0430\u0449\u0438\u0449\u0430\u043b \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442, \u0430 Xiaomi \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043b\u0430 \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u0441\u044b\u043b\u043a\u043e\u0439: \u0432\u044b \u0443\u0436\u0435 \u043f\u043e\u043f\u0430\u043b\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0430\u0441\u043f\u043e\u0440\u0442, \u043d\u043e \u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u043f\u0435\u0440\u0442\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043c\u043e\u043a.<\/p>\n<h3>RC4-\u0441\u043b\u043e\u0439: \u0438\u0449\u0435\u043c \u043a\u043b\u044e\u0447 \u0432 APK<\/h3>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0431\u044b\u043b \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u041d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0431\u044b\u043b APK, \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 request\/response,\u00a0<code>_nonce<\/code>\u00a0\u0438\u00a0<code>ssecurity<\/code>. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e \u0448\u0438\u0444\u0440\u0443\u0435\u0442 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u042f \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b APK \u0447\u0435\u0440\u0435\u0437\u00a0<code>jadx<\/code>\u00a0\u0438 \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"bash\">rg -n \"rc4_hash__|_nonce|ssecurity|security|RC4|decrypt|encrypt\" jadx_mifitness<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448\u0451\u043b\u0441\u044f \u0432 \u043a\u043e\u0434\u0435 Xiaomi SmartHome:<\/p>\n<pre><code>SmartHomeRc4Api.javaRC4DropCoder.java<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043c\u044b\u0441\u043b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"python\">key = sha256(base64decode(ssecurity) + base64decode(_nonce))plaintext = rc4_drop1024(ciphertext, key)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>drop1024<\/code>\u00a0\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0435 1024 \u0431\u0430\u0439\u0442\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e RC4 keystream \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 \u0430\u0442\u0430\u043a \u043d\u0430 \u0441\u043b\u0430\u0431\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 (weak key attacks), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c \u0431\u0430\u0439\u0442\u0430\u043c \u043f\u043e\u0442\u043e\u043a\u0430. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435: \u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c 1024 \u0431\u0430\u0439\u0442\u0430, \u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0443\u0441\u043e\u0440.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e request-\u043e\u0432. \u042d\u0442\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u043e\u0435:<\/p>\n<pre><code class=\"json\">{\"eco_api\":\"\/bs\/bind\/devices\",\"params\":\"{\\\"page\\\":1,\\\"pageSize\\\":50,\\\"status\\\":1}\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0442\u043e\u043c \u044f \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 base64, gzip \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code>106 request payloads58 response payloads<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/98f\/aaf\/b70\/98faafb7022413b753c657595399a591.png\" alt=\"\u041b\u0435\u0441\u0442\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0451\u0432\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/98f\/aaf\/b70\/98faafb7022413b753c657595399a591.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/98f\/aaf\/b70\/98faafb7022413b753c657595399a591.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041b\u0435\u0441\u0442\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0451\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f response \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0442\u0430\u043a:<\/p>\n<pre><code>HTTP response body-&gt; gzip layer from mitmproxy\/raw body-&gt; base64 decode-&gt; RC4 drop1024 with sha256(ssecurity + _nonce)-&gt; JSON<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0437\u0434\u0435\u0441\u044c \u0441\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0443\u0440\u043e\u043a:\u00a0<strong>\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 API \u0440\u0435\u0434\u043a\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c<\/strong>. \u0418\u043d\u043e\u0433\u0434\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0443\u0436\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 gzip \u0438\u043b\u0438 \u043f\u043e\u0442\u043e\u043c gzip, base64 URL-safe \u0438\u043b\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 base64, \u0433\u0434\u0435 \u0431\u0440\u0430\u0442\u044c nonce, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043b \u043b\u0438 \u0442\u0435\u043b\u043e \u0441\u0430\u043c proxy.<\/p>\n<h3>JSON \u0435\u0441\u0442\u044c, \u043d\u043e \u043d\u0443\u0436\u043d\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0441\u043d\u0430 \u0432 \u043d\u0451\u043c \u043d\u0435\u0442<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 RC4 \u044f \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0443\u0432\u0438\u0434\u0435\u043b \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 JSON-\u043e\u0442\u0432\u0435\u0442\u044b. \u0422\u0430\u043c \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u0438, \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u043e\u0442\u0432\u0435\u0442\u044b health API. \u041d\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u0447\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0443\u043b\u044c\u0441\u0430 \u0438 SpO2 \u043d\u0435 \u043b\u0435\u0436\u0430\u043b\u0438 \u043f\u0440\u044f\u043c\u043e \u0432 \u044d\u0442\u0438\u0445 JSON \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0432\u0438\u0434\u0430\u00a0<code>[{time, value}]<\/code>.<\/p>\n<p>\u0427\u0430\u0441\u0442\u044c endpoint-\u043e\u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u043f\u0443\u0441\u0442\u043e \u0438\u043b\u0438 \u201c\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c IDC\u201d:<\/p>\n<pre><code class=\"json\">{\"data_list\":[],\"has_more\":false,\"watermark\":0}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code class=\"json\">{\"code\":-6,\"message\":\"unsupport in current IDC\",\"result\":null}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0432\u043e\u0442 endpoint\u00a0<code>\/healthapp\/service\/gen_download_url<\/code>\u00a0\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043a\u0443\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. \u0412 \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"json\">{  \"result\": {    \"&lt;suffix&gt;_&lt;timestamp&gt;\": {      \"url\": \"&lt;SIGNED_FDS_URL&gt;\",      \"obj_name\": \"&lt;FDS_OBJECT_NAME&gt;\",      \"obj_key\": \"&lt;REDACTED&gt;\"    }  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e, \u0447\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u043d\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c API-\u043e\u0442\u0432\u0435\u0442\u0435, \u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0432 Xiaomi FDS.<\/p>\n<p>FDS \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u043a\u043b\u0430\u0434 \u043a\u043e\u0440\u043e\u0431\u043e\u043a. Health API \u043d\u0435 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0430\u043c\u0443 \u043a\u043e\u0440\u043e\u0431\u043a\u0443, \u043e\u043d \u0432\u044b\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a: signed URL. \u0421 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0441\u043a\u043b\u0430\u0434 \u0438 \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442. \u041d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u0430\u043a \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u043b\u0435\u0436\u0438\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0430.<\/p>\n<h3>FDS-\u0444\u0430\u0439\u043b: \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e JSON<\/h3>\n<p>\u0421\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0439 FDS-\u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043b\u0438\u043d\u043e\u0439 \u043e\u043a\u043e\u043b\u043e 43 KB:<\/p>\n<pre><code>nBfra1HbEwa_dzNGuWmTVNXzJ-U-kDxS...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>file<\/code>\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b \u0435\u0433\u043e \u043a\u0430\u043a:<\/p>\n<pre><code>ASCII text, with very long lines, with no line terminators<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b \u043d\u0435 JSON. \u041d\u0435 protobuf. \u041d\u0435 gzip \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435. \u041f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u0438\u043d\u043d\u0430\u044f base64\/base64url-\u0441\u0442\u0440\u043e\u043a\u0430.<\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u043f\u043e APK \u0441\u043d\u043e\u0432\u0430 \u0434\u0430\u043b \u043e\u0442\u0432\u0435\u0442. \u0412 \u043a\u043e\u0434\u0435 \u043d\u0430\u0448\u0451\u043b\u0441\u044f\u00a0<code>FitnessFDSUploader<\/code>, \u0433\u0434\u0435 \u043b\u043e\u0433\u0438\u043a\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e\u0447\u0442\u0438 \u043f\u0440\u044f\u043c\u044b\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c \u043a \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435:<\/p>\n<pre><code>downloadFromFDSdownload: aes decrypt faileddownload objectKey is null<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0437\u0430\u0442\u0435\u043c \u0441\u0442\u0430\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435:<\/p>\n<pre><code class=\"java\">new AESCoder(objectKey).decrypt(downloadedText)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u00a0<code>AESCoder<\/code>, \u0438 \u0441\u043b\u043e\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c:<\/p>\n<pre><code>AES\/CBC\/PKCS5PaddingIV = \"1234567887654321\"key = Base64.decode(obj_key, 8)data = Base64.decode(downloadedText, 11)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 Python \u044d\u0442\u043e \u0441\u0432\u0435\u043b\u043e\u0441\u044c \u043a \u0442\u0430\u043a\u043e\u0439 \u0438\u0434\u0435\u0435:<\/p>\n<pre><code class=\"python\">key = android_base64_decode(obj_key, flags=8)ciphertext = android_base64_decode(downloaded_text, flags=11)cipher = AES.new(key, AES.MODE_CBC, b\"1234567887654321\")plaintext = unpad(cipher.decrypt(ciphertext), 16)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 AES-\u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\u00a0<code>pkcs7.bin<\/code>\u00a0(\u043d\u0430\u0437\u0432\u0430\u043b \u0435\u0433\u043e \u0442\u0430\u043a \u0432 \u0447\u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432 PKCS#7 padding). \u0424\u0430\u0439\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043e\u043a\u043e\u043b\u043e 32 KB. \u042d\u0442\u043e \u0431\u044b\u043b \u0443\u0436\u0435 \u043d\u0435 \u0448\u0438\u0444\u0440\u0442\u0435\u043a\u0441\u0442. \u041d\u043e \u0438 \u043d\u0435 JSON.<\/p>\n<h3>\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442: \u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u0431\u0435\u0437 \u044d\u0442\u0438\u043a\u0435\u0442\u043e\u043a<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0438 \u0442\u0430\u043a:<\/p>\n<pre><code>94 b5 0f 6a 0c 05 00 df c0 01 ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>If you read the first four bytes as a little-endian integer, you get a timestamp:<\/p>\n<pre><code>0x6a0fb594 -&gt; 1779414420<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u0439\u0442:<\/p>\n<pre><code>0c -&gt; 12<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u041c\u043e\u0441\u043a\u0432\u044b UTC+3 \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e 12 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043f\u043e 15 \u043c\u0438\u043d\u0443\u0442. \u0422\u043e \u0435\u0441\u0442\u044c timezone \u0432 \u044d\u0442\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0435 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u0430 \u0432 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044f\u0445 \u0447\u0430\u0441\u0430.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435:<\/p>\n<pre><code>05 -&gt; version 500 -&gt; type marker<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 APK:<\/p>\n<pre><code>FitnessDataIdFitnessDataHeaderFitnessDataParser<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c3c\/920\/fdb\/c3c920fdb0d8eb2995529e3243234a09.png\" alt=\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 Mi Fitness\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c3c\/920\/fdb\/c3c920fdb0d8eb2995529e3243234a09.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c3c\/920\/fdb\/c3c920fdb0d8eb2995529e3243234a09.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 Mi Fitness<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c: \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 blob &#8212; \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u201c\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0443\u0441\u043e\u0440\u201d. \u0427\u0430\u0441\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0435\u0437 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0438\u043c\u0451\u043d. \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0451 \u0447\u0438\u0442\u0430\u0435\u0442, \u043e\u043d\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>\u041f\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 all-day sleep:<\/p>\n<pre><code>bytes 0..3   timestamp, little-endianbyte  4      timezone in 15-minute unitsbyte  5      versionbyte  6      type markerbytes 7..8   data_valid bitsetthen         report fieldsthen         assist-info arrays: HR, SpO2, ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u0439 \u043e\u0442\u0447\u0451\u0442\u0430:<\/p>\n<pre><code>sleepFinishdeviceBedTimedeviceWakeupTimesleepQualitysleepEfficiencyentrySleepDurationlinBedDurationgoBedTimeleaveBedTime<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0443\u043b\u044c\u0441\u0430 \u0438 SpO2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code>int16 intervalint16 record_countuint32 start_time    # \u0434\u043b\u044f version &gt;= 2byte[record_count] values<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432 Python \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def parse_sleep_assist_info(b, pos, byte_count, version):    interval = struct.unpack_from(\"&lt;h\", b, pos)[0]    record_count = struct.unpack_from(\"&lt;h\", b, pos + 2)[0]    pos += 4    start_time = 0    if version &gt;= 2:        start_time = struct.unpack_from(\"&lt;I\", b, pos)[0]        pos += 4    values = []    for _ in range(record_count):        values.append(b[pos])        pos += byte_count    return {        \"start_time\": start_time,        \"interval\": interval,        \"record_count\": record_count,        \"values\": values,    }, pos<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 FDS-\u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24f\/24a\/57c\/24f24a57c11291bba4a4c9da2fe53900.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 FDS\" width=\"1400\" height=\"740\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/24f\/24a\/57c\/24f24a57c11291bba4a4c9da2fe53900.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24f\/24a\/57c\/24f24a57c11291bba4a4c9da2fe53900.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 FDS<\/figcaption><\/div>\n<\/figure>\n<h3>\u0427\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u043e\u0447\u043d\u043e\u0433\u043e FDS-\u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043c JSON summary.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>FDS content length: 43904Parsed 326 HR readings and 42 SpO2 readings from FDS.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u043e\u0447\u0438:<\/p>\n<pre><code>FDS content length: 44544Parsed 348 HR readings and 44 SpO2 readings from FDS.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u201c\u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043b\u044c\u0441 \u0437\u0430 \u043d\u043e\u0447\u044c\u201d \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0440\u044f\u0434. \u041d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u0431\u043e\u0440, \u043d\u0435 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043d\u043e \u0443\u0436\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f: \u043a\u043e\u0433\u0434\u0430 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0432\u0430\u043b\u044b SpO2, \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043f\u0443\u043b\u044c\u0441, \u0432 \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0441\u043e\u043d \u0431\u044b\u043b \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u043d\u044b\u043c.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430:<\/p>\n<pre><code class=\"json\">{  \"report\": {    \"sleepFinish\": true,    \"deviceBedTime\": \"&lt;TIMESTAMP&gt;\",    \"deviceWakeupTime\": \"&lt;TIMESTAMP&gt;\",    \"sleepEfficiency\": 92  },  \"records\": {    \"heart_rate\": [      [\"&lt;TIMESTAMP&gt;\", 76],      [\"&lt;TIMESTAMP&gt;\", 69]    ],    \"spo2\": [      [\"&lt;TIMESTAMP&gt;\", 95],      [\"&lt;TIMESTAMP&gt;\", 96]    ]  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u0430 \u0441\u0430\u043c \u0444\u0430\u043a\u0442: Mi Fitness \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 FDS, \u043e\u043d\u0438 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043b\u043e\u044f\u043c\u0438, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u044f\u0434\u0430\u043c\u0438.<\/p>\n<h3>\u0421\u0430\u043c\u0430\u044f \u043e\u0431\u0438\u0434\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: 404 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0431\u0435\u0434\u044b<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 RC4, STS\/FDS \u0438 AES \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b, \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430:\u00a0<code>gen_download_url<\/code>\u00a0\u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u0430\u0432\u0430\u043b \u0441\u0441\u044b\u043b\u043a\u0443, \u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u043e\u00a0<code>404 Object Not Found<\/code>.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e: \u0442\u043e\u043a\u0435\u043d \u043f\u0440\u043e\u0442\u0443\u0445, STS \u043d\u0435 \u0442\u043e\u0442, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430\u044f. \u041d\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0432 \u0438\u043c\u0435\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>FDS object key \u0441\u0442\u0440\u043e\u0438\u043b\u0441\u044f \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 &#8212; suffix, \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 timestamp, timezone, dailyType \u0438 fileType. \u0412 \u043a\u043e\u0434\u0435 \u0431\u044b\u043b \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440:<\/p>\n<pre><code class=\"python\">def gen_data_id_key_bytes(timestamp, tz_in_15min, daily_type, file_type):    data_type_byte = (daily_type &lt;&lt; 2) + file_type    return struct.pack(\"&lt;IbB\", timestamp, tz_in_15min, data_type_byte)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432 timezone. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0441\u0447\u0438\u0442\u0430\u043b, \u0447\u0442\u043e timezone \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u0438 \u0434\u0435\u043b\u0430\u043b:<\/p>\n<pre><code class=\"python\">tz_in_15min = timezone_value \/\/ 900<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0434\u043b\u044f sleep segment Xiaomi \u0443\u0436\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u0430 timezone \u0432 15-\u043c\u0438\u043d\u0443\u0442\u043d\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445. \u0414\u043b\u044f \u041c\u043e\u0441\u043a\u0432\u044b \u044d\u0442\u043e \u0431\u044b\u043b\u043e\u00a0<code>12<\/code>, \u0430 \u043d\u0435\u00a0<code>10800<\/code>. \u0414\u0435\u043b\u0435\u043d\u0438\u0435\u00a0<code>12 \/\/ 900<\/code>\u00a0\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u043e timezone \u0432 \u043d\u043e\u043b\u044c, suffix \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c, \u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442.<\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"python\">def normalize_timezone_to_15min(timezone_value: int) -&gt; int:    if abs(timezone_value) &lt;= 96:        return timezone_value    return timezone_value \/\/ 900<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u00a0<code>96<\/code>? \u0412 \u0441\u0443\u0442\u043a\u0430\u0445 24 \u0447\u0430\u0441\u0430, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0447\u0430\u0441\u0435 4 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043f\u043e 15 \u043c\u0438\u043d\u0443\u0442.\u00a0<code>24 * 4 = 96<\/code>. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d, \u043e\u043d\u043e \u0443\u0436\u0435 \u0432 15-\u043c\u0438\u043d\u0443\u0442\u043d\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a security problem, \u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0435 \u0432\u0441\u044f\u043a\u0438\u0439\u00a0<code>404<\/code>\u00a0\u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u043c API \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u201c\u043d\u0435\u0442 \u043f\u0440\u0430\u0432\u201d. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u201c\u0442\u044b \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u043b \u043a\u043e\u0440\u043e\u0431\u043a\u0443 \u043d\u0430 \u0441\u043a\u043b\u0430\u0434\u0435\u201d.<\/p>\n<h3>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441<\/h3>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u00a0<code>~\/Downloads<\/code>\u00a0&#8212; \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u043f\u043b\u043e\u0445\u043e \u0434\u043b\u044f \u0436\u0438\u0437\u043d\u0438. \u041d\u0443\u0436\u0435\u043d \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 24\/7.<\/p>\n<p>\u0412\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u044b \u043d\u0430 GitHub:\u00a0<a href=\"https:\/\/github.com\/iAlexeyRu\/miband-bot\" rel=\"noopener noreferrer nofollow\"><strong>iAlexeyRu\/miband-bot<\/strong><\/a>.<\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 self-hosted \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c7a\/f76\/a37\/c7af76a37f3f78f29ea15ee4aa4648d9.png\" alt=\"\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f Docker-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c7a\/f76\/a37\/c7af76a37f3f78f29ea15ee4aa4648d9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c7a\/f76\/a37\/c7af76a37f3f78f29ea15ee4aa4648d9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f Docker-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 Docker Compose \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b \u0434\u0432\u0430 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430:<\/p>\n<pre><code class=\"yaml\">services:  tracker:    container_name: miband-tracker    restart: unless-stopped    volumes:      - .\/data:\/opt\/miband-tracker\/data    env_file:      - secrets.env    environment:      - DB_PATH=\/opt\/miband-tracker\/data\/miband.db      - STATUS_PATH=\/opt\/miband-tracker\/data\/status.json      - SYNC_INTERVAL=900      - QUERY_DURATION=2  fitness-bot:    container_name: miband-fitness-bot    restart: unless-stopped    command: [\"python\", \"-u\", \"fitness_bot.py\"]    volumes:      - .\/data:\/opt\/miband-tracker\/data    env_file:      - secrets.env<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 SQLite \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b:\u00a0<code>steps_daily<\/code>\u00a0(\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c),\u00a0<code>steps_detail<\/code>\u00a0(\u043f\u043e\u043c\u0438\u043d\u0443\u0442\u043d\u044b\u0435 \u0448\u0430\u0433\u0438),\u00a0<code>sleep_daily<\/code>\u00a0(\u043e\u0431\u0449\u0438\u0439 \u0441\u043e\u043d),\u00a0<code>sleep_stages<\/code>\u00a0(\u0444\u0430\u0437\u044b \u0441\u043d\u0430),\u00a0<code>heart_rate<\/code>\u00a0(\u043f\u0443\u043b\u044c\u0441),\u00a0<code>stress<\/code>(\u0441\u0442\u0440\u0435\u0441\u0441),\u00a0<code>blood_oxygen<\/code>\u00a0(SpO2).<\/p>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 (<code>tracker<\/code>) \u043a\u0430\u0436\u0434\u044b\u0435 15 \u043c\u0438\u043d\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 Xiaomi.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 STS-\u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 exchange-\u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043d\u0435\u0432\u043d\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b: \u0448\u0430\u0433\u0438, \u0441\u043e\u043d, \u043f\u0443\u043b\u044c\u0441, SpO2.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 FDS-\u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0434\u043b\u044f \u043d\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u043d\u0430 \u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 signed URL \u0447\u0435\u0440\u0435\u0437\u00a0<code>gen_download_url<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 FDS-\u043e\u0431\u044a\u0435\u043a\u0442, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e AES\/CBC \u043a\u043b\u044e\u0447\u043e\u043c\u00a0<code>obj_key<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0440\u0441\u0438\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0441\u043b\u0435\u043f\u043e\u043a \u0441\u043d\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u044b\u0435 \u0440\u044f\u0434\u044b \u043f\u0443\u043b\u044c\u0441\u0430 \u0438 SpO2 \u0432 SQLite.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0444\u0430\u0439\u043b\u00a0<code>status.json<\/code>\u00a0\u0434\u043b\u044f \u0431\u043e\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>Telegram-\u0431\u043e\u0442 (<code>fitness-bot<\/code>) \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c. \u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e Telegram User ID (\u0434\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 \u0438 \u0447\u043b\u0435\u043d\u0430\u043c \u0441\u0435\u043c\u044c\u0438) \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u043d\u0430\u00a0<strong>Inline-\u043a\u043d\u043e\u043f\u043a\u0430\u0445<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\ud83d\udcc5 \u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c<\/strong>\u00a0&#8212; \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043d\u0430 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 7 \u0438\u043b\u0438 30 \u0434\u043d\u0435\u0439 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0435\u0437 \u043f\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0434\u043d\u044e.<\/p>\n<\/li>\n<li>\n<p><strong>\ud83d\udcca \u0410\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430<\/strong>\u00a0&#8212; \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0432\u043e\u0434\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 (\u0448\u0430\u0433\u0438, \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f, \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0439) \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043d\u0430 \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e \u0438\u043b\u0438 \u043c\u0435\u0441\u044f\u0446.<\/p>\n<\/li>\n<li>\n<p><strong>\ud83d\ude34 \u0414\u0435\u0442\u0430\u043b\u0438 \u0441\u043d\u0430<\/strong>\u00a0&#8212; \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439\u0448\u0438\u0439 \u043e\u0442\u0447\u0435\u0442 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u043e\u0447\u044c (\u0432\u0440\u0435\u043c\u044f \u0432 \u043f\u043e\u0441\u0442\u0435\u043b\u0438, \u0444\u0430\u0437\u044b \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e\/\u043b\u0435\u0433\u043a\u043e\u0433\u043e\/REM-\u0441\u043d\u0430, \u043f\u0443\u043b\u044c\u0441 \u043f\u043e\u043a\u043e\u044f) \u0441 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0442\u0440\u0435\u043d\u0434\u043e\u0432 \u0427\u0421\u0421 \u0438 SpO2 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u043f\u0430\u0440\u043a\u043b\u0430\u0439\u043d\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u2699\ufe0f \u0421\u0435\u0440\u0432\u0438\u0441<\/strong>\u00a0&#8212; \u0440\u0430\u0437\u0434\u0435\u043b \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u044a\u0435\u043c\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 SQLite \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 ZIP-\u0430\u0440\u0445\u0438\u0432\u0430 \u0441 CSV-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0432\u0441\u0435\u0445 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0440\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u043b\u044d\u0448-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430:<\/p>\n<ul>\n<li>\n<p><code>\/start<\/code>\u00a0&#8212; \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e.<\/p>\n<\/li>\n<li>\n<p><code>\/status<\/code>\u00a0&#8212; \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043b\u043e\u0433 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><code>\/sync<\/code>\u00a0&#8212; \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0431\u043b\u0430\u043a\u0430 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u0447\u0435\u0442 \u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043d\u0430 \u0432 Telegram-\u0431\u043e\u0442\u0435 \u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u043d\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0443\u043b\u044c\u0441\u0430:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e9\/5f6\/f19\/6e95f6f1992cc284e34f36260be1d3e4.jpg\" alt=\"\u041c\u043e\u043a\u0430\u043f Telegram-\u0431\u043e\u0442\u0430\" title=\"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 Telegram-\u0431\u043e\u0442\u0430\" width=\"944\" height=\"720\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6e9\/5f6\/f19\/6e95f6f1992cc284e34f36260be1d3e4.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e9\/5f6\/f19\/6e95f6f1992cc284e34f36260be1d3e4.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 Telegram-\u0431\u043e\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u0427\u0442\u043e \u0431\u044b \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0438\u043d\u0430\u0447\u0435<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0435\u0433\u043a\u043e \u0433\u0435\u0440\u043e\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u044c: \u043c\u043e\u043b, \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043b\u043e\u0439 \u0437\u0430 \u0441\u043b\u043e\u0435\u043c. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0448\u043b\u0430 \u043d\u0430 \u043b\u043e\u0436\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435: \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u201c\u0434\u043e\u0436\u0430\u0442\u044c\u201d iOS MITM \u0431\u0435\u0437 jailbreak, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044f\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 pinning. \u0418\u043d\u043e\u0433\u0434\u0430 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 Android \u0438 APK patching.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435: \u0442\u043e\u043a\u0435\u043d \u0438\u0437 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 &#8212; \u044d\u0442\u043e \u043d\u0435 \u0444\u0438\u043d\u0430\u043b. \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 API \u0447\u0430\u0441\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445 HTTPS. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439\u00a0<code>curl<\/code>\u00a0\u0434\u0430\u0451\u0442\u00a0<code>401<\/code>, \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043f\u043b\u043e\u0445\u043e\u0439. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c, nonce, \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0442\u0435\u043b\u0430.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u0435: \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 APK &#8212; \u044d\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0435 \u0434\u043b\u044f \u0432\u0430\u0441. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u0440\u043e\u0434\u0435\u00a0<code>SmartHomeRc4Api<\/code>,\u00a0<code>RC4DropCoder<\/code>,\u00a0<code>AESCoder<\/code>,\u00a0<code>FitnessDataParser<\/code>\u00a0\u0447\u0430\u0441\u0442\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u044f\u0442 \u0447\u0430\u0441\u044b \u0441\u043b\u0435\u043f\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430.<\/p>\n<p>\u0427\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u0435: object storage \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430. Health API \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0430 \u0441\u0430\u043c \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u0436\u0438\u0442\u044c \u0432 FDS\/CDN \u0438 \u0438\u043c\u0435\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041f\u044f\u0442\u043e\u0435: \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u0448\u0435\u043d. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c timestamp, version, bitset \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c\u0438 \u0448\u0430\u0433\u0430\u043c\u0438.<\/p>\n<h3>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438<\/h3>\n<p>\u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u044f\u0434 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u043e\u0438\u0442 \u0437\u043d\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c:<\/p>\n<ol>\n<li>\n<p><strong>\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432:<\/strong>\u00a0\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b Xiaomi (<code>serviceToken<\/code>) \u043d\u0435 \u0432\u0435\u0447\u043d\u044b. \u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0442\u0443\u0445\u0430\u0442\u044c (\u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0437 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432), \u0438 \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0436\u0438\u0435 \u043a\u0443\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 mitmproxy \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u00a0<code>secrets.env<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c IDC:<\/strong>\u00a0\u041e\u0431\u043b\u0430\u043a\u043e Xiaomi \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (IDC). Endpoint-\u044b, \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043a\u043b\u044e\u0447\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043b\u0435\u0433\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u0441 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c\u0438 EU, CN \u0438\u043b\u0438 US. \u0414\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 RU-\u0440\u0435\u0433\u0438\u043e\u043d\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432:<\/strong>\u00a0\u0424\u043e\u0440\u043c\u0430\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 FDS-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f Xiaomi. \u041f\u0440\u0438 \u043a\u0440\u0443\u043f\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0431\u0440\u0430\u0441\u043b\u0435\u0442\u0430 \u0438\u043b\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Mi Fitness \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u0438\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0434\u0430\u043d\u043d\u044b\u0445:<\/strong>\u00a0\u0412\u0441\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0435 \u0431\u0440\u0430\u0441\u043b\u0435\u0442\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 (\u043f\u0443\u043b\u044c\u0441, \u0444\u0430\u0437\u044b \u0441\u043d\u0430, SpO2) \u043d\u043e\u0441\u044f\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438, \u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u043b\u0443\u0436\u0438\u0442 \u043b\u0438\u0448\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u043e\u0431\u043b\u0430\u043a\u0430:<\/strong>\u00a0\u0415\u0441\u043b\u0438 \u0443 Xiaomi \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u043f\u0430\u0434\u0443\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u043e \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u043a \u0432 \u043a\u043e\u0434 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0430.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0418\u0442\u043e\u0433\u0438<\/h3>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u043e\u0432\u0430\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0437 Mi Fitness, \u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430:<\/p>\n<pre><code>Xiaomi Cloud -&gt; FDS -&gt; Python sync -&gt; SQLite -&gt; Telegram bot<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<pre><code>patched Mi Fitness \u0431\u0435\u0437 rootmitmproxy capture \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 endpoint-\u043e\u0432RC4 request\/response decryptFDS gen_download_url flowAES\/CBC decrypt \u0447\u0435\u0440\u0435\u0437 obj_keyparser all-day sleep binary326+ HR readings \u0438 42+ SpO2 readings \u0437\u0430 \u043d\u043e\u0447\u044cDocker Compose \u0441\u0435\u0440\u0432\u0438\u0441 + Telegram bot<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0435\u0447\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u0432 \u043a\u043e\u0448\u043a\u0438-\u043c\u044b\u0448\u043a\u0438: \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 Xiaomi \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043a\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u043f\u0435\u0440\u0435\u0442\u0440\u044f\u0445\u043d\u0443\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432 FDS \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 STS-\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u041d\u043e \u043f\u043e\u043a\u0430 \u0441\u0445\u0435\u043c\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 &#8212; \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 self-hosted \u0441\u0442\u0435\u043a \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0443 \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>\u041a\u043e\u0434 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0438 \u0431\u043e\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0442, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431 \u0435\u0441\u0442\u044c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0432\u044b\u0448\u0435. \u0415\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443 \u0441\u0435\u0431\u044f \u0438\u043b\u0438 \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043e\u043a) &#8212; \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f. \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u0438\u0434\u0435\u0438 \u0436\u0434\u0443 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1038812\/\">https:\/\/habr.com\/ru\/articles\/1038812\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440:\u00a0\u0412\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0446\u0435\u043b\u044f\u0445 \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u043e\u0441\u0438\u0442 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0438\u0437\u044b\u0432\u043e\u0432 \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0447\u0443\u0436\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c, \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043a\u043b\u044e\u0447\u0435\u0439 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u043b\u0438\u0446.\u0423 \u043d\u043e\u0441\u0438\u043c\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441: \u0431\u0440\u0430\u0441\u043b\u0435\u0442 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u0432\u0430\u0448\u0438 \u043f\u0443\u043b\u044c\u0441, \u0441\u043e\u043d \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e API \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0411\u0414) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Xiaomi Mi Fitness \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u00ab\u0437\u0430\u043f\u0435\u0440\u0442\u044b\u043c\u0438\u00bb \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b.\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u0447\u0438\u0441\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439: \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e SQLite-\u0431\u0430\u0437\u0443 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u0441\u0435\u043c\u0435\u0439\u043d\u044b\u0439 Telegram-\u0431\u043e\u0442. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0440\u0430\u0441\u043b\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0430 \u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c Xiaomi, \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u0435\u0442\u0438. \u041d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u043a\u0430\u043a \u0438\u0445 \u0437\u0430\u0431\u0440\u0430\u0442\u044c.\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f &#8212; \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0443\u0442\u0438 \u043e\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 CA \u0434\u043e \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430 RC4-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Xiaomi, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 AES\/CBC-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 FDS \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0441\u043d\u0430.TL;DR (\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c)\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435:\u00a0\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Mi Fitness \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c Xiaomi Health Cloud.\u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f:\u00a0\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0434\u0435\u043a\u0440\u0438\u043f\u0442 RC4-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 (\u0441 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0445 1024 \u0431\u0430\u0439\u0442 keystream) \u0438 AES\/CBC \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0441\u043b\u0435\u043f\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.\u0424\u043e\u0440\u043c\u0430\u0442:\u00a0\u041d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0430\u0440\u0441\u0435\u0440 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 Xiaomi FDS \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0441\u043d\u0430, \u043f\u0443\u043b\u044c\u0441\u0430 \u0438 \u043a\u0438\u0441\u043b\u043e\u0440\u043e\u0434\u0430 \u0432 \u043a\u0440\u043e\u0432\u0438 (SpO2).\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430:\u00a0\u041e\u0442\u043a\u0440\u044b\u0442\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 GitHub\u00a0\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d \u0432 \u0434\u0432\u0430 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0441 SQLite + Telegram-\u0431\u043e\u0442 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430).\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438, \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445:\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \/ \u0412\u0435\u0440\u0441\u0438\u044f\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435Xiaomi Mi Fitness (Android) v3.55.0i\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430Xiaomi Smart Band 10\u0410\u043a\u043a\u0430\u0443\u043d\u0442\u0420\u0435\u0433\u0438\u043e\u043d: RU (Russian IDC)\u0414\u0430\u0442\u0430 \u0430\u0443\u0434\u0438\u0442\u0430\u041c\u0430\u0439 2026 \u0433\u043e\u0434\u0430\u0421\u0442\u0435\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430Python 3.11, SQLite, Docker, Aiogram\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0430\u0440\u0442\u0430 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043b\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 endpoint-\u044b, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:\u041a\u0430\u0440\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\u041d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0411\u0440\u0430\u0441\u043b\u0435\u0442 \u043e\u0442\u0434\u0430\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e. \u041e\u0431\u043b\u0430\u043a\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 JSON-\u043e\u0442\u0432\u0435\u0442\u0430\u0445, \u0430 \u0447\u0430\u0441\u0442\u044c &#8212; \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 FDS. \u041d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0435\u0437 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0432 \u0440\u0443\u043a\u0430\u0445.\u041f\u0435\u0440\u0432\u043e\u0439 \u0438\u0434\u0435\u0435\u0439 \u0431\u044b\u043b \u043f\u0440\u044f\u043c\u043e\u0439 Linux-sync \u0441 \u0431\u0440\u0430\u0441\u043b\u0435\u0442\u043e\u043c. \u0414\u043b\u044f \u0441\u0442\u0430\u0440\u044b\u0445 Mi Band \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0447\u0435\u0440\u0435\u0437 BLE, \u0434\u043b\u044f Gadgetbridge \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043d\u043e Mi Band 10 \u0438 \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438\u043c. \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c auth key, \u0431\u043e\u0440\u043e\u0442\u044c\u0441\u044f \u0441 BLE-\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0444\u0440\u043e\u043d\u0442.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u043e\u043a\u0443\u0441 \u0441\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u043d\u0430 \u043e\u0431\u043b\u0430\u043a\u043e Xiaomi. \u0415\u0441\u043b\u0438 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0440\u0430\u0441\u043b\u0435\u0442, \u043f\u0443\u0441\u0442\u044c \u043e\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u0414\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439: \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f, \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435.\u041f\u0435\u0440\u0432\u044b\u0439 \u0442\u0443\u043f\u0438\u043a: iOS, Stream \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 CONNECT\u041d\u0430\u0447\u0430\u043b \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0433\u043e: \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e Mi Fitness \u043d\u0430 iPhone. \u0414\u043b\u044f iOS \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 Stream: \u043e\u043d\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 VPN\/HTTPS-\u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u0443\u043c\u0435\u044e\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c HAR.\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442, \u043e\u0442\u043a\u0440\u044b\u043b Mi Fitness, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0431\u0440\u0430\u0441\u043b\u0435\u0442. \u0412 HAR \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438. \u041d\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f:CONNECT ru.hlth.io.mi.com:443status: 0content: { size: 0, text: &#171;&#187; }\u0422\u0430\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u043c\u043d\u043e\u0433\u043e. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u00a0ru.hlth.io.mi.com, \u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u043f\u0443\u0441\u0442\u043e. \u041f\u0440\u043e\u043a\u0441\u0438 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043c\u0430\u0448\u0438\u043d\u0430 \u043f\u043e\u0434\u044a\u0435\u0445\u0430\u043b\u0430 \u043a \u0432\u043e\u0440\u043e\u0442\u0430\u043c, \u043d\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u0431\u0430\u0433\u0430\u0436\u043d\u0438\u043a\u0435.\u041f\u0440\u0438\u0447\u0438\u043d\u0430 &#8212; SSL pinning. \u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u043c HTTPS \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0446\u0435\u043d\u0442\u0440\u0430\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. MITM-\u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u201c\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439\u201d, \u0438 \u0442\u0440\u0430\u0444\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u0436\u0435: \u043e\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Xiaomi \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e.\u042d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0435 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0430\u0441\u043f\u043e\u0440\u0442\u0430 \u043f\u043e \u0431\u0430\u0437\u0435, \u0430 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0443 \u043f\u0430\u043b\u044c\u0446\u0430. Stream \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, iOS \u043c\u043e\u0436\u0435\u0442 \u0435\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u043e Mi Fitness \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u201c\u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u043d\u0435 \u0442\u043e\u0442\u201d, \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.\u041f\u043e\u0447\u0435\u043c\u0443 MITM \u043d\u0430 iOS \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e CONNECT\u041d\u0430 iOS \u0431\u0435\u0437 jailbreak \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c HTTPS sniffing, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d\u044b, \u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, HAR \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c\u00a0CONNECT.\u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0443\u0436\u0435\u043d Android.Android \u0431\u0435\u0437 root: \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443\u0412\u0430\u0436\u043d\u0430\u044f \u0440\u0430\u0437\u0432\u0438\u043b\u043a\u0430: Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0443\u0442\u043e\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0446\u0435\u043d\u0442\u0440\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (CA) \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: \u043f\u0435\u0440\u0435\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c APK \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0440\u0435\u0434\u0435.\u0421\u043a\u0430\u0447\u0430\u043b Mi Fitness \u0441 APKMirror. \u0412\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e\u00a0.apk\u00a0\u043f\u0440\u0438\u0435\u0445\u0430\u043b \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439\u00a0.apkm\u00a0bundle: \u0432\u043d\u0443\u0442\u0440\u0438\u00a0base.apk\u00a0\u0438 \u043d\u0430\u0431\u043e\u0440 split APK \u043f\u043e\u0434 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u044f\u0437\u044b\u043a \u0438 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u0430.unzip com.xiaomi.wearable_3.55.0i-&#8230;apkm -d mi_fitness_extractedls mi_fitness_extracted\u0412\u043d\u0443\u0442\u0440\u0438 \u0431\u044b\u043b\u0438, \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e:base.apksplit_config.arm64_v8a.apksplit_config.ru.apksplit_config.xxhdpi.apksplit_config.en.apk\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u0448\u0451\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Android-\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 pipeline:\u00a0apktool, network security config, \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 split APK. \u041d\u043e \u0431\u0435\u0437 \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0435 \u0432\u044b\u0448\u043b\u043e.\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u00a0apk-mitm\u00a0\u0443\u043f\u0430\u043b \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0435:[Fatal Error] :1107:143: The entity name must immediately follow the &#8216;&amp;&#8217; in the entity reference.AndroidManifest.xml:1107: error: not well-formed (invalid token).\u0421\u043c\u044b\u0441\u043b \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u00a0&amp;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 XML-\u043f\u0430\u0440\u0441\u0435\u0440 \u0445\u043e\u0442\u0435\u043b \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u043a\u00a0&amp;amp;. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 Xiaomi \u0441 \u044d\u0442\u0438\u043c \u0436\u0438\u0432\u0451\u0442, \u0430 \u0441\u0442\u0440\u043e\u0433\u0438\u0439\u00a0apktool\u00a0\u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e.\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u0434\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e:apktool d mi_fitness_extracted\/base.apk -o mi_fitness_decoded\u0417\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u00a0res\/xml\/network_security_config.xml\u00a0\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c:&lt;?xml version=&#187;1.0&#8243; encoding=&#187;utf-8&#8243;?&gt;&lt;network-security-config&gt;    &lt;base-config cleartextTrafficPermitted=&#187;true&#187;&gt;        &lt;trust-anchors&gt;            &lt;certificates src=&#187;system&#187;\/&gt;            &lt;certificates src=&#187;user&#187;\/&gt;        &lt;\/trust-anchors&gt;    &lt;\/base-config&gt;&lt;\/network-security-config&gt;\u0412\u00a0AndroidManifest.xml\u00a0\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430:android:networkSecurityConfig=&#187;@xml\/network_security_config&#187;\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e APK \u0441\u043e\u0431\u0440\u0430\u043b\u0441\u044f:apktool b mi_fitness_decoded -o mi_fitness_patched.apk\u041d\u043e Android \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 APK \u0431\u0435\u0437 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u0410 split APK \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u043a\u043b\u044e\u0447\u043e\u043c. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e\u00a0base.apk, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u043e \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u043c\u00a0jarsigner, Android \u043c\u043e\u0436\u0435\u0442 \u0440\u0443\u0433\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 Signature Scheme v2.\u041f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438\u0441\u044c\u00a0apksigner\u00a0and\u00a0zipalign\u00a0(\u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0443\u0442\u044c \u0434\u043b\u044f macOS \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c Homebrew Android SDK; \u0434\u043b\u044f Linux \u0438 Windows \u043f\u0443\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u0430 \u0435\u0441\u043b\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 PATH, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u00a0apksigner):# \u0414\u043b\u044f macOS Homebrew \u043f\u0443\u0442\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a. \u0412 Windows\/Linux \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0432\u0430\u0448 \u043f\u0443\u0442\u044c \u043a Android SDK build-tools.APKSIGNER=\/opt\/homebrew\/share\/android-commandlinetools\/build-tools\/34.0.0\/apksignerfor apk in mi_fitness_patched.apk \\  mi_fitness_extracted\/split_config.arm64_v8a.apk \\  mi_fitness_extracted\/split_config.ru.apk \\  mi_fitness_extracted\/split_config.xxhdpi.apk \\  mi_fitness_extracted\/split_config.en.apk; do  &#171;$APKSIGNER&#187; sign &#8212;ks my.keystore \\    &#8212;ks-pass pass:&lt;LOCAL_PASSWORD&gt; \\    &#8212;key-pass pass:&lt;LOCAL_PASSWORD&gt; \\    &#171;$apk&#187;done\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0440\u043e\u043c\u0430\u043d\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u043d\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u201c\u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438 \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e\u201d \u0438\u0441\u0442\u043e\u0440\u0438\u044f, \u0430 \u0441\u0435\u0440\u0438\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0431\u044b\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a: \u043d\u0435 \u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u0434\u043e\u00a0apksigner, \u043f\u043e\u0434\u043f\u0438\u0441\u0438 v1 \u0432\u043c\u0435\u0441\u0442\u043e v2, split APK \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044f\u043c\u0438, \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u0438\u043d\u00a0base.apk\u00a0\u043d\u0430 ARM64-\u0442\u0435\u043b\u0435\u0444\u043e\u043d. \u041d\u043e \u0438\u0442\u043e\u0433 \u0431\u044b\u043b \u043d\u0443\u0436\u043d\u044b\u0439:\u00a0\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 Mi Fitness \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u043c Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0431\u0435\u0437 root.\u041f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 patched APK \u0441\u0445\u0435\u043c\u0430 \u0441\u0442\u0430\u043b\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0439:Android phone -&gt; Wi-Fi proxy -&gt; mitmproxy on Mac -&gt; Xiaomi Cloud\u041d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b CA mitmproxy \u0447\u0435\u0440\u0435\u0437\u00a0http:\/\/mitm.it, \u0432 Wi-Fi \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0430 IP Mac \u0438 \u043f\u043e\u0440\u0442\u00a08080. \u041d\u0430 Mac \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u00a0mitmweb\u00a0\u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u043e \u043d\u0443\u0436\u043d\u044b\u043c \u0434\u043e\u043c\u0435\u043d\u0430\u043c.\u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u044b\u0435\u00a0CONNECT, \u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 HTTPS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b:ru.hlth.io.mi.comsts-hlth.io.mi.comru.watch.iot.mi.comaccount.xiaomi.com\u0421\u0440\u0435\u0434\u0438 \u043f\u0443\u0442\u0435\u0439 \u0431\u044b\u043b\u0438:\/healthapp\/privacy\/get_privacy_change\/app\/v1\/data\/get_aggregated_fitness_data_by_watermark\/app\/v1\/data\/get_project_data_by_time\/app\/v1\/statistics\/get_stat_data_by_time\/app\/v1\/eco\/api_proxy\/healthapp\/service\/gen_download_url\/healthapp\/user\/get_miot_user_profile\u0418 \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 cookies:Cookie: cUserId=&lt;REDACTED&gt;; serviceToken=&lt;REDACTED&gt;; userId=&lt;REDACTED&gt;User-Agent: Android-16-3.55.0i-&#8230;\u041d\u0430\u0438\u0432\u043d\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c. \u0422\u043e\u043a\u0435\u043d \u043d\u0430 \u0440\u0443\u043a\u0430\u0445, endpoint-\u044b \u0442\u043e\u0436\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c Python-\u043a\u043b\u0438\u0435\u043d\u0442.\u041d\u0435\u0442.\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 curl \u043f\u043e\u043b\u0443\u0447\u0438\u043b 401\u041f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442 \u0431\u044b\u043b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c: \u0432\u0437\u044f\u0442\u044c\u00a0serviceToken,\u00a0cUserId,\u00a0User-Agent\u00a0\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437\u00a0curl.curl -i -X POST \\  &#8216;https:\/\/ru.hlth.io.mi.com\/healthapp\/privacy\/get\\_privacy\\_change?locale=ru\\_by&#8217; \\  -H &#171;Cookie: cUserId=&lt;REDACTED&gt;; serviceToken=&lt;REDACTED&gt;; locale=ru_by&#187; \\  -H &#171;User-Agent: Android-16-3.55.0i-&#8230;&#187; \\  -H &#171;Content-Type: application\/json; charset=utf-8&#187; \\  &#8212;data &#8216;{}&#8217;\u041e\u0442\u0432\u0435\u0442:{&#171;code&#187;:0,&#187;message&#187;:&#187;auth err&#187;}\u042d\u0442\u043e \u0431\u044b\u043b \u0432\u0430\u0436\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442. \u0422\u043e\u043a\u0435\u043d \u0438\u0437 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u0431\u044b\u043b \u0436\u0438\u0432\u043e\u0439: \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0438\u043c \u0445\u043e\u0434\u0438\u043b\u043e. \u041d\u043e Xiaomi Health API \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u201c\u0433\u043e\u043b\u044b\u0439\u201d JSON-\u0437\u0430\u043f\u0440\u043e\u0441. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:_noncedatasignaturerc4_hash__ssecurity\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-480833","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/480833","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=480833"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/480833\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=480833"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=480833"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=480833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}