Recebi o aparelho de presente. Sempre que recebo um novo dispositivo, dou uma olhada rápida nele. Especialmente com um dispositivo que solicita alguns dados pessoais ou críticos para os negócios. Embora neste caso eu confie mais ou menos na empresa Ratta para fazer o melhor que puder para proteger meus dados - sendo uma empresa (parte) chinesa, acredito que há limites para o que eles podem fazer. Todos nós estamos cientes da conversa sobre o estado das leis e regulamentos de privacidade na China. Além disso, eu tinha motivos para acreditar que os dispositivos estavam sendo fabricados por um fabricante OEM terceirizado, também localizado na China continental, e queria ver o que mais estava acontecendo no dispositivo.
TL;DR O dispositivo pode ser enraizado por meio de vários vetores de ataque. Baseado em software e também em hardware.
Boas notícias: depois de examinar o dispositivo, não encontrei nada obviamente comprometedor em termos de spyware ou outras práticas invasivas. Alguns dos aplicativos Ratta vêm com componentes Tencent parcialmente ofuscados incorporados. O dispositivo parece estar respeitando suas configurações de telemetria (observe Google, Apple e outros), mas verifica regularmente se há atualizações que pelo menos possam estar rastreando você em termos de localização e padrões de uso. Aparentemente, alguns servidores estão localizados na China, potencialmente abertos ao governo chinês. Mesmo que a empresa pareça estar atenta ao assunto e lançando servidores nos EUA. Para colocar as coisas em perspectiva: qualquer dispositivo Google ou Amazon incorporado, qualquer sistema operacional popular, qualquer smartphone ou aplicativo de mídia social popular reúne mais informações sobre você do que as que encontrei aqui.
Aviso: não aconselho ninguém a seguir este artigo na prática, pois muito provavelmente você tornará seu dispositivo inutilizável. Muito disso está escrito de memória. O que no meu caso não é muito confiável. Portanto, pode haver erros ou omissões que aumentem o risco de inutilizar seu dispositivo e anular sua garantia.
Atualização 2022/08/08: Notifiquei Ratta há pouco mais de duas semanas para avisá-los que divulgaria esta informação. Como esperado, Ratta respondeu gentilmente e prometeu trabalhar nas questões. Também quero salientar que não estou de forma alguma insinuando CHINA = MAL aqui. Estou expressando um desejo geral de que meus dados sejam seguros e privados e vejo problemas nas práticas de privacidade dos EUA, da Europa, da Índia, da Rússia,... tanto quanto vejo isso na China.
Veja acima. Dado o acesso físico, este dispositivo não pode ser considerado seguro para dados altamente confidenciais.
Dada a natureza da versão desatualizada do Android e a falta de medidas de segurança, em nenhuma circunstância disponibilizaria meu dispositivo para terceiros não confiáveis. Aconselho também a nunca conectá-lo a nenhum computador desconhecido ou cabo de carregamento público, pois alguns desses ataques podem ser realizados de forma totalmente automatizada.
Eu não sou uma pessoa de segurança. Isso me custou dois fins de semana coletando dados disponíveis publicamente. Qualquer pessoa ou grupo suficientemente motivado e mais talentoso do que eu será mais rápido. Além disso, como Ratta prometeu permitir o sideload de qualquer maneira, além de ver o dispositivo sendo totalmente aberto com binário su pré-instalado, chaves de teste públicas, carregador de inicialização aberto, interface de console adb (desativado, facilmente desbloqueado) e outras portas abertas, presumo que isso não criará nenhum inconveniente inesperado.
De qualquer forma, este documento foi disponibilizado a Ratta por e-mail em 27 de julho de 2022, duas semanas antes de ser publicado publicamente.
Não. Sob nenhuma circunstância distribuirei quaisquer arquivos que possam, mesmo remotamente, estar cobertos por direitos autorais ou algo semelhante. Se você sabe o que está fazendo, este artigo contém informações mais que suficientes. Caso contrário, deixe seu dispositivo como está e peça ao Ratta acesso shell/root ao seu dispositivo.
Você pode encontrar uma quantidade limitada de especificações do dispositivo instalando o aplicativo Kindle, que é - no momento em que este artigo foi escrito - o único aplicativo disponível na "app store" integrada do dispositivo. Ou você apenas descompacta um update.zip OTA.
O dispositivo roda Android 8.1 em uma plataforma Rockchip PX30 que consiste em um ARM Cortex-A35 quad core de 1,5 GHz, 2 GB de RAM e uma tela eink de 1404x1872. A plataforma Rockchip parece ser frequentemente encontrada em rádios automotivos e outros dispositivos incorporados que vêm com uma interface de usuário. Portanto, você pode encontrar muitas informações oficiais e menos oficiais apenas pesquisando no Google.
Assim: rockchip.fr/PX30%20datasheet%20V1.1.pdf Ou então: opensource.rock-chips.com/wiki_Main_Page
Deduzindo do fato de que existe um /r/supernote e um /r/supernote_beta no reddit, existe um programa beta para o dispositivo.
Ratta oferece informações sobre o lançamento e atualizações beta lá e também em seu site:
O não-beta atual pode ser baixado aqui: support.supernote.com/article/3/how-to-update-your-supernote
O beta não pode, pois sua distribuição está vinculada ao número de série do seu dispositivo conforme pode ser encontrado no SupernoteSettings.apk
, pois independente da versão atualmente instalada, ele se conecta ao mesmo servidor e URL. Veja abaixo informações mais detalhadas.
As atualizações são arquivos OTA Android comuns e não criptografados que podem ser facilmente descompactados e analisados usando ferramentas disponíveis gratuitamente. Veja abaixo para mais informações.
update.zip com imagens .br brotli descompactadas:
atualização.zip:/sistema
O dispositivo é atualizado em coordenação com um servidor em device.supernote.com.cn
para ver se há uma nova atualização disponível:
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"}]}'
As mensagens de erro estão em chinês, mas são normais. Dispositivo não precisa de atualização , número de série desconhecido , etc.
Se uma atualização estiver disponível, o dispositivo receberá um URL de download junto com um changelog completo, etc.
{"sucesso":true,"errorCode":null,"errorMsg":null,"configureList":[{"type":"1","versão":"Chauvet.xxxx.xxxxxxxxxx.xxx_xxxxxxx","nomedoarquivo" :"Chauvet.xxxx.xxxxxxxxxx.xxx_xxxxxxx.zip","nome":null,"nomedopacote":null,"versão Não":null,"url":"https://prod-ratta-firmware.s3.ap-northeast-1.amazonaws.com/xxxxxx/update.zip","size":xxxxxxxx,"md5":" abcdefabcdefabcdefabcdef"}],"totalSize":xxxxxxxx,"fixPointList":[{"atual":false,"versão":"Chauvet xxxx(xxx)","pontofixo":"
...
","opTime":"xxxx-xx-xx xx:xx:xx"}],"logicVersion":" Chauvet xxxx(xxx)","deployDate":"xxxx-xx-xx xx:xx:xx"}
Que é então baixado e entregue ao sistema de recuperação.
O mesmo acontece se você seguir as instruções de atualização manual colocando um arquivo update.zip na pasta /EXPORT/
do seu dispositivo e puxando o cabo USB. O dispositivo descobre o arquivo e pergunta se deve prosseguir com a instalação.
O mecanismo exato pode ser deduzido do código a seguir.
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 você pode ver, não há verificações de integridade ou qualquer tipo de descriptografia em andamento. Então você pode basicamente pegar qualquer arquivo, movê-lo para a pasta /EXPORT/ e deixar o sistema entregá-lo para recuperação.
Nunca verifiquei, mas lendo o código presumo que você pode atualizar e fazer downgrade do seu dispositivo à vontade por USB.
Embora seja o mecanismo de recuperação padrão do Android (com o qual não estou muito familiarizado), ele verificará se o arquivo está assinado com uma chave privada conhecida.
O dispositivo vem com uma interface ADB fechada. É necessário o comando adb reboot
que permite colocá-lo em recovery adb reboot recovery
, bem como em fastboot adb reboot fastboot
ou modo bootloader adb reboot loader
.
No modo de recuperação, o dispositivo permite um shell que é executado como root. Um conjunto de comandos limitado está disponível, mas o busybox está instalado, então deixa pra lá. Um passo lógico seria desbloquear o acesso total ao adb criando um 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
Depois disso, o dispositivo fica basicamente totalmente acessível por meio de um shell adb padrão que pode então ser elevado para root:
Para usuários não técnicos: isso significa que seu dispositivo está basicamente aberto, junto com todos os seus arquivos. Qualquer usuário motivado pode, a qualquer momento, copiar ou modificar qualquer arquivo em seu dispositivo com acesso USB.
Como o bootloader está desbloqueado, você pode a qualquer momento atualizar qualquer kernel ou partição reiniciando o dispositivo neste modo e fastboot flash boot boot.img
Para usuários não técnicos: isso significa que seu dispositivo pode ser modificado livremente de forma que você não perceba e, assim, coloque seus dados e privacidade em risco.
Neste modo, o dispositivo está sendo detectado como "LOADER MODE" pelas ferramentas de desenvolvedor Rockchip como RKDevTool. A partir daqui as partições podem ser substituídas, o layout da partição pode ser alterado...
...e o dispositivo pode ser colocado no modo Maskrom. Mais sobre isso abaixo.
Para usuários não técnicos: isso significa que seu dispositivo pode ser modificado livremente de forma que você não perceba e, assim, coloque seus dados e privacidade em risco.
Quando olhei para o /system/build.prop
encontrei
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
não é um bom sinal. Se você é o desenvolvedor. É um belo sinal se você está procurando uma porta aberta para o sistema.
Não vou entrar em detalhes sobre o Android OTA, mas você pode ler sobre ele aqui.
Observando update.zip: /META-INF/com/android/otacert
podemos ver o certificado público da atualização:
-----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
-----FIM CERTIFICADO-----
Pesquisar parte do certificado no Google produz pelo menos um resultado de xda-developers.com, onde alguém está tentando entrar em seu dispositivo Android 8.1 Rockchip PX5.
Esse é um sinal ainda pior. Ou um ainda mais bonito para mim.
Em seguida, pesquisei no Google um SDK em torno da plataforma PX30 e encontrei um aqui:
en.t-firefly.com/doc/download/page/id/63.html#other_206
junto com os documentos aqui:
wiki.t-firefly.com/en/Core-PX30-JD4/Android_development.html
e aqui:
wiki.t-firefly.com/en/Firefly-RK3399/customize_android_firmware.html
Baixando o SDK você pode descompactar o arquivo 7z e iniciar o repositório git contido através de:
git clone PX30_Android8.1.0_LVDS_190706 directory_to_clone_into
Após um longo clone, encontre as chaves de teste dos SDKs em /build/make/target/product/security
e pronto.
Curiosidade: README nessa pasta afirma:
As chaves de teste neste diretório são usadas apenas no desenvolvimento e NUNCA devem ser usadas para assinar pacotes em imagens divulgadas publicamente (pois isso abriria uma grande falha de segurança).
Sim, confirmado.
Deixo a técnica para você - enquanto trabalho no Windows, uso o Multi Image Kitchen para descompactar, reembalar e assinar OTAs do Android. Você terá que mover seu testkey.x509.pem
e testkey.pk8
para a pasta bin
da ferramenta e a partir daí poderá criar atualizações modificadas que o dispositivo não terá escolha a não ser instalar quando você colocá-lo na pasta EXPORT .
Bem, provavelmente.
Tudo o que você faz a partir daqui é extremamente propenso a erros e a bloquear suavemente seu dispositivo. Pelo que eu sei, todos os dispositivos Rockchip nunca podem ser totalmente soft brickados, pois sempre vêm com um modo maskrom que basicamente é uma interface de programação aberta.
Normalmente esta interface pode ser acessada através de um curto-circuito em dois pinos da CPU. Isso também funciona no seu Supernote, mas envolve a abertura do dispositivo e provavelmente a anulação de qualquer garantia restante que você possa ter.
Veja abaixo todas as informações sobre o maskrom PX30 e como recuperar seu dispositivo.
Faça backup de todas as partições em um shell adb root:
adb shell
por exemplo, emitindo estes 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
e potencialmente até salvar seus dados de usuário:
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
A atualização que estava no meu dispositivo já veio com um binário su e muitos atalhos que me deram acesso fácil a uma interface root adb.
Algumas modificações que experimentei foram:
/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
E enquanto estava lá, bloqueei as verificações de atualização muito frequentes e a telemetria opcional (também bloqueia a App Store integrada, mas isso é praticamente inútil, pois agora podemos transferir aplicativos para o 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
Você tem uma interface root adb funcional a partir daqui, pode carregar aplicativos lateralmente e modificar totalmente o /system de acordo com sua preferência após emitir um mount -o remount,rw /system
O primeiro passo que fiz foi instalar uma solução raiz baseada no sistema SuperSU funcionando corretamente. Para isso baixei o supersu.zip mais recente, descompactei, olhei o script de instalação e coloquei os arquivos no lugar manualmente de uma forma 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
E modifique /system/bin/install-recovery.sh
para terminar em:
/system/xbin/daemonsu --auto-daemon &
/system/etc/install-recovery-2.sh
Em seguida, modifique os contextos dos arquivos e os direitos de acesso, modificando system_file_contexts.txt
para terminar em:
/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
e system_fs_config.txt
para terminar em:
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
Funcionou perfeitamente bem.
Teria sido simples implementar um script rápido, mas neste ponto eu estava entrando no root do Android e meu plano era instalar um root sem sistema magisk adequado.
Magisk pode produzir kernel boot.img "enraizado" pré-modificado e ramdisk alimentando-o com boot.img não modificado.
Pegue o boot.img
da raiz do seu update.zip
e copie-o para /storage/emulated/0/Download
Sideload mais recente do Magisk assim:
adb install Magisk-v25.x.apk
No dispositivo, vá para Settings > Apps > My apps
para fazer o sistema atualizar a lista de aplicativos e adicionar Magisk à barra lateral. Talvez seja necessário rolar até lá para encontrá-lo, já que a interface do iniciador claramente não foi feita para pessoas com muitos aplicativos.
Antes de poder escolher um arquivo para corrigir no Magisk precisei instalar um DocumentProvider que escolhi ser o Total Commander (download) por ser gratuito e super prático. Carregou isso:
adb install tcandroidxxxx-universal.apk
Faça o mesmo acima para que apareça na barra lateral. Abra-o e toque cegamente no canto superior direito para abrir um menu "vazio" onde você tenta tocar no penúltimo item para mudar do tema escuro para o claro para finalmente ver tudo corretamente.
Abra o Magisk (conceda acesso root), toque em Atualizar, deixe tudo como está, toque em próximo, "Selecionar e corrigir um arquivo", escolha Total Commander (url...) como provedor e selecione seu boot.img.
Copie novamente o magisk_patched-xxx.img
resultante de sua pasta de trabalho padrão /storage/emulated/0/Download
de volta para o seu computador.
Da inicialização do seu dispositivo para o fastboot:
adb reboot fastboot
e emitir o padrão:
fastboot flash boot magisk_patched-xxx.img
e
fastboot reboot
Se tudo correr bem, seu dispositivo irá inicializar no sistema, você pode abrir o magisk e ele reportará a versão instalada junto com o Ramdisk: sim . Se você instalou o SuperSU anteriormente ou não removeu o binário su pré-instalado, ele irá avisá-lo sobre uma instalação corrompida e solicitará que você remova qualquer root anterior. Você faz isso removendo todos os arquivos adicionados ou apenas o su
e libsupol.so
pré-instalados
Abra qualquer aplicativo que solicite o Superusuário para garantir que tudo esteja funcionando corretamente e seja recebido pelo prompt familiar do Superusuário:
Montei uma lista de arquivos de firmware anteriores desde a v1.0.1 (077).
Para ser concluído assim que tiver tempo.
Caso algo aconteça com o seu dispositivo, abra-o, remova a blindagem da CPU, coloque em curto os dois conectores de pinos a seguir enquanto pressiona o botão de reinicialização próximo ao botão liga / desliga.
Isso colocará seu dispositivo no modo maskrom. Não entrarei em todos os detalhes sobre como recuperar o dispositivo exatamente, mas deixarei para você as informações mais relevantes, bem como o conselho para fazer backups de todas as suas partições antes de fazer QUALQUER modificação no seu dispositivo.
Em seguida, instale os drivers maskrom (certifique-se de habilitar drivers não assinados no Windows e use ferramentas como RKImageMaker
e AFPTool
para criar um update.img que pode ser atualizado através do RKDevTool (a partir daqui) no maskrom. RKDevTool contém os dois binários mencionados acima que você precisa para criar o pacote de atualização.
O RKDevTool por padrão vem no idioma chinês e com verificações de validação mais ou menos inúteis do seu firmware que você pode desligar usando seu .ini:
[Language]
Selected=2
e
FW_NOT_CHECK=TRUE
RB_CHECK_OFF=TRUE
CHECK_MACHINE_MODEL=FALSE
Resumindo, descobrir o processo foi uma experiência divertida, já que o SDK da Rockchip e o cenário de ferramentas são extremamente fragmentados.
Esses arquivos serão necessários para um update.img completo. Você pode obtê-los de locais como os backups de partição que você fez e em partes do SDK mencionado acima ou pesquisando no Google.
Os arquivos krnl estão lá desde que criei um conjunto de ferramentas que usa uma ferramenta chamada imgRePackerRK (download) para converter arquivos .img brutos para o formato compatível com Rockchip (.img.krnl).
A ferramenta aparentemente foi feita para substituir RKImageMaker e AFPTool e ser uma solução completa para criar Rockchip update.img. Mas não produziria resultados consistentes para mim.
Mas converte imagens de kernel, inicialização e recuperação que são compatíveis com a recuperação Rockchip.
Imagemboot.img.krnl vs. Imagemboot.img
Então, eu o uso para criar os arquivos .krnl convenientemente e, em seguida, executo meu toolchain.bat para criar um update.img funcional, mantendo os arquivos .img originais junto com os arquivos .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 ajudá-lo ao longo do caminho, aqui está também um /Image/parameter.txt
compatível: