J'ai reçu l'appareil en cadeau. Chaque fois que je reçois un nouvel appareil, j’y jette un coup d’œil rapide. Surtout avec un appareil qui invite des données plutôt personnelles ou critiques pour l'entreprise. Même si dans ce cas, je fais plus ou moins confiance à la société Ratta pour faire de son mieux pour protéger mes données - étant une entreprise (en partie) chinoise, je pense que ce qu'elle peut faire est limité. Nous sommes tous conscients des discussions autour de l’état des lois et réglementations sur la protection de la vie privée en Chine. J'avais également des raisons de croire que les appareils étaient fabriqués par un fabricant OEM tiers également situé en Chine continentale et je voulais voir ce qui se passait d'autre sur l'appareil.
TL;DR L’appareil peut être rooté via plusieurs vecteurs d’attaque. Basé sur le logiciel et le matériel.
Bonne nouvelle : après avoir inspecté l'appareil, je n'ai rien trouvé de manifestement compromettant en termes de logiciels espions ou autres pratiques invasives. Certaines applications Ratta sont livrées avec des composants Tencent partiellement obscurcis. L'appareil semble respecter vos paramètres de télémétrie (prenez note de Google, Apple, et al) mais vérifie très régulièrement les mises à jour qui pourraient au moins vous suivre en termes de localisation et de modèles d'utilisation. Certains serveurs sont apparemment situés en Chine donc potentiellement ouverts au gouvernement chinois. Même si l'entreprise semble être consciente du sujet et déploie des serveurs aux États-Unis. Pour mettre les choses en perspective : tout appareil Google ou Amazon intégré, tout système d'exploitation populaire, tout smartphone ou application de réseau social populaire recueille plus d'informations sur vous que ce que j'ai trouvé ici.
Attention : je ne conseille à personne de suivre cet article dans la pratique, car vous rendrez très probablement votre appareil inutilisable. Une grande partie de cela est écrite de mémoire. Ce qui dans mon cas n'est pas très fiable. Il peut donc y avoir des erreurs ou des omissions qui augmentent le risque de rendre votre appareil inutilisable et d'annuler votre garantie.
Mise à jour du 08/08/2022 : j'ai informé Ratta il y a un peu plus de deux semaines pour lui faire savoir que je divulguerais cette information. Comme prévu, Ratta a répondu gentiment et a promis de travailler sur ces problèmes. Je tiens également à souligner que je n’insinue en aucun cas CHINE = MAL ici. J'exprime le souhait général que mes données soient sûres et privées et je vois autant de problèmes dans les pratiques de confidentialité aux États-Unis, en Europe, en Inde, en Russie qu'en Chine.
Voir ci-dessus. Compte tenu de l'accès physique, cet appareil ne peut pas être considéré comme sécurisé pour les données hautement sensibles.
Compte tenu de la nature de sa version obsolète d'Android et du manque de mesures de sécurité, je ne mettrais en aucun cas mon appareil à la disposition d'une partie non fiable. Je conseillerais également de ne jamais le connecter à un ordinateur inconnu ou à un câble de recharge public, car certaines de ces attaques peuvent être effectuées de manière entièrement automatisée.
Je ne suis pas un agent de sécurité. Cela m'a coûté deux week-ends de collecte de données accessibles au public. Toute personne ou parti suffisamment motivé et plus talentueux que moi sera plus rapide. De plus, puisque Ratta a promis d'autoriser le chargement latéral de toute façon ainsi que de voir l'appareil s'ouvrir grand avec le binaire su préinstallé, les clés de test publiques, le chargeur de démarrage ouvert, l'interface de la console adb (désactivée, facilement déverrouillée) et d'autres portes ouvertes, je suppose que cela ne créera aucun inconvénient inattendu.
Quoi qu'il en soit, ce document a été mis à la disposition de Ratta par courrier électronique le 27 juillet 2022, deux semaines avant sa publication publique.
Non. En aucun cas, je ne distribuerai des fichiers qui pourraient, même à distance, être couverts par le droit d'auteur ou autre. Si vous savez ce que vous faites, cet article contient plus qu'assez d'informations. Sinon, veuillez laisser votre appareil tel quel et demandez à Ratta un accès shell/root à votre appareil.
Vous pouvez trouver un nombre limité de spécifications de l'appareil en installant l'application Kindle qui est - au moment de la rédaction - la seule application disponible sur "l'App Store" intégré de l'appareil. Ou vous décompressez simplement un update.zip OTA.
L'appareil fonctionne sous Android 8.1 sur une plate-forme Rockchip PX30 composée d'un ARM Cortex-A35 quadricœur à 1,5 GHz, de 2 Go de RAM et d'un écran eink 1404x1872. La plate-forme Rockchip semble être souvent présente dans les autoradios et autres appareils embarqués dotés d'une interface utilisateur. Vous pouvez donc trouver de nombreuses informations officielles et moins officielles à ce sujet en recherchant simplement sur Google.
Comme ça : rockchip.fr/PX30%20datasheet%20V1.1.pdf Ou alors : opensource.rock-chips.com/wiki_Main_Page
En déduisant du fait qu'il existe un /r/supernote et un /r/supernote_beta sur Reddit, un programme bêta existe pour l'appareil.
Ratta propose des informations sur les mises à jour bêta et sur leur site Web :
La version non bêta actuelle peut être téléchargée à partir d'ici : support.supernote.com/article/3/how-to-update-your-supernote
La version bêta ne peut pas le faire car sa distribution est liée au numéro de série de votre appareil comme vous pouvez le trouver dans le SupernoteSettings.apk
, car indépendamment de la version actuellement installée, elle se connecte au même serveur et à la même URL. Voir ci-dessous pour des informations plus détaillées.
Les mises à jour sont des fichiers OTA Android courants et non cryptés qui peuvent facilement être décompressés et analysés à l'aide d'outils disponibles gratuitement. Voir ci-dessous pour plus d'informations.
update.zip avec les images .br brotli décompressées :
update.zip :/système
L'appareil est mis à jour en coordination avec un serveur sur device.supernote.com.cn
pour voir si une nouvelle mise à jour est disponible :
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"}]}'
Les messages d'erreur sont en chinois mais sont habituels . L'appareil n'a pas besoin d'une mise à jour , numéro de série inconnu , etc.
Si une mise à jour est disponible, l'appareil reçoit une URL de téléchargement ainsi qu'un journal des modifications complet, etc.
{"success":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 Non":null,"url":https://prod-ratta-firmware.s3.ap-northeast-1.amazonaws.com/xxxxxx/update.zip","size":xxxxxxxx,"md5":" abcdefabbcdefabcdefabcdef"}],"totalSize":xxxxxxxx,"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"}
Qui est ensuite téléchargé et remis au système de récupération.
La même chose se produit si vous suivez les instructions de mise à jour manuelle en plaçant un fichier update.zip dans le dossier /EXPORT/
de votre appareil et en tirant sur le câble USB. L'appareil découvre le fichier et vous demande s'il doit poursuivre l'installation.
Le mécanisme exact peut être déduit du code suivant.
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
Comme vous pouvez le constater, aucun contrôle d’intégrité ni aucun type de décryptage n’est en cours. Vous pouvez donc essentiellement prendre n'importe quel fichier, le déplacer vers le dossier /EXPORT/ et laisser le système le transmettre à la récupération.
Je n'ai jamais vérifié, mais en lisant le code, je suppose que vous pouvez mettre à niveau et rétrograder votre appareil à volonté via USB.
Cependant, comme il s'agit du mécanisme de récupération Android standard (que je ne connais pas très bien), il vérifiera si le fichier est signé avec une clé privée connue.
L'appareil est livré avec une interface ADB fermée. Il prend la commande adb reboot
qui vous permet de le mettre en recovery adb reboot recovery
ainsi qu'en fastboot adb reboot fastboot
ou bootloader mode adb reboot loader
.
En mode de récupération, l'appareil autorise un shell qui s'exécute en tant que root. Un jeu de commandes limité est disponible mais Busybox est installé donc tant pis. Une étape logique serait de débloquer l'accès complet à adb en créant un script comme celui-ci :
#! /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
Après quoi, l'appareil est fondamentalement entièrement accessible via un shell adb standard qui peut ensuite être élevé au niveau root :
Pour les utilisateurs non techniques : cela signifie que votre appareil est essentiellement ouvert, ainsi que tous vos fichiers. Tout utilisateur motivé peut à tout moment copier ou modifier n'importe quel fichier sur votre appareil disposant d'un accès USB.
Étant donné que le chargeur de démarrage est déverrouillé, vous pouvez à tout moment flasher n'importe quel noyau ou partition en redémarrant l'appareil dans ce mode et fastboot flash boot boot.img
Pour les utilisateurs non experts : cela signifie que votre appareil peut être librement modifié de manière à ce que vous ne le remarquiez pas et met ainsi en danger vos données et votre vie privée.
Dans ce mode, l'appareil est détecté comme "LOADER MODE" par les outils de développement Rockchip comme RKDevTool. À partir de là, les partitions peuvent être écrasées, la disposition des partitions peut être modifiée...
... et l'appareil peut être mis en mode Maskrom. Plus d’informations à ce sujet ci-dessous.
Pour les utilisateurs non experts : cela signifie que votre appareil peut être librement modifié de manière à ce que vous ne le remarquiez pas et met ainsi en danger vos données et votre vie privée.
Quand j'ai regardé le /system/build.prop
j'ai trouvé
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
ne sont pas un très bon signe. Si vous êtes le développeur. C'est un beau signe si vous recherchez une porte grande ouverte sur le système.
Je n'entre pas dans les détails d'Android OTA mais vous pouvez en savoir plus ici.
En regardant update.zip : /META-INF/com/android/otacert
nous pouvons consulter le certificat public de la mise à jour :
-----DEBUT DU CERTIFICAT-----
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
-----FIN CERTIFICAT-----
La recherche sur Google d'une partie du certificat donne au moins un résultat de xda-developers.com où quelqu'un tente d'accéder à son appareil Android 8.1 Rockchip PX5.
C'est un signe encore pire. Ou un encore plus beau pour moi.
Ensuite, j'ai recherché sur Google un SDK autour de la plate-forme PX30 et j'en ai trouvé un ici :
fr.t-firefly.com/doc/download/page/id/63.html#other_206
avec des documents ici :
wiki.t-firefly.com/en/Core-PX30-JD4/Android_development.html
et ici :
wiki.t-firefly.com/en/Firefly-RK3399/customize_android_firmware.html
En téléchargeant le SDK, vous pouvez décompresser l'archive 7z et initialiser le dépôt git contenu via :
git clone PX30_Android8.1.0_LVDS_190706 directory_to_clone_into
Après un long clonage, recherchez les clés de test des SDK sous /build/make/target/product/security
et vous êtes prêt à partir.
Fait amusant : le fichier README dans ce dossier indique :
Les clés de test de ce répertoire sont utilisées uniquement en développement et ne doivent JAMAIS être utilisées pour signer des packages dans des images publiées publiquement (car cela ouvrirait une faille de sécurité majeure).
Ouais, confirmé.
Je vous laisse la technique - lorsque je travaille sous Windows, j'utilise Multi Image Kitchen pour décompresser, reconditionner et signer des OTA Android. Vous devrez déplacer vos testkey.x509.pem
et testkey.pk8
dans le dossier bin
de l'outil et à partir de là vous pourrez créer des mises à jour modifiées que l'appareil n'aura d'autre choix que d'installer lorsque vous le placerez dans le dossier EXPORT. .
Eh bien, probablement.
Tout ce que vous faites à partir d’ici est extrêmement sujet aux erreurs et à la mise en brique douce de votre appareil. Pour autant que je sache, tous les appareils Rockchip ne peuvent jamais être entièrement intégrés car ils sont toujours livrés avec un mode maskrom qui est essentiellement une interface de programmation ouverte.
Habituellement, cette interface est accessible en court-circuitant deux broches du processeur. Cela fonctionne également sur votre Supernote, mais implique l'ouverture de l'appareil et annule très probablement toute garantie restante que vous pourriez avoir.
Voir ci-dessous pour toutes les informations sur le maskrom PX30 et comment récupérer votre appareil.
Sauvegardez toutes les partitions dans un shell adb racine :
adb shell
par exemple en émettant ces commandes :
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
et potentiellement même sauvegarder vos données utilisateur :
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
La mise à jour qui se trouvait sur mon appareil était déjà accompagnée d'un binaire su et de nombreux raccourcis qui me permettaient d'accéder facilement à une interface adb racine.
Certaines modifications que j'ai expérimentées étaient :
/system/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
Et pendant que j'étais là-bas, j'ai bloqué les vérifications de mise à jour très fréquentes et la télémétrie facultative (bloque également l'App Store intégré, mais c'est pratiquement inutile car nous pouvons désormais charger des applications sur l'appareil)
/système/etc/hôtes
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
Vous disposez d'une interface adb racine fonctionnelle à partir d'ici, vous pouvez charger des applications et modifier entièrement le /system à votre guise après avoir émis un mount -o remount,rw /system
La première étape que j'ai ensuite faite a été d'installer une solution racine basée sur le système SuperSU fonctionnant correctement. Pour cela, j'ai téléchargé le dernier supersu.zip, je l'ai décompressé, j'ai regardé le script d'installation et mis les fichiers en place manuellement de manière super hacky :
/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
Et modifiez /system/bin/install-recovery.sh
pour terminer par :
/system/xbin/daemonsu --auto-daemon &
/system/etc/install-recovery-2.sh
Puis modifiez les contextes de fichiers et les droits d'accès en modifiant system_file_contexts.txt
pour terminer par :
/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
et system_fs_config.txt
pour terminer par :
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
A parfaitement fonctionné.
Il aurait été simple d'implémenter un script rapide, mais à ce stade, j'entrais tout juste dans la racine Android et mon plan était d'installer une racine sans système Magisk appropriée.
Magisk peut produire un noyau boot.img et un disque virtuel pré-modifiés "enracinés" en lui fournissant le boot.img non modifié.
Prenez le boot.img
à la racine de votre update.zip
et copiez-le dans /storage/emulated/0/Download
Chargez le dernier Magisk comme suit :
adb install Magisk-v25.x.apk
Sur l'appareil, accédez à Settings > Apps > My apps
pour que le système actualise la liste des applications et qu'il ajoute Magisk à la barre latérale. Vous devrez peut-être faire défiler l'écran pour le trouver, car l'interface utilisateur du lanceur n'est clairement pas conçue pour les personnes possédant de nombreuses applications.
Avant de pouvoir choisir un fichier à patcher dans Magisk, j'avais besoin d'installer un DocumentProvider que j'ai choisi pour être Total Commander (téléchargement) car il est gratuit et très pratique. Chargement latéral :
adb install tcandroidxxxx-universal.apk
Faites la même chose que ci-dessus pour le faire apparaître dans la barre latérale. Ouvrez-le et appuyez aveuglément en haut à droite pour ouvrir un menu "vide" où vous essayez d'appuyer sur l'avant-dernier élément pour passer du thème sombre au thème clair afin de enfin tout voir correctement.
Ouvrez Magisk (accordez-lui un accès root), appuyez sur Mettre à jour, laissez tout tel quel, appuyez sur suivant, "Sélectionner et corriger un fichier", choisissez Total Commander (url...) comme fournisseur, puis sélectionnez votre boot.img.
Copiez à nouveau le magisk_patched-xxx.img
résultant de son dossier de travail par défaut /storage/emulated/0/Download
sur votre ordinateur.
Depuis le démarrage de votre appareil vers fastboot :
adb reboot fastboot
et émettre la norme :
fastboot flash boot magisk_patched-xxx.img
et
fastboot reboot
Si tout s'est bien passé, votre appareil démarrera dans le système, vous pourrez ouvrir magisk et il signalera la version installée avec Ramdisk : oui . Si vous avez déjà installé SuperSU ou n'avez pas supprimé le binaire su préinstallé, il vous avertira d'une installation corrompue et vous demandera de supprimer toute racine précédente. Pour ce faire, supprimez tous les fichiers que vous avez ajoutés ou simplement les fichiers su
et libsupol.so
préinstallés.
Ouvrez n'importe quelle application qui demande au superutilisateur de s'assurer que tout fonctionne correctement et soyez accueilli par l'invite familière du superutilisateur :
J'ai rassemblé une liste de fichiers de firmware précédents remontant à la v1.0.1 (077).
A terminer dès que j'ai le temps.
Si quelque chose arrive à votre appareil, ouvrez-le, retirez le blindage du processeur, court-circuitez les deux connecteurs à broches suivants tout en appuyant sur le commutateur de réinitialisation situé à côté de l'interrupteur d'alimentation.
Cela mettra votre appareil en mode maskrom. Je n'entrerai pas dans les détails sur la façon exacte de récupérer l'appareil mais je vous laisserai les informations les plus pertinentes ainsi que les conseils pour faire des sauvegardes de toutes vos partitions avant d'apporter TOUTE modification à votre appareil.
Installez ensuite les pilotes Maskrom (assurez-vous d'activer les pilotes non signés dans Windows, puis utilisez des outils tels que RKImageMaker
et AFPTool
pour créer un fichier update.img qui peut être flashé via RKDevTool (à partir d'ici) dans Maskrom. RKDevTool contient les deux binaires susmentionnés dont vous avez besoin pour créer le paquet de mise à jour.
RKDevTool est livré par défaut en chinois et avec des contrôles de validation plus ou moins inutiles de votre firmware que vous pouvez désactiver en utilisant son .ini :
[Language]
Selected=2
et
FW_NOT_CHECK=TRUE
RB_CHECK_OFF=TRUE
CHECK_MACHINE_MODEL=FALSE
Dans l’ensemble, comprendre le processus a été une expérience amusante car le paysage du SDK et des outils Rockchip est extrêmement fragmenté.
Ces fichiers seront nécessaires pour une mise à jour complète.img. Vous pouvez les trouver à partir d'endroits tels que les sauvegardes de partition que vous avez effectuées et en partie à partir du SDK mentionné ci-dessus ou de Google.
Les fichiers krnl sont là depuis que j'ai créé une chaîne d'outils qui utilise un outil appelé imgRePackerRK (téléchargement) pour convertir les fichiers .img bruts au format compatible Rockchip (.img.krnl).
L'outil est apparemment conçu pour remplacer RKImageMaker et AFPTool et être une solution tout-en-un pour créer Rockchip update.img. Mais cela ne produirait pas de résultats cohérents pour moi.
Mais il convertit les images de noyau, de démarrage et de récupération compatibles avec la récupération Rockchip.
Imageboot.img.krnl contre Imageboot.img
Je l'utilise donc pour créer facilement les fichiers .krnl, puis j'exécute mon toolchain.bat pour créer un update.img fonctionnel tout en conservant les fichiers .img d'origine avec les fichiers .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
Pour vous aider tout au long du processus, voici également un /Image/parameter.txt
compatible :