Recibí el dispositivo como regalo. Cada vez que recibo un dispositivo nuevo, lo miro rápidamente. Especialmente con un dispositivo que invita a obtener datos críticos bastante personales o comerciales. Aunque en este caso confío más o menos en la empresa Ratta para hacer lo mejor que pueda para proteger mis datos; al ser una empresa (parcialmente) china, creo que hay límites a lo que pueden hacer. Todos somos conscientes de la conversación sobre el estado de las leyes y regulaciones de privacidad en China. También tenía motivos para creer que los dispositivos los fabrica un fabricante OEM externo también ubicado en China continental y quería ver qué más estaba sucediendo en el dispositivo.
TL;DR El dispositivo puede ser rooteado a través de múltiples vectores de ataque. Basado en software y hardware.
Buenas noticias: después de examinar el dispositivo no pude encontrar nada evidentemente comprometedor en términos de software espía u otras prácticas invasivas. Algunas de las aplicaciones de Ratta vienen con componentes Tencent parcialmente ofuscados integrados. El dispositivo parece respetar su configuración de telemetría (tenga en cuenta que Google, Apple y otros) pero busca regularmente actualizaciones que al menos podrían estar rastreando su ubicación y patrones de uso. Algunos servidores aparentemente están ubicados en China, por lo que potencialmente están abiertos al gobierno chino. Aunque la empresa parece estar consciente del tema y está implementando servidores en los EE. UU. Para poner las cosas en perspectiva: cualquier dispositivo integrado de Google o Amazon, cualquier sistema operativo popular, cualquier teléfono inteligente o aplicación de redes sociales popular recopila más información sobre usted que la que encontré aquí.
Advertencia: No recomiendo a nadie que siga este artículo en la práctica, ya que es muy probable que su dispositivo quede inservible. Gran parte de esto está escrito de memoria. Lo cual en mi caso no es muy confiable. Por lo tanto, puede haber errores u omisiones que aumenten el riesgo de que su dispositivo quede inutilizable además de anular su garantía.
Actualización 08/08/2022: Notifiqué a Ratta hace poco más de dos semanas para informarles que publicaría esta información. Como era de esperar, Ratta respondió amablemente y prometió trabajar en los problemas. También quiero señalar que de ninguna manera estoy insinuando que CHINA = MAL aquí. Expreso un deseo general de que mis datos sean seguros y privados y veo problemas en las prácticas de privacidad de EE. UU., Europa, India, Rusia... tanto como los veo en China.
Ver arriba. Dado el acceso físico, este dispositivo no puede considerarse seguro para ningún dato altamente confidencial.
Dada la naturaleza de su versión obsoleta de Android y la falta de medidas de seguridad, bajo ninguna circunstancia pondría mi dispositivo a disposición de ninguna parte que no sea de confianza. También recomendaría no conectarlo nunca a ningún ordenador desconocido ni a un cable de carga público, ya que algunos de estos ataques se pueden realizar de forma totalmente automatizada.
No soy una persona de seguridad. Esto me costó dos fines de semana recopilando datos disponibles públicamente. Cualquier persona o grupo lo suficientemente motivado y con más talento que yo será más rápido. Además, dado que Ratta prometió permitir la descarga de todos modos, además de ver el dispositivo abrirse de par en par con su binario preinstalado, claves de prueba públicas, cargador de arranque abierto, interfaz de consola adb (deshabilitada, fácilmente desbloqueable) y otras puertas abiertas, supongo que esto no creará ninguna inconveniente inesperado.
De cualquier manera, este documento se puso a disposición de Ratta por correo electrónico el 27 de julio de 2022, dos semanas antes de su publicación pública.
No. Bajo ninguna circunstancia distribuiré ningún archivo que pueda estar cubierto, ni remotamente, por derechos de autor o similares. Si sabe lo que está haciendo, este artículo contiene información más que suficiente. De lo contrario, deje su dispositivo como está y solicite a Ratta acceso de shell/root a su dispositivo.
Puede encontrar una cantidad limitada de especificaciones del dispositivo instalando la aplicación Kindle que es, al momento de escribir este artículo, la única aplicación disponible en la "tienda de aplicaciones" integrada del dispositivo. O simplemente descomprime un update.zip OTA.
El dispositivo ejecuta Android 8.1 en una plataforma Rockchip PX30 que consta de un ARM Cortex-A35 de cuatro núcleos a 1,5 GHz, 2 gigas de RAM y una pantalla eink de 1404x1872. La plataforma Rockchip parece encontrarse a menudo en radios de automóviles y otros dispositivos integrados que vienen con una interfaz de usuario. Por lo tanto, puede encontrar mucha información oficial y menos oficial simplemente buscando en Google.
Así: rockchip.fr/PX30%20datasheet%20V1.1.pdf O algo así: opensource.rock-chips.com/wiki_Main_Page
Deduciendo del hecho de que hay un /r/supernote y un /r/supernote_beta en reddit, existe un programa beta para el dispositivo.
Ratta ofrece información sobre el lanzamiento y las actualizaciones beta allí y en su sitio web:
La versión no beta actual se puede descargar desde aquí: support.supernote.com/article/3/how-to-update-your-supernote
La beta no puede ya que su distribución está ligada al número de serie de tu dispositivo como se puede encontrar en SupernoteSettings.apk
, ya que independientemente de la versión actualmente instalada, se conecta al mismo servidor y URL. Consulte a continuación para obtener información más detallada.
Las actualizaciones son archivos OTA de Android comunes y no cifrados que se pueden descomprimir y analizar fácilmente utilizando herramientas disponibles gratuitamente. Consulte a continuación para obtener más información.
update.zip con imágenes .br brotli descomprimidas:
actualizar.zip:/sistema
El dispositivo se actualiza coordinándose con un servidor en device.supernote.com.cn
para ver si hay una nueva actualización 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"}]}'
Los mensajes de error están en chino, pero son los habituales. El dispositivo no necesita actualización , Número de serie desconocido , etc.
Si hay una actualización disponible, el dispositivo recibe una URL de descarga junto con un registro de cambios completo, etc.
{"success":true,"errorCode":null,"errorMsg":null,"configureList":[{"type":"1","version":"Chauvet.xxxx.xxxxxxxxxx.xxx_xxxxxxx","fileName" :"Chauvet.xxxx.xxxxxxxxxx.xxx_xxxxxxx.zip","nombre":null,"nombredelpaquete":null,"versión No":null,"url":"https://prod-ratta-firmware.s3.ap-northeast-1.amazonaws.com/xxxxxx/update.zip","size":xxxxxxxx,"md5":" abcdefabcdefabcdefabcdef"}],"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"}
Que luego se descarga y se entrega al sistema de recuperación.
Lo mismo sucede si sigue las instrucciones de actualización manual colocando un archivo update.zip en la carpeta /EXPORT/
de su dispositivo y desconecta el cable USB. El dispositivo descubre el archivo y le pregunta si debe continuar con la instalación.
El mecanismo exacto se puede deducir del siguiente código.
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
Como puede ver, no se realizan controles de cordura ni ningún tipo de descifrado. Básicamente, puedes tomar cualquier archivo, moverlo a la carpeta /EXPORTAR/ y dejar que el sistema lo entregue para recuperación.
Nunca lo verifiqué, pero al leer el código supongo que puedes actualizar y degradar tu dispositivo a voluntad a través de USB.
Aunque, dado que es el mecanismo de recuperación estándar de Android (con el que no estoy muy familiarizado), comprobará si el archivo está firmado con una clave privada conocida.
El dispositivo viene con una interfaz ADB cerrada. Se necesita el comando adb reboot
que le permite ponerlo en recovery adb reboot recovery
así como en fastboot adb reboot fastboot
o modo bootloader adb reboot loader
.
En modo de recuperación, el dispositivo permite un shell que se ejecuta como root. Hay disponible un conjunto de comandos limitado, pero Busybox está instalado, así que no importa. Un paso lógico sería desbloquear el acceso completo a adb creando un script como este:
#! /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
Después de lo cual, básicamente se puede acceder completamente al dispositivo a través de un shell adb estándar que luego se puede elevar a raíz:
Para usuarios no técnicos: esto significa que su dispositivo está básicamente abierto, junto con todos sus archivos. Cualquier usuario motivado podría en cualquier momento copiar o modificar cualquier archivo en su dispositivo con acceso USB.
Dado que el gestor de arranque está desbloqueado, en cualquier momento puede actualizar cualquier kernel o partición reiniciando el dispositivo en este modo y fastboot flash boot boot.img
Para usuarios no técnicos: esto significa que su dispositivo podría modificarse libremente de tal manera que usted no se dé cuenta y, por lo tanto, ponga en riesgo sus datos y su privacidad.
En este modo, las herramientas de desarrollo de Rockchip como RKDevTool detectan el dispositivo como "MODO CARGADOR". Desde aquí se pueden sobrescribir las particiones, se puede cambiar el diseño de las particiones...
...y el dispositivo se puede poner en modo Maskrom. Más sobre eso a continuación.
Para usuarios no técnicos: esto significa que su dispositivo podría modificarse libremente de tal manera que usted no se dé cuenta y, por lo tanto, ponga en riesgo sus datos y su privacidad.
Cuando miré el /system/build.prop
encontré
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
no es una muy buena señal. Si eres el desarrollador. Es una hermosa señal si está buscando una puerta abierta de par en par al sistema.
No voy a entrar en detalles sobre Android OTA, pero puedes leer sobre ello aquí.
Al mirar update.zip: /META-INF/com/android/otacert
podemos ver el certificado público de la actualización:
-----INICIAR CERTIFICADO-----
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
-----CERTIFICADO FINAL-----
Buscar en Google parte del certificado arroja al menos un resultado de xda-developers.com donde alguien está intentando acceder a su dispositivo Android 8.1 Rockchip PX5.
Esa es una señal aún peor. O uno aún más bonito para mí.
Luego busqué en Google un SDK para la plataforma PX30 y encontré uno aquí:
es.t-firefly.com/doc/download/page/id/63.html#other_206
junto con documentos aquí:
wiki.t-firefly.com/en/Core-PX30-JD4/Android_development.html
y aquí:
wiki.t-firefly.com/en/Firefly-RK3399/customize_android_firmware.html
Al descargar el SDK, puede descomprimir el archivo 7z e iniciar el repositorio de git contenido a través de:
git clone PX30_Android8.1.0_LVDS_190706 directory_to_clone_into
Después de una clonación prolongada, busque las claves de prueba de los SDK en /build/make/target/product/security
y estará listo.
Dato curioso: README en esa carpeta dice:
Las claves de prueba en este directorio se usan solo en desarrollo y NUNCA deben usarse para firmar paquetes en imágenes publicadas públicamente (ya que eso abriría un agujero de seguridad importante).
Sí, confirmado.
Te dejo la técnica a ti: mientras trabajo en Windows, uso Multi Image Kitchen para descomprimir, recomprimir y firmar OTA de Android. Tendrá que mover su testkey.x509.pem
y testkey.pk8
a la carpeta bin
de la herramienta y desde allí podrá crear actualizaciones modificadas que el dispositivo no tendrá más remedio que instalar cuando lo coloque en la carpeta EXPORTAR. .
Bueno, probablemente.
Todo lo que haga desde aquí es extremadamente propenso a errores y a bloquear su dispositivo. Hasta donde yo sé, todos los dispositivos Rockchip nunca pueden ser completamente de ladrillo, ya que siempre vienen con un modo Maskrom que básicamente es una interfaz de programación abierta.
Por lo general, se puede acceder a esta interfaz acortando dos pines de la CPU. Esto también funciona en tu Supernote, pero implica abrir el dispositivo y muy probablemente anular cualquier garantía restante que puedas tener.
Consulte a continuación toda la información sobre PX30 Maskrom y cómo recuperar su dispositivo.
Haga una copia de seguridad de todas las particiones en un shell adb raíz:
adb shell
por ejemplo emitiendo estos comandos:
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
y potencialmente incluso guardar sus datos de usuario:
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 actualización que estaba en mi dispositivo ya venía con un binario su y muchos atajos que me daban fácil acceso a una interfaz raíz adb.
Algunas modificaciones con las que experimenté fueron:
/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
Y mientras estaba allí, bloqueé las comprobaciones de actualización muy frecuentes y la telemetría opcional (también bloquea la App Store integrada, pero eso es bastante inútil ya que ahora podemos descargar aplicaciones en el dispositivo)
/sistema/etc/hosts
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
Tiene una interfaz raíz adb funcional desde aquí, puede descargar aplicaciones y modificar completamente /system a su gusto después de emitir un mount -o remount,rw /system
El primer paso que di fue instalar una solución raíz basada en el sistema SuperSU que funcionara correctamente. Para eso descargué el último supersu.zip, lo descomprimí, miré el script de instalación y coloqué los archivos manualmente de una manera súper 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
Y modifique /system/bin/install-recovery.sh
para que termine en:
/system/xbin/daemonsu --auto-daemon &
/system/etc/install-recovery-2.sh
Luego modifique los contextos de los archivos y los derechos de acceso modificando system_file_contexts.txt
para que termine en:
/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
y system_fs_config.txt
para terminar en:
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
Funcionó perfectamente bien.
Habría sido sencillo implementar un script rápido, pero en este punto apenas estaba ingresando a la raíz de Android y mi plan era instalar una raíz sin sistema magisk adecuada.
Magisk puede producir un kernel y un disco ram boot.img "rooteados" premodificados alimentándolo con el boot.img no modificado.
Tome el boot.img
de la raíz de su update.zip
y cópielo en /storage/emulated/0/Download
Descargue el último Magisk de esta manera:
adb install Magisk-v25.x.apk
En el dispositivo, vaya a Settings > Apps > My apps
para que el sistema actualice la lista de aplicaciones y agregue Magisk a la barra lateral. Es posible que tengas que desplazarte hasta allí para encontrarlo, ya que la interfaz de usuario del iniciador claramente no está diseñada para personas con muchas aplicaciones.
Antes de poder elegir un archivo para parchear en Magisk, necesitaba instalar un DocumentProvider que elegí como Total Commander (descargar), ya que es gratuito y muy útil. Descartó eso:
adb install tcandroidxxxx-universal.apk
Haga lo mismo que arriba para que aparezca en la barra lateral. Ábrelo y toca ciegamente en la parte superior derecha para abrir un menú "vacío" donde intentas tocar el penúltimo elemento para cambiar del tema oscuro al claro para finalmente ver todo correctamente.
Abra Magisk (otorgue acceso de root), toque Actualizar, deje todo como está, toque siguiente, "Seleccionar y parchear un archivo", elija Total Commander (url...) como proveedor y luego seleccione su boot.img.
Nuevamente copie el magisk_patched-xxx.img
resultante desde su carpeta de trabajo predeterminada /storage/emulated/0/Download
nuevamente a su computadora.
Desde iniciar su dispositivo en fastboot:
adb reboot fastboot
y emitir la norma:
fastboot flash boot magisk_patched-xxx.img
y
fastboot reboot
Si todo salió bien, su dispositivo se iniciará en el sistema, puede abrir magisk y le informará la versión instalada junto con Ramdisk: sí . Si instaló SuperSU anteriormente o no eliminó el binario su preinstalado, le advertirá sobre una instalación dañada y le pedirá que elimine cualquier raíz anterior. Para ello, elimine todos los archivos que agregó o solo los su
y libsupol.so
preinstalados.
Abra cualquier aplicación que solicite al Superusuario que se asegure de que todo funcione correctamente y recibirá el familiar mensaje de Superusuario:
Reuní una lista de archivos de firmware anteriores que se remontan a v1.0.1(077).
Para completar una vez que tenga tiempo.
En caso de que algo le suceda a su dispositivo, ábralo, retire el blindaje de la CPU, corte los siguientes dos pines mientras presiona el interruptor de reinicio al lado del interruptor de encendido.
Esto pondrá su dispositivo en modo Maskrom. No entraré en detalles sobre cómo recuperar el dispositivo exactamente, pero le dejaré la información más relevante, así como consejos para hacer copias de seguridad de todas sus particiones antes de realizar CUALQUIER modificación en su dispositivo.
Luego instale los controladores Maskrom (asegúrese de habilitar los controladores no firmados en Windows y luego use herramientas como RKImageMaker
y AFPTool
para crear un update.img que se pueda actualizar a través de RKDevTool (desde aquí) en Maskrom. RKDevTool contiene los dos archivos binarios antes mencionados que necesita para crear el paquete de actualización.
RKDevTool por defecto viene en idioma chino y con comprobaciones de validación de tu firmware más o menos inútiles que puedes desactivar usando su .ini:
[Language]
Selected=2
y
FW_NOT_CHECK=TRUE
RB_CHECK_OFF=TRUE
CHECK_MACHINE_MODEL=FALSE
En general, descubrir el proceso fue una experiencia divertida, ya que el SDK de Rockchip y el panorama de herramientas están extremadamente fragmentados.
Estos archivos serán necesarios para un update.img completo. Puede obtenerlos de lugares como las copias de seguridad de la partición que realizó y, en partes, del SDK mencionado anteriormente o de buscar en Google.
Los archivos krnl están ahí desde que creé una cadena de herramientas que utiliza una herramienta llamada imgRePackerRK (descargar) para convertir archivos .img sin formato al formato compatible con Rockchip (.img.krnl).
Aparentemente, la herramienta está diseñada para reemplazar RKImageMaker y AFPTool y ser una solución todo en uno para crear Rockchip update.img. Pero no me produciría resultados consistentes.
Pero convierte imágenes de kernel, arranque y recuperación que son compatibles con la recuperación de Rockchip.
Imagenboot.img.krnl frente a Imagenboot.img
Así que lo uso para crear los archivos .krnl cómodamente y luego ejecuto mi toolchain.bat para crear un update.img que funcione mientras mantengo los archivos .img originales junto con los archivos .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
Para ayudarle en el camino, aquí también hay un /Image/parameter.txt
compatible: