Аппарат получил в подарок. Всякий раз, когда я получаю новое устройство, я быстро его рассматриваю. Особенно с устройством, которое требует некоторых весьма важных личных или деловых данных. Несмотря на то, что в этом случае я более или менее доверяю компании Ratta, которая сделает все возможное для защиты моих данных, поскольку я являюсь (частично) китайской компанией, я считаю, что их возможности ограничены. Мы все знаем о разговорах о состоянии законов и правил конфиденциальности в Китае. Кроме того, у меня были основания полагать, что устройства производятся сторонним OEM-производителем, также расположенным в материковом Китае, и я хотел посмотреть, что еще происходит с устройством.
TL;DR Устройство можно рутировать с помощью нескольких векторов атаки. Программное, а также аппаратное обеспечение.
Хорошая новость: изучив устройство, я не смог обнаружить ничего явно компрометирующего его с точки зрения шпионского ПО или других агрессивных действий. Некоторые из приложений Ratta поставляются со встроенными частично запутанными компонентами Tencent. Похоже, что устройство соблюдает ваши настройки телеметрии (обратите внимание на Google, Apple и др.), но очень регулярно проверяет наличие обновлений, которые, по крайней мере, могут отслеживать вас с точки зрения местоположения и моделей использования. Некоторые серверы, очевидно, расположены в Китае, поэтому потенциально открыты для китайского правительства. Хотя компания, похоже, знает об этой теме и развертывает серверы в США. Для сравнения: любое встроенное устройство Google или Amazon, любая популярная операционная система, любой смартфон или популярное приложение для социальных сетей собирает о вас больше информации, чем я нашел здесь.
Предупреждение: я никому не советую следовать этому описанию на практике, так как вы, скорее всего, сделаете свое устройство непригодным для использования. Многое из этого записано по памяти. Что в моем случае не очень надежно. Таким образом, могут быть ошибки или упущения, которые увеличивают риск того, что ваше устройство станет непригодным для использования, а также лишатся гарантии.
Обновление от 08.08.2022: Я уведомил Ратту чуть больше двух недель назад, чтобы сообщить им, что я опубликую эту информацию. Как и ожидалось, Ратта ответил любезно и пообещал поработать над решением проблем. Еще хочу отметить, что я ни в коем случае не имею в виду здесь КИТАЙ = ЗЛО. Я выражаю общее желание, чтобы мои данные были безопасными и конфиденциальными, и вижу проблемы в практике конфиденциальности в США, Европе, Индии, России и... в той же мере, в какой я вижу их в Китае.
См. выше. Учитывая физический доступ, это устройство не может считаться безопасным для каких-либо высококонфиденциальных данных.
Учитывая устаревшую версию Android и отсутствие мер безопасности, я ни при каких обстоятельствах не буду предоставлять свое устройство ненадежной стороне. Я бы также посоветовал никогда не подключать его к неизвестному компьютеру или общедоступному зарядному кабелю, поскольку некоторые из этих атак могут быть выполнены полностью автоматически.
Я не сотрудник службы безопасности. Это стоило мне двух выходных, потраченных на сбор общедоступных данных. Любой человек или группа, достаточно мотивированные и талантливые, чем я, добьются большего. Кроме того, поскольку Ратта в любом случае пообещал разрешить неопубликованную загрузку, а также увидел, что устройство широко открыто с предустановленным двоичным файлом su, открытыми тестовыми ключами, открытым загрузчиком, (отключенным, легко разблокируемым) консольным интерфейсом adb и другими открытыми дверями, я предполагаю, что это не создаст никаких неожиданное неудобство.
В любом случае, этот документ был предоставлен Ратте по электронной почте 27 июля 2022 года, за две недели до его публикации в открытом доступе.
Неа. Ни при каких обстоятельствах я не буду распространять какие-либо файлы, которые даже отдаленно могут быть защищены авторским правом или чем-то подобным. Если вы знаете, что делаете, эта статья содержит более чем достаточно информации. Если нет, оставьте свое устройство как есть и попросите Ratta предоставить вам доступ к оболочке / root к вашему устройству.
Вы можете найти ограниченное количество спецификаций устройства, установив приложение kindle, которое на момент написания статьи является единственным доступным приложением во встроенном «магазине приложений» устройства. Или вы просто распаковываете OTA update.zip.
Устройство работает под управлением Android 8.1 на платформе Rockchip PX30, состоящей из четырехъядерного процессора ARM Cortex-A35 с тактовой частотой 1,5 ГГц, 2 гигабайт оперативной памяти и дисплея eink с разрешением 1404x1872. Платформу Rockchip часто можно встретить в автомобильных радиоприемниках и других встроенных устройствах с пользовательским интерфейсом. Таким образом, вы можете найти много официальной и менее официальной информации об этом, просто погуглив.
Вот так: rockchip.fr/PX30%20datasheet%20V1.1.pdf Или так: opensource.rock-chips.com/wiki_Main_Page
Учитывая тот факт, что на Reddit есть /r/supernote и /r/supernote_beta, для этого устройства существует бета-программа.
Ratta предлагает информацию об обоих выпусках бета-обновлений здесь, а также на своем веб-сайте:
Текущую небета-версию можно скачать здесь: support.supernote.com/article/3/how-to-update-your-supernote.
Бета-версия не может, поскольку ее распространение привязано к серийному номеру вашего устройства, который можно найти в SupernoteSettings.apk
, поскольку независимо от установленной в данный момент версии оно подключается к одному и тому же серверу и URL-адресу. Более подробную информацию смотрите ниже.
Обновления представляют собой обычные незашифрованные файлы Android OTA, которые можно легко распаковать и проанализировать с помощью свободно доступных инструментов. Дополнительную информацию смотрите ниже.
update.zip с распакованными образами .br brotli:
update.zip:/система
Устройство обновляется путем координации с сервером по адресу device.supernote.com.cn
чтобы узнать, доступно ли новое обновление:
curl -X POST -k -H 'Content-Type: application/json' -i 'https://device.supernote.com/official/system/business/android/update/download' --data '{"language":"EN", "equipmentNo":"SN100Bxxxxxxxx", "logicVersion":"Chauvet 2.4.15(566)", "configureList":[{"type":"1", "version":"Chauvet.D002.2203101001.566_release"}]}'
Сообщения об ошибках отображаются на китайском языке, но они являются обычными . Устройство не нуждается в обновлении , серийный номер неизвестен и т. д.
Если доступно обновление, устройство получает URL-адрес для загрузки вместе с полным журналом изменений и т. д.
{"успех":true,"errorCode":null,"errorMsg":null,"configureList":[{"type":"1","version":"Chauvet.xxxx.xxxxxxxxxx.xxx_xxxxxxx","fileName" :"Chauvet.xxxx.xxxxxxxxxx.xxx_xxxxxxx.zip","name":null,"packageName":null,"version Нет":null,"url":"https://prod-ratta-firmware.s3.ap-northeast-1.amazonaws.com/xxxxxx/update.zip","size":xxxxxxx x,"md5":"abcdefabcdefabcdefabcdef"}],"totalSize":xxxxxxxxx,"fixPointList":[{"current":false,"version":"Chauvet xxxx(xxx)","fixPoint":"
...
","opTime":"xxxx-xx-xx xx:xx:xx"}],"logicVersion":" Chauvet xxxx(xxx)","deployDate":"xxxx-xx-xx xx:xx:xx"}
Который затем скачивается и передается в систему восстановления.
То же самое произойдет, если вы последуете инструкциям по обновлению вручную, поместив файл update.zip в папку /EXPORT/
на вашем устройстве и вытащив USB-кабель. Устройство обнаружит файл и спросит, следует ли продолжить установку.
Точный механизм можно определить из следующего кода.
com.ratta.supernote.update.NetWorkConstant
public static final String DEV_BASE_URL = "http://10.20.22.32:9000" ;
public static final String DOWN_LOAD_URL = "" ;
public static final String NET_BASE_URL_PRODUCT = "http://10.20.22.32:8075/" ;
public static final String NET_BASE_URL_TEST = "https://test-ms-device.ratta.com.cn/" ;
public static final String RELEASE_BASE_URL = "https://device.supernote.com.cn/" ;
public static final String UAT_BASE_URL = "https://device.supernote.com" ;
public static final File DOWN_LOAD_PATH = new File ( "/cache" );
public static final String USBDisk_Path = Environment . getExternalStorageDirectory () + File . separator ;
public static final String FILE_TEST = USBDisk_Path + "EXPORT/test" ;
public static final String FILE_PRODUCT = USBDisk_Path + "EXPORT/product" ;
public static final String FILE_UAT = USBDisk_Path + "EXPORT/uat" ;
com.ratta.networklibrary.utils.C0598Utils
String str = Build . DISPLAY ; // i.E. Chauvet.D002.2203101001.566_release
boolean exists = new File ( Constant . FILE_USA ). exists ();
int lastIndexOf = str . lastIndexOf ( "_" );
if ( lastIndexOf != - 1 ) {
String substring = str . substring ( lastIndexOf + 1 );
String str2 = (( TextUtils . equals ( substring , "root" ) || TextUtils . equals ( substring , "hard" )) && exists ) ? Constant . USA_BASE_URL : Constant . RELEASE_BASE_URL ;
if ( new File ( Constant . FILE_TEST ). exists () || TextUtils . equals ( substring , "test" )) {
str2 = exists ? Constant . TEST_USA_BASE_URL : Constant . TEST_BASE_URL ;
} else if ( new File ( Constant . FILE_PRODUCT ). exists ()) {
str2 = Constant . DEV_BASE_URL ;
} else if ( new File ( Constant . FILE_UAT ). exists () || TextUtils . equals ( substring , "uat" )) {
str2 = Constant . UAT_BASE_URL ;
}
if (! TextUtils . equals ( substring , "release" ) && ! TextUtils . equals ( substring , "beta" )) {
return str2 ;
}
if ( exists ) {
return Constant . USA_BASE_URL ;
}
}
return Constant . RELEASE_BASE_URL ;
com.ratta.supernote.update.DownLoadService
@ POST ( "official/system/business/android/update/download" )
Call < DownResponse > downLoadFileInfo ( @ Body RequestBody requestBody );
com.ratta.supernote.update.UpDateAppService
LocalSystemInfoBean localSystemInfoBean = new LocalSystemInfoBean (); // see CURL request above for example values
localSystemInfoBean . setEquipmentNo ( DownPresenter . getDeviceVersion ());
localSystemInfoBean . setLanguage ( DownPresenter . getLanguage ( this ));
localSystemInfoBean . setLogicVersion ( DownPresenter . getLogicVersion ());
localSystemInfoBean . setConfigureList ( DownPresenter . getSystemAllPackageVersion ( this , new ArrayList ()));
RetrofitUtils retrofitUtils = RetrofitUtils . getInstance ();
final DownResponse downResponse = ( DownResponse ) retrofitUtils . execute ((( DownLoadService ) retrofitUtils . getService ( DownLoadService . class )). downLoadFileInfo ( DownLoadModel . getRequestBody ( localSystemInfoBean )));
com.ratta.supernote.update.UpDateAppService
if ( new File ( NetWorkConstant . DOWN_LOAD_PATH , "update.zip" ). exists ()) {
CacheInfoUtils . saveData ( CacheInfoUtils . updateFlagPath , UpDateAppService . USB_UPDATE_FLAG );
RecoverySystem . installPackage ( UpDateAppService . this , new File ( NetWorkConstant . DOWN_LOAD_PATH , "update.zip" )); // if unfamiliar: https://developer.android.com/reference/android/os/RecoverySystem
}
com.ratta.supernote.update.UpDateAppService
private void checkRestartUpdate () {
String str = SystemProperties . get ( ConstanceUtil . restartKey , Constance . FILE_SEVER_UFILE ); // FILE_SEVER_UFILE = "0"; restartKey = "ratta.launcher.restart";
LogUtils . m187d ( "ratta: " + str );
if (! str . equals ( "1" )) {
SystemProperties . set ( ConstanceUtil . restartKey , "1" );
this . firstSelectVersion = true ;
if ( new File ( Environment . getExternalStorageDirectory (). getAbsolutePath () + File . separator + "EXPORT" , "update.zip" ). exists ()) {
this . firstSelectVersion = false ;
usbUpdate ();
return ;
}
LogUtils . m187d ( "checkRestartUpdate: getVersionList" );
getVersionList ();
}
}
public void usbUpdate () {
if ( this . usbUpdateFlag ) {
return ;
}
final File file = new File ( Environment . getExternalStorageDirectory (). getAbsolutePath () + File . separator + "EXPORT" , "update.zip" );
if (! file . exists ()) {
LogUtils . m187d ( "onReceive: No USB upgrade file" );
return ;
}
GestureService . lockStatusbar = true ;
GestureService . lockSlidebar = true ;
this . usbUpdateFlag = true ;
LogUtils . m187d ( "usb update GestureService.lockStatusbar true" );
DialogUtils . getInstance (). build ( this ). createDefaultDelayDialog ( getString ( C0688R . string . usb_detection_tips ), 30 , new LibDialogDelayDefaultListener () { // "The upgrade pack is detected, do you want to install?"
// goes on with housekeeping like removing any existing update.zip and a couple of checks for enough battery etc and then moves the update.zip to /cache as seen above
Как вы можете видеть, никаких проверок работоспособности или какого-либо дешифрования не происходит. Таким образом, вы можете взять любой файл, переместить его в папку /EXPORT/ и позволить системе передать его для восстановления.
Я никогда не проверял, но, читая код, я предполагаю, что вы можете по своему желанию обновлять и понижать версию своего устройства через USB.
Хотя, поскольку это стандартный механизм восстановления Android (с которым я не очень знаком), он проверит, подписан ли файл известным закрытым ключом.
Устройство поставляется с закрытым интерфейсом ADB. Требуется команда adb reboot
, которая позволяет вам поместить ее в режим восстановления adb reboot fastboot
adb reboot recovery
, а также в режим adb reboot loader
.
В режиме восстановления устройство поддерживает оболочку, работающую от имени пользователя root. Доступен ограниченный набор команд, но установлен busybox, так что неважно. Логичным шагом было бы разблокировать полный доступ к adb, создав такой скрипт:
#! /bin/bash
echo " rebooting to recovery "
adb reboot recovery
ANSWER=0
while [ " $ANSWER " != " 1 " ] ; do
sleep 2
ANSWER= $( adb devices | grep rockchipplatform -c )
done
echo " device online, patching "
adb shell busybox mount -o rw,seclabel,relatime,data=ordered,inode_readahead_blks=8 /dev/block/by-name/system /system
adb shell sed -i " s/ro.debuggable=0/ro.debuggable=1/ " /system/etc/prop.default
echo " rebooting to system "
adb reboot
После этого устройство становится полностью доступным через стандартную оболочку adb, которую затем можно повысить до root:
Для нетехнических пользователей: это означает, что ваше устройство в основном открыто вместе со всеми вашими файлами. Любой мотивированный пользователь может в любой момент скопировать или изменить любой файл на вашем устройстве, имея доступ к USB.
Поскольку загрузчик разблокирован, вы можете в любой момент прошить любое ядро или раздел, перезагрузив устройство в этом режиме и fastboot flash boot boot.img
Для нетехнических пользователей: это означает, что ваше устройство может быть свободно изменено таким образом, что вы этого не заметите и тем самым поставите под угрозу свои данные и конфиденциальность.
В этом режиме устройство определяется как «РЕЖИМ ЗАГРУЗКИ» инструментами разработчика Rockchip, такими как RKDevTool. Отсюда можно перезаписать разделы, изменить структуру разделов...
...и устройство можно перевести в режим Maskrom. Подробнее об этом ниже.
Для нетехнических пользователей: это означает, что ваше устройство может быть свободно изменено таким образом, что вы этого не заметите и тем самым поставите под угрозу свои данные и конфиденциальность.
Когда я посмотрел /system/build.prop
я нашел
ro.build.description=px30_ht_eink-userdebug 8.1.0 OPM8.190505.001 Chauvet.D002.2206171001.629_beta test-keys
ro.build.fingerprint=Android/htfy_px30:/Chauvet.D002.2206171001.629_beta_:userdebug
test-keys
– не очень хороший знак. Если вы разработчик. Это прекрасный знак, если вы ищете широко открытую дверь в систему.
Я не буду вдаваться в подробности Android OTA, но вы можете прочитать об этом здесь.
Просматривая update.zip:/META-INF/com/android/otacert /META-INF/com/android/otacert
мы можем просмотреть общедоступный сертификат обновления:
-----НАЧАТЬ СЕРТИФИКАТ-----
MIID+zCCAuOgAwIBAgIJAJKlKMdz16FBMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD
VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
VmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UE
AwwHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
Fw0xNDEyMjMwNjQ0MDhaFw00MjA1MTawNjQ0MDhaMIGUMQswCQYDVQQGEwJVUzET
MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
A1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHQW5kcm9p
ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
hvcNAQEBBQADggENADCCAQgCggEBALl71fjESroAzdrkBKrApCrK9qnZfH38S3U3
6jhBOQtrwxnh/AaRC3hOyO5ihjwv1MlSuTA1DygGMznwP8rOQbc9eH4uqdnerE87
v0bc8lPCj22AAterZBZESqgfRwND/25S6A22wA/kPR/CiXMuWHlQfS6Q9CHBOwVQ
5ZZUge2KC1TbH8EtDkxDacOeTbhN6UQxxm3jgaIzkwyrEEcYB1m93CrTFOtVV7Jw
wo7XE5LGwo6nTzNieXJqoYxcNAMPv9seKW+GZ1EGl78e9B37SMoxq0I7HuStz5tD
ts2Er2YrjQig+1ZqgroIvPfeJAEyoEr0r6kK7jBh878usWOuWB0CAQOjUDBOMB0G
A1UdDgQWBBTV37ltjIiA28uNs8Z1hb6zasy5UzAfBgNVHSMEGDAWgBTV37ltjIiA
28uNs8Z1hb6zasy5UzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAZ
7pvK3yDr+O0G8ggDfaISkEeg0agocRcXGT/MRiPBz+n45+bEoym4hC2SdCxvHXES
5AHkFxjWavoQqAD8We955NCmpGzDip4hUctlXzqxYfSTvGiLArG92+Hcbu5RNx/7
o3Of39Mdge2jVKQuKAALWnb8TgJ/2k3KAUFzVqMXPY4asmnWtyW2FIKLdZU/yYTX
+8Tp0AhP+N84HUGg5BwQRD10/OGGY54rLfFy2aSLPxUZQ+VTSZB9Z9XRLxohsF/V
XBcZyCdPP254wDYL5R0HGWZv7CeBlVjw3FqDRI9aljdYfLpAk+clnRBwWOWHsiOE
pJXgkkLmpq0uDXsSMJZ2
-----КОНЕЦ СЕРТИФИКАТА-----
Поиск в Google части сертификата дает по крайней мере один результат с сайта xda-developers.com, где кто-то пытается проникнуть в их устройство Android 8.1 Rockchip PX5.
Это еще худший знак. Или еще более красивый для меня.
Затем я поискал в Google SDK для платформы PX30 и нашел его здесь:
ru.t-firefly.com/doc/download/page/id/63.html#other_206
вместе с документами здесь:
wiki.t-firefly.com/en/Core-PX30-JD4/Android_development.html
и здесь:
wiki.t-firefly.com/en/Firefly-RK3399/customize_android_firmware.html
Загрузив SDK, вы можете распаковать архив 7z и инициализировать содержащийся в нем репозиторий git с помощью:
git clone PX30_Android8.1.0_LVDS_190706 directory_to_clone_into
После длительного клонирования найдите тестовые ключи SDK в каталоге /build/make/target/product/security
, и все готово.
Интересный факт: README в этой папке гласит:
Тестовые ключи в этом каталоге используются только при разработке и НИКОГДА не должны использоваться для подписи пакетов в общедоступных образах (так как это создаст серьезную дыру в безопасности).
Ага, подтверждено.
Я оставляю технику на ваше усмотрение — во время работы в Windows я использую Multi Image Kitchen для распаковки, переупаковки и подписи Android OTA. Вам нужно будет переместить файлы testkey.x509.pem
и testkey.pk8
в папку bin
инструмента, и оттуда вы сможете создавать измененные обновления, у устройства не будет другого выбора, кроме как установить их, когда вы поместите их в папку EXPORT. .
Ну, наверное.
Все, что вы делаете здесь, чрезвычайно подвержено ошибкам и мягкому блокированию вашего устройства. Насколько я знаю, все устройства Rockchip никогда не могут быть полностью программными, поскольку они всегда имеют режим MaskROM, который по сути представляет собой открытый интерфейс программирования.
Обычно доступ к этому интерфейсу можно получить, замкнув два контакта ЦП. Это работает и с вашим Supernote, но предполагает открытие устройства и, скорее всего, аннулирование оставшейся у вас гарантии.
Ниже приведена вся информация о маскроме PX30 и о том, как восстановить ваше устройство.
Сделайте резервную копию всех разделов в корневой оболочке adb:
adb shell
например, выполнив следующие команды:
cat /dev/block/mmcblk1p1 > /sdcard/EXPORT/uboot.img
cat /dev/block/mmcblk1p2 > /sdcard/EXPORT/trust.img
cat /dev/block/mmcblk1p3 > /sdcard/EXPORT/misc.img
cat /dev/block/mmcblk1p4 > /sdcard/EXPORT/resource.img
cat /dev/block/mmcblk1p5 > /sdcard/EXPORT/kernel.img
cat /dev/block/mmcblk1p6 > /sdcard/EXPORT/boot.img
cat /dev/block/mmcblk1p7 > /sdcard/EXPORT/recovery.img
cat /dev/block/mmcblk1p8 > /sdcard/EXPORT/backup.img
cat /dev/block/mmcblk1p9 > /sdcard/EXPORT/security.img
cat /dev/block/mmcblk1p10 > /sdcard/EXPORT/cache.img
cat /dev/block/mmcblk1p11 > /sdcard/EXPORT/system.img
cat /dev/block/mmcblk1p12 > /sdcard/EXPORT/metadata.img
cat /dev/block/mmcblk1p13 > /sdcard/EXPORT/vendor.img
cat /dev/block/mmcblk1p14 > /sdcard/EXPORT/oem.img
cat /dev/block/mmcblk1p15 > /sdcard/EXPORT/frp.img
и, возможно, даже сохраните ваши пользовательские данные:
dd if=/dev/block/by-name/userdata bs=4096 count=1048576 of=/sdcard/EXPORT/userdata-1.img
dd if=/dev/block/by-name/userdata bs=4096 skip=1048576 count=1048576 of=/sdcard/EXPORT/userdata-2.img
dd if=/dev/block/by-name/userdata bs=4096 skip=2097152 count=1048576 of=/sdcard/EXPORT/userdata-3.img
dd if=/dev/block/by-name/userdata bs=4096 skip=3145728 count=1048576 of=/sdcard/EXPORT/userdata-4.img
dd if=/dev/block/by-name/userdata bs=4096 skip=4194304 count=1048576 of=/sdcard/EXPORT/userdata-5.img
dd if=/dev/block/by-name/userdata bs=4096 skip=5242880 count=1048576 of=/sdcard/EXPORT/userdata-6.img
backup -> /dev/block/mmcblk1p8
boot -> /dev/block/mmcblk1p6
cache -> /dev/block/mmcblk1p10
frp -> /dev/block/mmcblk1p15
kernel -> /dev/block/mmcblk1p5
metadata -> /dev/block/mmcblk1p12
misc -> /dev/block/mmcblk1p3
oem -> /dev/block/mmcblk1p14
recovery -> /dev/block/mmcblk1p7
resource -> /dev/block/mmcblk1p4
security -> /dev/block/mmcblk1p9
system -> /dev/block/mmcblk1p11
trust -> /dev/block/mmcblk1p2
uboot -> /dev/block/mmcblk1p1
userdata -> /dev/block/mmcblk1p16
vendor -> /dev/block/mmcblk1p13
rootfs / rootfs ro,seclabel,size=981980k,nr_inodes=245495 0 0
/dev/block/by-name/system /system ext4 ro,seclabel,relatime,data=ordered,inode_readahead_blks=8 0 0
/dev/block/by-name/vendor /vendor ext4 ro,seclabel,relatime,data=ordered,inode_readahead_blks=8 0 0
/dev/block/by-name/oem /oem ext4 ro,seclabel,noatime,nodiratime,block_validity,delalloc,barrier,noauto_da_alloc,user_xattr 0 0
/dev/block/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,nodiratime,discard,noauto_da_alloc,data=ordered 0 0
/dev/block/by-name/metadata /metadata ext4 rw,seclabel,nosuid,nodev,noatime,nodiratime,discard,noauto_da_alloc,data=ordered 0 0
/dev/block/by-name/userdata /data f2fs rw,lazytime,seclabel,nosuid,nodev,noatime,nodiratime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,fsync_mode=posix 0 0
tmpfs /storage tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
adb /dev/usb-ffs/adb functionfs rw,relatime 0 0
/data/media /mnt/runtime/default/emulated sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid 0 0
/data/media /storage/emulated sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid 0 0
/data/media /mnt/runtime/read/emulated sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=23,derive_gid 0 0
/data/media /mnt/runtime/write/emulated sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=7,derive_gid 0 0
Обновление, которое было на моем устройстве, уже включало в себя двоичный файл su и множество ярлыков, которые давали мне легкий доступ к корневому интерфейсу adb.
Вот некоторые модификации, с которыми я экспериментировал:
/система/etc/prop.default
security.perf_harden=0
ro.debuggable=1
sys.rkadb.root=1
ro.debug.build=true
ro.oem_unlock_supported=1
ro.secure=0
ro.adb.secure=0
persist.sys.usb.config=mtp,adb
И при этом я заблокировал очень частые проверки обновлений и дополнительную телеметрию (также блокирует встроенный App Store, но это практически бесполезно, поскольку теперь мы можем загружать приложения на устройство).
/система/etc/хосты
127.0.0.1 device.supernote.com.cn
127.0.0.1 supernote.com.cn
127.0.0.1 www.supernote.com.cn
127.0.0.1 device.supernote.com
127.0.0.1 supernote.com
127.0.0.1 www.supernote.com
127.0.0.1 test-ms-device.ratta.com.cn
127.0.0.1 uat-ms-device.ratta.com.cn
127.0.0.1 ratta.com.cn
Отсюда у вас есть работающий корневой интерфейс adb, вы можете загружать приложения и полностью изменять /system по своему вкусу после ввода команды mount -o remount,rw /system
Первым шагом, который я тогда сделал, была установка правильно работающего корневого решения на базе системы SuperSU. Для этого я скачал последнюю версию supersu.zip, распаковал ее, посмотрел скрипт установки и вручную поместил файлы на место супер-хакерским способом:
/system/.ext/.su # useless I think? Didn't bother to understand
/system/xbin/daemonsu
/system/xbin/su
/system/xbin/sugote
/system/xbin/sugote-mksh
/system/xbin/supolicy
/system/lib64/libsupol.so
/system/app/SuperSU/SuperSU.apk
И измените /system/bin/install-recovery.sh
так, чтобы он заканчивался на:
/system/xbin/daemonsu --auto-daemon &
/system/etc/install-recovery-2.sh
Затем измените контексты файлов и права доступа, изменив system_file_contexts.txt
так, чтобы он заканчивался на:
/system/app/SuperSU/SuperSU.apk u:object_r:system_file:s0
/system/xbin/su u:object_r:system_file:s0
/system/bin/.ext/.su u:object_r:system_file:s0
/system/xbin/daemonsu u:object_r:system_file:s0
/system/xbin/sugote u:object_r:zygote_exec:s0
/system/xbin/supolicy u:object_r:system_file:s0
/system/lib64/libsupol.so u:object_r:system_file:s0
/system/xbin/sugote-mksh u:object_r:system_file:s0
и system_fs_config.txt
заканчиваться на:
system/app/SuperSU 0 0 0755
system/app/SuperSU/SuperSU.apk 0 0 0644
system/xbin/su 0 2000 0755
system/bin/.ext 0 2000 0755
system/bin/.ext/.su 0 2000 0755
system/xbin/daemonsu 0 2000 0755
system/xbin/sugote 0 2000 0755
system/xbin/supolicy 0 2000 0755
system/lib64/libsupol.so 0 0 0644
system/xbin/sugote-mksh 0 2000 0755
Работал отлично.
Было бы просто реализовать быстрый скрипт, но на тот момент я только начинал получать root права на Android, и мой план состоял в том, чтобы установить правильный безсистемный root для magisk.
Magisk может создать предварительно модифицированное «рутованное» ядро boot.img и виртуальный диск, передав ему немодифицированный boot.img.
Возьмите boot.img
из корня вашего update.zip
и скопируйте его в /storage/emulated/0/Download
Загрузите последнюю версию Magisk следующим образом:
adb install Magisk-v25.x.apk
На устройстве перейдите в Settings > Apps > My apps
, чтобы система обновила список приложений и добавила Magisk на боковую панель. Возможно, вам придется прокрутить туда, чтобы найти его, поскольку пользовательский интерфейс программы запуска явно не предназначен для людей с большим количеством приложений.
Прежде чем я смог выбрать файл для исправления в Magisk, мне нужно было установить DocumentProvider, который я выбрал в качестве Total Commander (загрузить), поскольку он бесплатный и очень удобный. Загрузил это:
adb install tcandroidxxxx-universal.apk
Сделайте то же самое, что и выше, чтобы оно появилось на боковой панели. Откройте его и слепо тапните в правом верхнем углу, чтобы открыть «пустое» меню, в котором вы пытаетесь нажать предпоследний пункт, чтобы переключиться с темной темы на светлую, чтобы, наконец, увидеть все как следует.
Откройте Magisk (предоставьте ему root-доступ), нажмите «Обновить», оставьте все как есть, нажмите «Далее», «Выбрать и исправить файл», выберите Total Commander (url...) в качестве поставщика, а затем выберите свой boot.img.
Снова скопируйте полученный magisk_patched-xxx.img
из рабочей папки по умолчанию /storage/emulated/0/Download
обратно на свой компьютер.
Из загрузки вашего устройства в fastboot:
adb reboot fastboot
и выдайте стандарт:
fastboot flash boot magisk_patched-xxx.img
и
fastboot reboot
Если все прошло хорошо, ваше устройство загрузится в систему, вы сможете открыть Magisk, и он сообщит версию, установленную вместе с Ramdisk: да . Если вы ранее установили SuperSU или не удалили предустановленный двоичный файл su, он предупредит вас о поврежденной установке и попросит удалить любой предыдущий корень. Это можно сделать, удалив все добавленные вами файлы или только предварительно установленные файлы su
и libsupol.so
Откройте любое приложение, которое запрашивает Суперпользователя, чтобы убедиться, что все работает правильно, и вас встретит знакомая подсказка Суперпользователя:
Я собрал список файлов предыдущих прошивок, начиная с версии 1.0.1(077).
Будет завершено, как только у меня будет время.
В случае, если что-то случится с вашим устройством, откройте его, снимите экранирование с процессора, замкните следующие два контакта, одновременно нажимая переключатель сброса рядом с выключателем питания.
Это переведет ваше устройство в режим маскирома. Я не буду вдаваться во все подробности о том, как именно восстановить устройство, но оставлю вам самую актуальную информацию, а также посоветую делать резервные копии всех ваших разделов, прежде чем вносить ЛЮБЫЕ изменения в ваше устройство.
Затем установите драйверы Maskrom (обязательно включите неподписанные драйверы в Windows, затем используйте такие инструменты, как RKImageMaker
и AFPTool
чтобы создать update.img, который можно прошить через RKDevTool (здесь) в Maskrom. RKDevTool содержит два вышеупомянутых двоичных файла, которые вам нужны для создания пакет обновлений.
RKDevTool по умолчанию поставляется на китайском языке и содержит более или менее бесполезные проверки вашей прошивки, которые вы можете отключить, используя его .ini:
[Language]
Selected=2
и
FW_NOT_CHECK=TRUE
RB_CHECK_OFF=TRUE
CHECK_MACHINE_MODEL=FALSE
В целом, разобраться в этом процессе было интересным занятием, поскольку Rockchip SDK и инструментарий крайне фрагментированы.
Эти файлы понадобятся для полного обновления update.img. Вы можете получить их из таких мест, как сделанные вами резервные копии разделов, а также частично из вышеупомянутого SDK или поиска в Google.
Файлы krnl находятся там, поскольку я создал набор инструментов, который использует инструмент под названием imgRePackerRK (загрузить) для преобразования необработанных файлов .img в формат, совместимый с Rockchip (.img.krnl).
Этот инструмент, очевидно, создан для замены RKImageMaker и AFPTool и представляет собой универсальное решение для создания Rockchip update.img. Но для меня это не дало бы стабильных результатов.
Но он преобразует образы ядра, загрузки и восстановления, совместимые с восстановлением Rockchip.
Изображениеboot.img.krnl и изображениеboot.img
Поэтому я использую его для удобного создания файлов .krnl, а затем запускаю свойtoolchain.bat для создания рабочего update.img, сохраняя при этом исходные файлы .img вместе с файлами .krnl.
move Imageboot.img Imageboot.img.tmp
move Imagerecovery.img Imagerecovery.img.tmp
move Imagekernel.img Imagekernel.img.tmp
move Imageboot.img.krnl Imageboot.img
move Imagerecovery.img.krnl Imagerecovery.img
move Imagekernel.img.krnl Imagekernel.img
copy Imageparameter.txt .parameter
Afptool -pack ./ Imagetmp-update.img
RKImageMaker.exe -RKPX30 ImageMiniLoaderAll.bin Imagetmp-update.img update.img -os_type:androidos
move Imageboot.img Imageboot.img.krnl
move Imagerecovery.img Imagerecovery.img.krnl
move Imagekernel.img Imagekernel.img.krnl
move Imageboot.img.tmp Imageboot.img
move Imagerecovery.img.tmp Imagerecovery.img
move Imagekernel.img.tmp Imagekernel.img
del Imagetmp-update.img
pause
Чтобы помочь вам, вот совместимый файл /Image/parameter.txt
: