Ich habe das Gerät geschenkt bekommen. Immer wenn ich ein neues Gerät erhalte, schaue ich mir das Gerät kurz an. Besonders bei einem Gerät, das eher persönliche oder geschäftskritische Daten einlädt. Auch wenn ich in diesem Fall mehr oder weniger darauf vertraue, dass die Firma Ratta das Beste tut, was sie kann, um meine Daten zu schützen – da es sich um ein (teilweise) chinesisches Unternehmen handelt, sind meiner Meinung nach ihre Möglichkeiten begrenzt. Wir alle sind uns der Diskussion über den Stand der Datenschutzgesetze und -bestimmungen in China bewusst. Außerdem hatte ich Grund zu der Annahme, dass Geräte von einem OEM-Dritthersteller hergestellt werden, der ebenfalls auf dem chinesischen Festland ansässig ist, und wollte sehen, was sonst noch mit dem Gerät passiert.
TL;DR Das Gerät kann durch mehrere Angriffsvektoren gerootet werden. Sowohl software- als auch hardwarebasiert.
Gute Nachrichten: Nachdem ich mir das Gerät angesehen hatte, konnte ich nichts erkennen, was offensichtlich eine Bedrohung durch Spyware oder andere invasive Praktiken darstellte. In einige der Ratta-Apps sind teilweise verschleierte Tencent-Komponenten eingebettet. Das Gerät scheint Ihre Telemetrieeinstellungen zu respektieren (beachten Sie Google, Apple usw.), sucht aber regelmäßig nach Updates, die Sie zumindest in Bezug auf Standort und Nutzungsmuster verfolgen könnten. Einige Server befinden sich offenbar in China und sind daher möglicherweise für die chinesische Regierung zugänglich. Auch wenn das Unternehmen sich des Themas und der Einführung von Servern in den USA bewusst zu sein scheint. Um die Dinge ins rechte Licht zu rücken: Jedes eingebettete Google- oder Amazon-Gerät, jedes gängige Betriebssystem, jedes Smartphone oder jede beliebte Social-Media-App sammelt mehr Informationen über Sie als das, was ich hier gefunden habe.
Warnung: Ich rate niemandem, diese Beschreibung in der Praxis zu befolgen, da Ihr Gerät dadurch höchstwahrscheinlich unbrauchbar wird. Vieles davon ist aus dem Gedächtnis niedergeschrieben. Was in meinem Fall nicht sehr zuverlässig ist. Daher kann es zu Fehlern oder Auslassungen kommen, die das Risiko erhöhen, dass Ihr Gerät unbrauchbar wird und Ihre Garantie erlischt.
Update 08.08.2022: Ich habe Ratta vor etwas mehr als zwei Wochen benachrichtigt, um ihnen mitzuteilen, dass ich diese Informationen veröffentlichen würde. Wie erwartet antwortete Ratta freundlich und versprach, an den Problemen zu arbeiten. Ich möchte auch darauf hinweisen, dass ich hier in keiner Weise CHINA = BÖSE impliziere. Ich äußere den allgemeinen Wunsch, dass meine Daten sicher und privat sind, und sehe in den Datenschutzpraktiken in den USA, Europa, Indien, Russland usw. genauso viele Probleme wie in China.
Siehe oben. Angesichts des physischen Zugriffs kann dieses Gerät nicht als sicher für hochsensible Daten angesehen werden.
Angesichts der Art der veralteten Android-Version und der fehlenden Sicherheitsmaßnahmen würde ich mein Gerät unter keinen Umständen einer nicht vertrauenswürdigen Partei zur Verfügung stellen. Ich würde außerdem raten, es niemals an einen unbekannten Computer oder ein öffentliches Ladekabel anzuschließen, da einige dieser Angriffe vollständig automatisiert ausgeführt werden können.
Ich bin kein Sicherheitsmann. Das hat mich zwei Wochenenden gekostet, um öffentlich verfügbare Daten zu sammeln. Jede Person oder Gruppe, die motivierter und talentierter ist als ich, wird schneller sein. Da Ratta versprochen hat, Sideloading sowieso zuzulassen und zu sehen, wie das Gerät mit vorinstallierter su-Binärdatei, öffentlichen Testschlüsseln, offenem Bootloader, (deaktivierter, leicht entsperrbarer) ADB-Konsolenschnittstelle und anderen offenen Türen weit geöffnet wird, gehe ich davon aus, dass dadurch keine Türen entstehen unerwartete Unannehmlichkeiten.
Auf jeden Fall wurde dieses Dokument Ratta am 27. Juli 2022 per E-Mail zur Verfügung gestellt, zwei Wochen vor der öffentlichen Veröffentlichung.
Nein. Unter keinen Umständen werde ich Dateien verbreiten, die auch nur annähernd dem Urheberrecht oder Ähnlichem unterliegen könnten. Wenn Sie wissen, was Sie tun, enthält dieser Artikel mehr als genug Informationen. Wenn nicht, lassen Sie Ihr Gerät bitte unverändert und bitten Sie Ratta um Shell-/Root-Zugriff auf Ihr Gerät.
Sie können eine begrenzte Anzahl von Gerätespezifikationen finden, indem Sie die Kindle-App installieren, die zum Zeitpunkt des Verfassens dieses Artikels die einzige verfügbare App im integrierten „App Store“ des Geräts ist. Oder Sie entpacken einfach eine OTA update.zip.
Auf dem Gerät läuft Android 8.1 auf einer Rockchip PX30-Plattform, die aus einem 1,5-GHz-Quad-Core-ARM-Cortex-A35, 2 GB RAM und einem 1404x1872-Eink-Display besteht. Die Rockchip-Plattform scheint häufig in Autoradios und anderen eingebetteten Geräten zu finden, die über eine Benutzeroberfläche verfügen. Sie können also viele offizielle und weniger offizielle Informationen dazu finden, indem Sie einfach googeln.
Etwa so: rockchip.fr/PX30%20datasheet%20V1.1.pdf Oder so: opensource.rock-chips.com/wiki_Main_Page
Aus der Tatsache, dass es auf reddit ein /r/supernote und ein /r/supernote_beta gibt, gibt es ein Betaprogramm für das Gerät.
Informationen zu beiden Release- und Beta-Updates bietet Ratta dort sowie auf ihrer Website:
Die aktuelle Nicht-Beta kann hier heruntergeladen werden: support.supernote.com/article/3/how-to-update-your-supernote
Die Beta kann nicht, da ihre Verteilung an die Seriennummer Ihres Geräts gebunden ist, die in SupernoteSettings.apk
zu finden ist, da sie unabhängig von der aktuell installierten Version eine Verbindung zu demselben Server und derselben URL herstellt. Weitere ausführliche Informationen finden Sie weiter unten.
Bei Updates handelt es sich um gängige, unverschlüsselte Android-OTA-Dateien, die mit frei verfügbaren Tools einfach entpackt und analysiert werden können. Weitere Informationen finden Sie weiter unten.
update.zip mit entpackten .br Brotli-Bildern:
update.zip:/system
Das Gerät wird aktualisiert, indem es sich mit einem Server unter device.supernote.com.cn
koordiniert, um zu sehen, ob ein neues Update verfügbar ist:
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"}]}'
Fehlermeldungen sind auf Chinesisch, aber die üblichen sind „Gerät benötigt kein Update“ , „Seriennummer unbekannt “ usw.
Wenn ein Update verfügbar ist, erhält das Gerät eine Download-URL zusammen mit einem vollständigen Änderungsprotokoll usw.
{"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 Nein":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“}
Das wird dann heruntergeladen und an das Wiederherstellungssystem übergeben.
Das Gleiche passiert, wenn Sie den Anweisungen zur manuellen Aktualisierung folgen, indem Sie eine update.zip-Datei im Ordner /EXPORT/
auf Ihrem Gerät ablegen und das USB-Kabel abziehen. Das Gerät erkennt die Datei und fragt Sie, ob die Installation fortgesetzt werden soll.
Der genaue Mechanismus kann dem folgenden Code entnommen werden.
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
Wie Sie sehen, finden keine Plausibilitätsprüfungen oder irgendeine Art von Entschlüsselung statt. Sie können also grundsätzlich jede Datei nehmen, sie in den Ordner /EXPORT/ verschieben und sie vom System zur Wiederherstellung übergeben lassen.
Ich habe es nie überprüft, aber nachdem ich den Code gelesen habe, gehe ich davon aus, dass Sie Ihr Gerät über USB nach Belieben up- und downgraden können.
Da es sich jedoch um den Standard-Wiederherstellungsmechanismus von Android handelt (mit dem ich nicht besonders vertraut bin), wird geprüft, ob die Datei mit einem bekannten privaten Schlüssel signiert ist.
Das Gerät verfügt über eine geschlossene ADB-Schnittstelle. Es benötigt den Befehl adb reboot
, mit dem Sie es sowohl in den Wiederherstellungsmodus adb reboot recovery
als auch in den Fastboot-Modus adb reboot fastboot
oder den Bootloader-Modus adb reboot loader
versetzen können.
Im Wiederherstellungsmodus ermöglicht das Gerät eine Shell, die als Root ausgeführt wird. Ein begrenzter Befehlssatz ist verfügbar, Busybox ist jedoch installiert, also egal. Ein logischer Schritt wäre, den vollen Zugriff auf ADB freizuschalten, indem man ein Skript wie dieses erstellt:
#! /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
Danach ist das Gerät grundsätzlich vollständig über eine Standard-ADB-Shell zugänglich, die dann auf Root erhöht werden kann:
Für technisch nicht versierte Benutzer: Das bedeutet, dass Ihr Gerät und alle Ihre Dateien grundsätzlich geöffnet sind. Jeder motivierte Benutzer kann jederzeit jede Datei auf Ihrem Gerät kopieren oder ändern, wenn er über einen USB-Zugriff verfügt.
Da der Bootloader entsperrt ist, können Sie jederzeit jeden Kernel oder jede Partition flashen, indem Sie das Gerät in diesem Modus neu starten und fastboot flash boot boot.img
Für technisch nicht versierte Benutzer: Dies bedeutet, dass Ihr Gerät nach Belieben so verändert werden kann, dass Sie es nicht bemerken und somit Ihre Daten und Privatsphäre gefährden.
In diesem Modus wird das Gerät von Rockchip-Entwicklertools wie RKDevTool als „LOADER MODE“ erkannt. Von hier aus können Partitionen überschrieben und das Partitionslayout geändert werden ...
...und das Gerät kann in den Maskrom-Modus versetzt werden. Mehr dazu weiter unten.
Für technisch nicht versierte Benutzer: Dies bedeutet, dass Ihr Gerät nach Belieben so verändert werden kann, dass Sie es nicht bemerken und somit Ihre Daten und Privatsphäre gefährden.
Als ich mir /system/build.prop
ansah, fand ich
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
sind kein sehr gutes Zeichen. Wenn Sie der Entwickler sind. Es ist ein schönes Zeichen, wenn Sie nach einer weit geöffneten Tür zum System suchen.
Ich gehe nicht auf die Details von Android OTA ein, aber Sie können hier mehr darüber lesen.
Wenn wir uns update.zip: /META-INF/com/android/otacert
ansehen, können wir uns das öffentliche Zertifikat für das Update ansehen:
-----BEGIN-ZERTIFIKAT-----
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
-----ENDE ZERTIFIKAT-----
Das Googeln eines Teils des Zertifikats führt zu mindestens einem Ergebnis von xda-developers.com, wo jemand versucht, in sein Android 8.1 Rockchip PX5-Gerät einzudringen.
Das ist ein noch schlimmeres Zeichen. Oder ein noch schöneres für mich.
Als nächstes habe ich nach einem SDK rund um die PX30-Plattform gegoogelt und hier eines gefunden:
en.t-firefly.com/doc/download/page/id/63.html#other_206
zusammen mit Dokumenten hier:
wiki.t-firefly.com/en/Core-PX30-JD4/Android_development.html
und hier:
wiki.t-firefly.com/en/Firefly-RK3399/customize_android_firmware.html
Wenn Sie das SDK herunterladen, können Sie das 7z-Archiv entpacken und das enthaltene Git-Repo starten über:
git clone PX30_Android8.1.0_LVDS_190706 directory_to_clone_into
Nach einem längeren Klonvorgang finden Sie die SDK-Testschlüssel unter /build/make/target/product/security
und schon kann es losgehen.
Interessante Tatsache: In der README-Datei in diesem Ordner heißt es:
Die Testschlüssel in diesem Verzeichnis werden nur in der Entwicklung verwendet und sollten NIEMALS zum Signieren von Paketen in öffentlich veröffentlichten Images verwendet werden (da dies eine große Sicherheitslücke eröffnen würde).
Ja, bestätigt.
Die Technik überlasse ich Ihnen – während ich unter Windows arbeite, verwende ich Multi Image Kitchen, um Android-OTAs zu entpacken, neu zu verpacken und zu signieren. Sie müssen testkey.x509.pem
und testkey.pk8
in den bin
-Ordner des Tools verschieben und können von dort aus geänderte Updates erstellen. Das Gerät hat keine andere Wahl, als es zu installieren, wenn Sie es im EXPORT-Ordner ablegen .
Nun ja, wahrscheinlich.
Alles, was Sie von hier aus tun, ist äußerst fehleranfällig und führt zu einem Soft-Bricking Ihres Geräts. Soweit ich weiß, können nie alle Rockchip-Geräte vollständig „soft-bricked“ werden, da sie immer über einen Maskrom-Modus verfügen, bei dem es sich im Grunde um eine offene Programmierschnittstelle handelt.
Normalerweise kann auf diese Schnittstelle zugegriffen werden, indem zwei Pins der CPU kurzgeschlossen werden. Dies funktioniert auch bei Ihrem Supernote, erfordert jedoch das Öffnen des Geräts und führt höchstwahrscheinlich zum Erlöschen aller verbleibenden Garantien, die Sie möglicherweise haben.
Nachfolgend finden Sie alle Informationen zum PX30 Maskrom und zur Wiederherstellung Ihres Geräts.
Sichern Sie alle Partitionen in einer Root-ADB-Shell:
adb shell
zum Beispiel durch die Ausgabe dieser Befehle:
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
und möglicherweise sogar Ihre Benutzerdaten speichern:
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
Das Update auf meinem Gerät enthielt bereits eine su-Binärdatei und viele Verknüpfungen, die mir einfachen Zugriff auf eine Root-ADB-Schnittstelle ermöglichten.
Einige Modifikationen, mit denen ich experimentiert habe, waren:
/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
Und während ich dort war, habe ich die sehr häufigen Update-Prüfungen und die optionale Telemetrie blockiert (blockiert auch den integrierten App Store, aber das ist so gut wie nutzlos, da wir jetzt Apps seitlich auf das Gerät laden können).
/system/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
Von hier aus verfügen Sie über eine funktionierende Root-ADB-Schnittstelle, können Apps seitlich laden und das /system vollständig nach Ihren Wünschen ändern, nachdem Sie ein mount -o remount,rw /system
ausgegeben haben
Der erste Schritt, den ich dann machte, war die Installation einer ordnungsgemäß funktionierenden, auf dem SuperSU-System basierenden Root-Lösung. Dazu habe ich die neueste supersu.zip heruntergeladen, sie entpackt, mir das Installationsskript angeschaut und die Dateien auf superhackige Weise manuell installiert:
/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
Und ändern Sie /system/bin/install-recovery.sh
so, dass es endet:
/system/xbin/daemonsu --auto-daemon &
/system/etc/install-recovery-2.sh
Dann ändern Sie Dateikontexte und Zugriffsrechte, indem Sie system_file_contexts.txt
so ändern, dass es endet:
/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
und system_fs_config.txt
mit der Endung:
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
Funktionierte einwandfrei.
Es wäre einfach gewesen, ein schnelles Skript zu implementieren, aber zu diesem Zeitpunkt war ich gerade dabei, mich mit dem Android-Root vertraut zu machen, und mein Plan bestand darin, einen richtigen systemlosen Magisk-Root zu installieren.
Magisk kann einen vormodifizierten „gerooteten“ boot.img-Kernel und eine Ramdisk erstellen, indem es ihm die unveränderte boot.img zuführt.
Nehmen Sie die boot.img
aus dem Stammverzeichnis Ihrer update.zip
und kopieren Sie sie nach /storage/emulated/0/Download
Laden Sie das neueste Magisk wie folgt von der Seite:
adb install Magisk-v25.x.apk
Gehen Sie auf dem Gerät zu Settings > Apps > My apps
, damit das System die Liste der Apps aktualisiert und Magisk zur Seitenleiste hinzufügt. Möglicherweise müssen Sie dorthin scrollen, um es zu finden, da die Launcher-Benutzeroberfläche eindeutig nicht für Benutzer mit vielen Apps geeignet ist.
Bevor ich in Magisk eine Datei zum Patchen auswählen konnte, musste ich einen DocumentProvider installieren. Ich habe mich für Total Commander (Download) entschieden, da er kostenlos und super praktisch ist. Sideloaded das:
adb install tcandroidxxxx-universal.apk
Gehen Sie wie oben beschrieben vor, damit es in der Seitenleiste angezeigt wird. Öffne es und tippe blind oben rechts, um ein „leeres“ Menü zu öffnen, in dem du versuchst, auf den vorletzten Eintrag zu tippen, um vom dunklen zum hellen Thema zu wechseln, um endlich alles richtig zu sehen.
Öffnen Sie Magisk (gewähren Sie ihm Root-Zugriff), tippen Sie auf „Aktualisieren“, lassen Sie alles unverändert, tippen Sie als Nächstes auf „Datei auswählen und patchen“, wählen Sie Total Commander (URL...) als Anbieter und wählen Sie dann Ihre boot.img aus.
Kopieren Sie die resultierende magisk_patched-xxx.img
erneut aus dem Standardarbeitsordner /storage/emulated/0/Download
zurück auf Ihren Computer.
Vom Booten Ihres Geräts in Fastboot:
adb reboot fastboot
und geben Sie den Standard heraus:
fastboot flash boot magisk_patched-xxx.img
Und
fastboot reboot
Wenn alles gut gelaufen ist, startet Ihr Gerät das System, Sie können Magisk öffnen und es wird die installierte Version zusammen mit Ramdisk melden: Ja . Wenn Sie SuperSU zuvor installiert oder die vorinstallierte su-Binärdatei nicht entfernt haben, werden Sie vor einer beschädigten Installation gewarnt und aufgefordert, alle vorherigen Root-Dateien zu entfernen. Dies erreichen Sie, indem Sie alle von Ihnen hinzugefügten Dateien oder nur die vorinstallierten Dateien su
und libsupol.so
entfernen
Öffnen Sie eine beliebige App, die Superuser anfordert, um sicherzustellen, dass alles ordnungsgemäß funktioniert, und werden Sie von der bekannten Superuser-Eingabeaufforderung begrüßt:
Ich habe eine Liste früherer Firmware-Dateien zusammengestellt, die bis Version 1.0.1 (077) zurückreichen.
Wird fertiggestellt, sobald ich Zeit habe.
Falls Ihrem Gerät etwas zustößt, öffnen Sie es, entfernen Sie die Abschirmung von der CPU, schließen Sie die folgenden beiden Stiftleisten kurz und drücken Sie gleichzeitig den Reset-Schalter neben dem Netzschalter.
Dadurch wird Ihr Gerät in den Maskrom-Modus versetzt. Ich werde nicht im Detail darauf eingehen, wie Sie das Gerät wiederherstellen, aber ich überlasse Ihnen die wichtigsten Informationen sowie den Rat, Backups aller Ihrer Partitionen zu erstellen, bevor Sie IRGENDWELCHE Änderungen an Ihrem Gerät vornehmen.
Als nächstes installieren Sie die Maskrom-Treiber (Stellen Sie sicher, dass Sie nicht signierte Treiber in Windows aktivieren, und verwenden Sie dann Tools wie RKImageMaker
und AFPTool
um eine update.img zu erstellen, die über RKDevTool (von hier aus) in Maskrom geflasht werden kann. RKDevTool enthält die oben genannten zwei Binärdateien, die Sie zum Erstellen benötigen Update-Paket.
RKDevTool ist standardmäßig in chinesischer Sprache und mit mehr oder weniger nutzlosen Validierungsprüfungen Ihrer Firmware ausgestattet, die Sie mithilfe der .ini-Datei deaktivieren können:
[Language]
Selected=2
Und
FW_NOT_CHECK=TRUE
RB_CHECK_OFF=TRUE
CHECK_MACHINE_MODEL=FALSE
Alles in allem war es eine unterhaltsame Erfahrung, den Prozess herauszufinden, da die Rockchip SDK- und Tooling-Landschaft extrem fragmentiert ist.
Diese Dateien werden für ein vollständiges update.img benötigt. Sie können sie von Orten wie den von Ihnen erstellten Partitionssicherungen und teilweise vom oben genannten SDK oder durch Googeln beziehen.
Die krnl-Dateien sind da, seit ich eine Toolchain erstellt habe, die ein Tool namens imgRePackerRK (Download) verwendet, um rohe .img-Dateien in das Rockchip-kompatible Format (.img.krnl) zu konvertieren.
Das Tool soll offenbar RKImageMaker und AFPTool ersetzen und eine Komplettlösung zum Erstellen von Rockchip update.img darstellen. Aber es würde für mich keine konsistenten Ergebnisse liefern.
Es konvertiert jedoch Kernel-, Boot- und Wiederherstellungsimages, die mit der Rockchip-Wiederherstellung kompatibel sind.
Imageboot.img.krnl vs. Imageboot.img
Also verwende ich es, um die .krnl-Dateien bequem zu erstellen und führe dann meine toolchain.bat aus, um eine funktionierende update.img zu erstellen, während ich die ursprünglichen .img-Dateien zusammen mit den .krnl-Dateien behalte.
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
Um Ihnen dabei zu helfen, finden Sie hier auch eine kompatible /Image/parameter.txt
: