وصلتني الجهاز هدية . عندما أتلقى جهازًا جديدًا، أقوم بإلقاء نظرة سريعة عليه. خاصة مع الجهاز الذي يدعو إلى بعض البيانات الشخصية أو التجارية المهمة. على الرغم من أنني في هذه الحالة أثق بشكل أو بآخر في شركة Ratta لبذل قصارى جهدها لحماية بياناتي - كونها شركة صينية (جزئية) أعتقد أن لها حدودًا لما يمكنها فعله. نحن جميعًا على دراية بالحديث الدائر حول حالة قوانين ولوائح الخصوصية في الصين. كان لدي أيضًا سبب للاعتقاد بأن الأجهزة يتم تصنيعها بواسطة جهة تصنيع أصلية تابعة لجهة خارجية وموجودة أيضًا في البر الرئيسي للصين وأردت معرفة ما يحدث أيضًا على الجهاز.
TL;DR يمكن تجذير الجهاز من خلال نواقل هجوم متعددة. البرمجيات وكذلك الأجهزة القائمة.
أخبار جيدة: بعد البحث في الجهاز، لم أتمكن من العثور على أي شيء من الواضح أنه يعرض للخطر فيما يتعلق ببرامج التجسس أو غيرها من الممارسات الغازية. تأتي بعض تطبيقات Ratta مزودة بمكونات Tencent المبهمة جزئيًا. يبدو أن الجهاز يحترم إعدادات القياس عن بعد (لاحظ Google وApple وآخرين) ولكنه يبحث بانتظام عن التحديثات التي قد تتعقبك على الأقل من حيث الموقع وأنماط الاستخدام. يبدو أن بعض الخوادم موجودة في الصين، لذا من المحتمل أن تكون مفتوحة للحكومة الصينية. على الرغم من أن الشركة تبدو على دراية بالموضوع وتطرح خوادم في الولايات المتحدة. لوضع الأمور في نصابها الصحيح: أي جهاز مدمج من Google أو Amazon، أو أي نظام تشغيل شائع، أو أي هاتف ذكي أو تطبيق وسائط اجتماعية شائع، يجمع معلومات عنك أكثر مما وجدته هنا.
تحذير: لا أنصح أي شخص باتباع هذه الكتابة عمليًا لأنك على الأرجح ستجعل جهازك غير قابل للاستخدام. يتم كتابة الكثير من هذا من الذاكرة. والتي في حالتي ليست موثوقة للغاية. لذلك قد تكون هناك أخطاء أو سهو يزيد من خطر جعل جهازك غير صالح للاستخدام بالإضافة إلى إلغاء الضمان الخاص بك.
تحديث 2022/08/08: لقد أخطرت راتا منذ ما يزيد قليلاً عن أسبوعين لإعلامهم بأنني سأنشر هذه المعلومات. وكما هو متوقع رد راتا بلطف ووعد بالعمل على حل هذه القضايا. أريد أيضًا أن أشير إلى أنني لا أشير بأي حال من الأحوال إلى أن الصين = الشر هنا. إنني أعرب عن رغبتي العامة في أن تكون بياناتي آمنة وخاصة وأن أرى المشكلات في ممارسات الخصوصية في الولايات المتحدة وأوروبا والهند وروسيا... بقدر ما أرى ذلك مع الصين.
انظر أعلاه. نظرًا للوصول الفعلي إلى هذا الجهاز، لا يمكن اعتباره آمنًا لأي بيانات حساسة للغاية.
ونظرًا لطبيعة الإصدار القديم من Android ونقص الإجراءات الأمنية، فلن أجعل جهازي متاحًا لأي طرف غير موثوق به تحت أي ظرف من الظروف. وأود أيضًا أن أنصحك بعدم توصيله أبدًا بأي جهاز كمبيوتر غير معروف أو كابل شحن عام نظرًا لأن بعض هذه الهجمات يمكن تنفيذها بطريقة آلية بالكامل.
أنا لست رجل أمن. وقد كلفني هذا أسبوعين من جمع البيانات المتاحة للعامة. أي شخص أو حزب متحمس بدرجة كافية وأكثر موهبة مني سيكون أسرع. أيضًا منذ أن وعد Ratta بالسماح بالتحميل الجانبي على أي حال بالإضافة إلى رؤية الجهاز مفتوحًا على مصراعيه باستخدام مفاتيح الاختبار الثنائية العامة المثبتة مسبقًا ومحمل التمهيد المفتوح وواجهة وحدة تحكم adb (المعطلة والمفتوحة بسهولة) والأبواب المفتوحة الأخرى، أفترض أن هذا لن يؤدي إلى إنشاء أي شيء إزعاج غير متوقع.
تمت إتاحة هذه الوثيقة بأي شكل من الأشكال لـ Ratta عبر البريد الإلكتروني في 27 يوليو 2022، قبل أسبوعين من نشرها علنًا.
لا. لن أقوم تحت أي ظرف من الظروف بتوزيع أي ملفات قد تكون محمية بحقوق الطبع والنشر أو ما شابه ذلك. إذا كنت تعرف ما تفعله، فهذه المقالة تحتوي على معلومات أكثر من كافية. إذا لم يكن الأمر كذلك، فيرجى ترك جهازك كما هو واطلب من Ratta الوصول إلى shell/root لجهازك.
يمكنك العثور على كمية محدودة من مواصفات الجهاز عن طريق تثبيت تطبيق kindle وهو - حتى وقت كتابة هذا التقرير - التطبيق الوحيد المتاح على "متجر التطبيقات" المدمج بالجهاز. أو يمكنك فقط فك ضغط ملف OTA update.zip.
يعمل الجهاز بنظام Android 8.1 على منصة Rockchip PX30 التي تتكون من معالج ARM Cortex-A35 رباعي النواة بتردد 1.5 جيجا هرتز و2 جيجا بايت من ذاكرة الوصول العشوائي وشاشة حبر إلكترونية مقاس 1404 × 1872. يبدو أن منصة Rockchip موجودة غالبًا في أجهزة راديو السيارة وغيرها من الأجهزة المدمجة التي تأتي مع واجهة مستخدم. لذلك يمكنك العثور على الكثير من المعلومات الرسمية وغير الرسمية عنها بمجرد البحث على Google.
مثل ذلك: rockchip.fr/PX30%20datasheet%20V1.1.pdf أو نحو ذلك: opensource.rock-chips.com/wiki_Main_Page
خصمًا من حقيقة وجود /r/supernote و/r/supernote_beta على reddit، يوجد برنامج تجريبي للجهاز.
يقدم Ratta معلومات حول الإصدارين وتحديثات النسخة التجريبية هناك وكذلك على موقعه على الويب:
يمكن تنزيل الإصدار غير التجريبي الحالي من هنا: support.supernote.com/article/3/how-to-update-your-supernote
لا يمكن للإصدار التجريبي أن يكون توزيعه مرتبطًا بالرقم التسلسلي لجهازك كما يمكن العثور عليه في SupernoteSettings.apk
، نظرًا لأنه بشكل مستقل عن الإصدار المثبت حاليًا، فإنه يتصل بنفس الخادم وعنوان URL. انظر أدناه للحصول على مزيد من المعلومات المتعمقة.
التحديثات عبارة عن ملفات Android OTA شائعة وغير مشفرة ويمكن تفكيكها وتحليلها بسهولة باستخدام الأدوات المتاحة مجانًا. انظر أدناه لمزيد من المعلومات.
update.zip مع صور .br brotli غير المعبأة:
update.zip:/system
يتم تحديث الجهاز من خلال التنسيق مع خادم على device.supernote.com.cn
لمعرفة ما إذا كان هناك تحديث جديد متوفر:
curl -X POST -k -H 'Content-Type: application/json' -i 'https://device.supernote.com/official/system/business/android/update/download' --data '{"language":"EN", "equipmentNo":"SN100Bxxxxxxxx", "logicVersion":"Chauvet 2.4.15(566)", "configureList":[{"type":"1", "version":"Chauvet.D002.2203101001.566_release"}]}'
رسائل الخطأ باللغة الصينية ولكن الجهاز المعتاد لا يحتاج إلى تحديث ، والرقم التسلسلي غير معروف ، وما إلى ذلك.
في حالة توفر تحديث، يتلقى الجهاز عنوان URL للتنزيل بالإضافة إلى سجل التغيير الكامل وما إلى ذلك.
{"success":true,"errorCode":null,"errorMsg":null,"configureList":[{"type": "1"، "version": "Chauvet.xxxx.xxxxxxxxxxxx.xxx_xxxxxxxxx"، "fileName" :"Chauvet.xxxx.xxxxxxxxxx.xxx_xxxxxxx.zip"، "name":null،packageName":null،"version No":null,"url":"https://prod-ratta-firmware.s3.ap-northeast-1.amazonaws.com/xxxxxx/update.zip"،"size":xxxxxxxxx،"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"}
والذي يتم بعد ذلك تنزيله وتسليمه إلى نظام الاسترداد.
يحدث نفس الشيء إذا اتبعت تعليمات التحديث اليدوية عن طريق وضع ملف update.zip في المجلد /EXPORT/
على جهازك وسحب كابل USB. يكتشف الجهاز الملف ويسألك عما إذا كان يجب المضي قدمًا في التثبيت.
يمكن خصم الآلية الدقيقة من الكود التالي.
com.ratta.supernote.update.NetWorkConstant
public static final String DEV_BASE_URL = "http://10.20.22.32:9000" ;
public static final String DOWN_LOAD_URL = "" ;
public static final String NET_BASE_URL_PRODUCT = "http://10.20.22.32:8075/" ;
public static final String NET_BASE_URL_TEST = "https://test-ms-device.ratta.com.cn/" ;
public static final String RELEASE_BASE_URL = "https://device.supernote.com.cn/" ;
public static final String UAT_BASE_URL = "https://device.supernote.com" ;
public static final File DOWN_LOAD_PATH = new File ( "/cache" );
public static final String USBDisk_Path = Environment . getExternalStorageDirectory () + File . separator ;
public static final String FILE_TEST = USBDisk_Path + "EXPORT/test" ;
public static final String FILE_PRODUCT = USBDisk_Path + "EXPORT/product" ;
public static final String FILE_UAT = USBDisk_Path + "EXPORT/uat" ;
com.ratta.networklibrary.utils.C0598Utils
String str = Build . DISPLAY ; // i.E. Chauvet.D002.2203101001.566_release
boolean exists = new File ( Constant . FILE_USA ). exists ();
int lastIndexOf = str . lastIndexOf ( "_" );
if ( lastIndexOf != - 1 ) {
String substring = str . substring ( lastIndexOf + 1 );
String str2 = (( TextUtils . equals ( substring , "root" ) || TextUtils . equals ( substring , "hard" )) && exists ) ? Constant . USA_BASE_URL : Constant . RELEASE_BASE_URL ;
if ( new File ( Constant . FILE_TEST ). exists () || TextUtils . equals ( substring , "test" )) {
str2 = exists ? Constant . TEST_USA_BASE_URL : Constant . TEST_BASE_URL ;
} else if ( new File ( Constant . FILE_PRODUCT ). exists ()) {
str2 = Constant . DEV_BASE_URL ;
} else if ( new File ( Constant . FILE_UAT ). exists () || TextUtils . equals ( substring , "uat" )) {
str2 = Constant . UAT_BASE_URL ;
}
if (! TextUtils . equals ( substring , "release" ) && ! TextUtils . equals ( substring , "beta" )) {
return str2 ;
}
if ( exists ) {
return Constant . USA_BASE_URL ;
}
}
return Constant . RELEASE_BASE_URL ;
com.ratta.supernote.update.DownLoadService
@ POST ( "official/system/business/android/update/download" )
Call < DownResponse > downLoadFileInfo ( @ Body RequestBody requestBody );
com.ratta.supernote.update.UpDateAppService
LocalSystemInfoBean localSystemInfoBean = new LocalSystemInfoBean (); // see CURL request above for example values
localSystemInfoBean . setEquipmentNo ( DownPresenter . getDeviceVersion ());
localSystemInfoBean . setLanguage ( DownPresenter . getLanguage ( this ));
localSystemInfoBean . setLogicVersion ( DownPresenter . getLogicVersion ());
localSystemInfoBean . setConfigureList ( DownPresenter . getSystemAllPackageVersion ( this , new ArrayList ()));
RetrofitUtils retrofitUtils = RetrofitUtils . getInstance ();
final DownResponse downResponse = ( DownResponse ) retrofitUtils . execute ((( DownLoadService ) retrofitUtils . getService ( DownLoadService . class )). downLoadFileInfo ( DownLoadModel . getRequestBody ( localSystemInfoBean )));
com.ratta.supernote.update.UpDateAppService
if ( new File ( NetWorkConstant . DOWN_LOAD_PATH , "update.zip" ). exists ()) {
CacheInfoUtils . saveData ( CacheInfoUtils . updateFlagPath , UpDateAppService . USB_UPDATE_FLAG );
RecoverySystem . installPackage ( UpDateAppService . this , new File ( NetWorkConstant . DOWN_LOAD_PATH , "update.zip" )); // if unfamiliar: https://developer.android.com/reference/android/os/RecoverySystem
}
com.ratta.supernote.update.UpDateAppService
private void checkRestartUpdate () {
String str = SystemProperties . get ( ConstanceUtil . restartKey , Constance . FILE_SEVER_UFILE ); // FILE_SEVER_UFILE = "0"; restartKey = "ratta.launcher.restart";
LogUtils . m187d ( "ratta: " + str );
if (! str . equals ( "1" )) {
SystemProperties . set ( ConstanceUtil . restartKey , "1" );
this . firstSelectVersion = true ;
if ( new File ( Environment . getExternalStorageDirectory (). getAbsolutePath () + File . separator + "EXPORT" , "update.zip" ). exists ()) {
this . firstSelectVersion = false ;
usbUpdate ();
return ;
}
LogUtils . m187d ( "checkRestartUpdate: getVersionList" );
getVersionList ();
}
}
public void usbUpdate () {
if ( this . usbUpdateFlag ) {
return ;
}
final File file = new File ( Environment . getExternalStorageDirectory (). getAbsolutePath () + File . separator + "EXPORT" , "update.zip" );
if (! file . exists ()) {
LogUtils . m187d ( "onReceive: No USB upgrade file" );
return ;
}
GestureService . lockStatusbar = true ;
GestureService . lockSlidebar = true ;
this . usbUpdateFlag = true ;
LogUtils . m187d ( "usb update GestureService.lockStatusbar true" );
DialogUtils . getInstance (). build ( this ). createDefaultDelayDialog ( getString ( C0688R . string . usb_detection_tips ), 30 , new LibDialogDelayDefaultListener () { // "The upgrade pack is detected, do you want to install?"
// goes on with housekeeping like removing any existing update.zip and a couple of checks for enough battery etc and then moves the update.zip to /cache as seen above
كما ترون لا توجد فحوصات سلامة أو أي نوع من فك التشفير يجري. لذا يمكنك بشكل أساسي أخذ أي ملف ونقله إلى المجلد /EXPORT/ والسماح للنظام بتسليمه للاسترداد.
لم أتحقق مطلقًا ولكن قرأت الكود وأفترض أنه يمكنك ترقية جهازك وخفضه حسب الرغبة عبر USB.
على الرغم من أنها آلية استرداد Android القياسية (التي لست على دراية بها تمامًا) فإنها ستتحقق مما إذا كان الملف موقّعًا بمفتاح خاص معروف.
يأتي الجهاز مزودًا بواجهة ADB مغلقة. يتطلب الأمر الأمر adb reboot
الذي يتيح لك وضعه في وضع الاسترداد adb reboot recovery
وكذلك في fastboot adb reboot fastboot
أو وضع bootloader adb reboot loader
.
في وضع الاسترداد، يسمح الجهاز بوجود غلاف يعمل كجذر. تتوفر مجموعة أوامر محدودة ولكن تم تثبيت Busbox لذا فلا يهم. ستكون الخطوة المنطقية هي فتح الوصول الكامل إلى adb عن طريق إنشاء برنامج نصي مثل هذا:
#! /bin/bash
echo " rebooting to recovery "
adb reboot recovery
ANSWER=0
while [ " $ANSWER " != " 1 " ] ; do
sleep 2
ANSWER= $( adb devices | grep rockchipplatform -c )
done
echo " device online, patching "
adb shell busybox mount -o rw,seclabel,relatime,data=ordered,inode_readahead_blks=8 /dev/block/by-name/system /system
adb shell sed -i " s/ro.debuggable=0/ro.debuggable=1/ " /system/etc/prop.default
echo " rebooting to system "
adb reboot
وبعد ذلك يمكن الوصول إلى الجهاز بشكل كامل عبر غلاف adb القياسي والذي يمكن بعد ذلك رفعه إلى الجذر:
للمستخدمين غير التقنيين: هذا يعني أن جهازك مفتوح بشكل أساسي، بالإضافة إلى جميع ملفاتك. يمكن لأي مستخدم متحمس في أي وقت نسخ أو تعديل أي ملف على جهازك من خلال الوصول إلى USB.
نظرًا لأن أداة تحميل التشغيل غير مقفلة، يمكنك في أي وقت وميض أي نواة أو قسم عن طريق إعادة تشغيل الجهاز في هذا الوضع وتشغيل fastboot flash boot boot.img
بالنسبة للمستخدمين غير التقنيين: هذا يعني أنه يمكن تعديل جهازك بحرية بطريقة لا تلاحظها وبالتالي تعرض بياناتك وخصوصيتك للخطر.
في هذا الوضع، يتم اكتشاف الجهاز على أنه "LOADER MODE" بواسطة أدوات مطوري Rockchip مثل RKDevTool. من هنا يمكن الكتابة فوق الأقسام، ويمكن تغيير تخطيط القسم...
.. ويمكن وضع الجهاز في وضع Maskrom. المزيد عن ذلك أدناه.
بالنسبة للمستخدمين غير التقنيين: هذا يعني أنه يمكن تعديل جهازك بحرية بطريقة لا تلاحظها وبالتالي تعرض بياناتك وخصوصيتك للخطر.
عندما نظرت إلى /system/build.prop
وجدت
ro.build.description=px30_ht_eink-userdebug 8.1.0 OPM8.190505.001 Chauvet.D002.2206171001.629_beta test-keys
ro.build.fingerprint=Android/htfy_px30:/Chauvet.D002.2206171001.629_beta_:userdebug
test-keys
ليست علامة جيدة جدًا. إذا كنت المطور. إنها علامة جميلة إذا كنت تبحث عن باب مفتوح على مصراعيه في النظام.
لن أخوض في تفاصيل Android OTA ولكن يمكنك القراءة عنه هنا.
من خلال النظر إلى update.zip: /META-INF/com/android/otacert
يمكننا إلقاء نظرة على الشهادة العامة للتحديث:
-----شهادة البدء-----
MIID+zCCauOgAwIBAgIJAJKlKMdz16FBMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD
VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
VmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UE
AwwHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
Fw0xNDEyMjMwNjQ0MDhaFw00MjA1MTAwNjQ0MDhaMIGUMQswCQYDVQQGEwJVUzET
MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
A1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHQW5kcm9p
ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
hvcNAQEBBQADggENADCCAQgCggEBAll71fjESroAzdrkBKrApCrK9qnZfH38S3U3
6jhBOQtrwxnh/AaRC3hOyO5ihjwv1MlSuTA1DygGMznwP8rOQbc9eH4uqdnerE87
v0bc8lPCj22AAterZBZESqgfRwND/25S6A22wA/kpR/CiXMuWHlQfS6Q9CHBOwVQ
5ZZUge2KC1TbH8EtDkxDacOeTbhN6UQxxm3jgaIzkwyrEEcYB1m93CrTFOtVV7Jw
wo7XE5LGwo6nTzNieXJqoYxcNAMpv9seKW+GZ1EGl78e9B37SMoxq0I7HuStz5tD
tS2Er2YrjQig+1ZqgroIvPfEJAEyoEr0r6kK7jBh878usWOuWB0CAQOjUDBOMB0G
A1UdDgQWBBTV37ltjIiA28uNs8Z1hb6zasy5UzAfBgNVHSMEGDAWgBTV37ltjIiA
28uNs8Z1hb6zasy5UzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAZ
7pvK3yDr+O0G8ggDfaISkEeg0agocRcXGT/MRiPBz+n45+bEoym4hC2SdCxvHXES
5AHkFxjWavoQqAD8We955NCmpGzDip4hUctlXzqxYfSTvGiLArG92+Hcbu5RNx/7
o3Of39Mdge2jVKQuKAALWnb8TgJ/2k3KAUFzVqMXPY4asmnWtyW2FIKLdZU/yYTX
+8Tp0AhP+N84HUGg5BwQRD10/OGGY54rLfFy2aSLPxUZQ+VTSZB9Z9XRLxohsF/V
XBcZyCdPP254wDYL5R0HGWZv7CeBlVjw3FqDRI9aljdYfLpAk+clnRBwWOWHsiOE
pJXgkkLmpq0uDXsSMJZ2
-----شهادة النهاية-----
يؤدي البحث عن جزء من الشهادة على Google إلى نتيجة واحدة على الأقل من موقع xda-developers.com حيث يحاول شخص ما الوصول إلى جهاز Android 8.1 Rockchip PX5 الخاص به.
وهذه علامة أسوأ. أو حتى أجمل بالنسبة لي.
بعد ذلك، بحثت في Google عن SDK حول النظام الأساسي PX30 ووجدت واحدًا هنا:
en.t-firefly.com/doc/download/page/id/63.html#other_206
جنبا إلى جنب مع المستندات هنا:
wiki.t-firefly.com/en/Core-PX30-JD4/Android_development.html
وهنا:
wiki.t-firefly.com/en/Firefly-RK3399/customize_android_firmware.html
عند تنزيل SDK، يمكنك فك ضغط أرشيف 7z وبدء تشغيل git repo المضمن من خلال:
git clone PX30_Android8.1.0_LVDS_190706 directory_to_clone_into
بعد استنساخ طويل، ابحث عن مفاتيح اختبار SDK ضمن /build/make/target/product/security
وأنت جاهز للبدء.
حقيقة ممتعة: ينص الملف README الموجود في هذا المجلد على ما يلي:
تُستخدم مفاتيح الاختبار الموجودة في هذا الدليل في التطوير فقط ويجب عدم استخدامها مطلقًا لتوقيع الحزم في الصور المنشورة للعامة (لأن ذلك قد يؤدي إلى فتح ثغرة أمنية كبيرة).
نعم تم التأكيد.
أترك التقنية لك - أثناء العمل على Windows، أستخدم Multi Image Kitchen لتفريغ وإعادة حزم وتوقيع Android OTAs. سيتعين عليك نقل testkey.x509.pem
و testkey.pk8
إلى المجلد bin
الخاص بالأداة ومن هناك فصاعدًا ستتمكن من إنشاء تحديثات معدلة، ولن يكون أمام الجهاز خيار سوى التثبيت عندما تضعه في المجلد EXPORT .
حسنا، ربما.
كل ما تفعله من هنا يكون عرضة للخطأ والتعطيل البسيط لجهازك. على حد علمي، لا يمكن أبدًا أن تكون جميع أجهزة Rockchip مصنوعة من الطوب الناعم تمامًا لأنها تأتي دائمًا مع وضع Maskrom الذي يعد في الأساس واجهة برمجة مفتوحة.
عادة يمكن الوصول إلى هذه الواجهة من خلال تقصير طرفين على وحدة المعالجة المركزية. يعمل هذا أيضًا على Supernote الخاص بك ولكنه يتضمن فتح الجهاز وعلى الأرجح إلغاء أي ضمان متبقي لديك.
انظر أدناه للحصول على كافة المعلومات حول قناع PX30 وكيفية استرداد جهازك.
قم بعمل نسخة احتياطية لجميع الأقسام في shell adb الجذر:
adb shell
على سبيل المثال عن طريق إصدار هذه الأوامر:
cat /dev/block/mmcblk1p1 > /sdcard/EXPORT/uboot.img
cat /dev/block/mmcblk1p2 > /sdcard/EXPORT/trust.img
cat /dev/block/mmcblk1p3 > /sdcard/EXPORT/misc.img
cat /dev/block/mmcblk1p4 > /sdcard/EXPORT/resource.img
cat /dev/block/mmcblk1p5 > /sdcard/EXPORT/kernel.img
cat /dev/block/mmcblk1p6 > /sdcard/EXPORT/boot.img
cat /dev/block/mmcblk1p7 > /sdcard/EXPORT/recovery.img
cat /dev/block/mmcblk1p8 > /sdcard/EXPORT/backup.img
cat /dev/block/mmcblk1p9 > /sdcard/EXPORT/security.img
cat /dev/block/mmcblk1p10 > /sdcard/EXPORT/cache.img
cat /dev/block/mmcblk1p11 > /sdcard/EXPORT/system.img
cat /dev/block/mmcblk1p12 > /sdcard/EXPORT/metadata.img
cat /dev/block/mmcblk1p13 > /sdcard/EXPORT/vendor.img
cat /dev/block/mmcblk1p14 > /sdcard/EXPORT/oem.img
cat /dev/block/mmcblk1p15 > /sdcard/EXPORT/frp.img
وربما حتى حفظ بيانات المستخدم الخاصة بك:
dd if=/dev/block/by-name/userdata bs=4096 count=1048576 of=/sdcard/EXPORT/userdata-1.img
dd if=/dev/block/by-name/userdata bs=4096 skip=1048576 count=1048576 of=/sdcard/EXPORT/userdata-2.img
dd if=/dev/block/by-name/userdata bs=4096 skip=2097152 count=1048576 of=/sdcard/EXPORT/userdata-3.img
dd if=/dev/block/by-name/userdata bs=4096 skip=3145728 count=1048576 of=/sdcard/EXPORT/userdata-4.img
dd if=/dev/block/by-name/userdata bs=4096 skip=4194304 count=1048576 of=/sdcard/EXPORT/userdata-5.img
dd if=/dev/block/by-name/userdata bs=4096 skip=5242880 count=1048576 of=/sdcard/EXPORT/userdata-6.img
backup -> /dev/block/mmcblk1p8
boot -> /dev/block/mmcblk1p6
cache -> /dev/block/mmcblk1p10
frp -> /dev/block/mmcblk1p15
kernel -> /dev/block/mmcblk1p5
metadata -> /dev/block/mmcblk1p12
misc -> /dev/block/mmcblk1p3
oem -> /dev/block/mmcblk1p14
recovery -> /dev/block/mmcblk1p7
resource -> /dev/block/mmcblk1p4
security -> /dev/block/mmcblk1p9
system -> /dev/block/mmcblk1p11
trust -> /dev/block/mmcblk1p2
uboot -> /dev/block/mmcblk1p1
userdata -> /dev/block/mmcblk1p16
vendor -> /dev/block/mmcblk1p13
rootfs / rootfs ro,seclabel,size=981980k,nr_inodes=245495 0 0
/dev/block/by-name/system /system ext4 ro,seclabel,relatime,data=ordered,inode_readahead_blks=8 0 0
/dev/block/by-name/vendor /vendor ext4 ro,seclabel,relatime,data=ordered,inode_readahead_blks=8 0 0
/dev/block/by-name/oem /oem ext4 ro,seclabel,noatime,nodiratime,block_validity,delalloc,barrier,noauto_da_alloc,user_xattr 0 0
/dev/block/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,nodiratime,discard,noauto_da_alloc,data=ordered 0 0
/dev/block/by-name/metadata /metadata ext4 rw,seclabel,nosuid,nodev,noatime,nodiratime,discard,noauto_da_alloc,data=ordered 0 0
/dev/block/by-name/userdata /data f2fs rw,lazytime,seclabel,nosuid,nodev,noatime,nodiratime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,fsync_mode=posix 0 0
tmpfs /storage tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
adb /dev/usb-ffs/adb functionfs rw,relatime 0 0
/data/media /mnt/runtime/default/emulated sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid 0 0
/data/media /storage/emulated sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid 0 0
/data/media /mnt/runtime/read/emulated sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=23,derive_gid 0 0
/data/media /mnt/runtime/write/emulated sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=7,derive_gid 0 0
التحديث الذي كان على جهازي جاء بالفعل مزودًا بثنائي su والعديد من الاختصارات التي أتاحت لي سهولة الوصول إلى واجهة adb الجذر.
بعض التعديلات التي قمت بتجربتها هي:
/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
وأثناء وجودي هناك، قمت بحظر عمليات التحقق من التحديث المتكررة جدًا والقياس عن بعد الاختياري (يحظر أيضًا متجر التطبيقات المدمج ولكن هذا عديم الفائدة إلى حد كبير حيث يمكننا الآن تحميل التطبيقات على الجهاز)
/ النظام / الخ / المضيفين
127.0.0.1 device.supernote.com.cn
127.0.0.1 supernote.com.cn
127.0.0.1 www.supernote.com.cn
127.0.0.1 device.supernote.com
127.0.0.1 supernote.com
127.0.0.1 www.supernote.com
127.0.0.1 test-ms-device.ratta.com.cn
127.0.0.1 uat-ms-device.ratta.com.cn
127.0.0.1 ratta.com.cn
لديك واجهة adb جذر عاملة من هنا، ويمكنك تحميل التطبيقات بشكل جانبي وتعديل /النظام بالكامل حسب رغبتك بعد إصدار mount -o remount,rw /system
الخطوة الأولى التي قمت بها بعد ذلك كانت تثبيت حل جذر قائم على نظام SuperSU يعمل بشكل صحيح. لذلك قمت بتنزيل أحدث إصدار من ملف supersu.zip، وقمت بفك ضغطه، ونظرت في البرنامج النصي للتثبيت ووضعت الملفات في مكانها يدويًا بطريقة خارقة للغاية:
/system/.ext/.su # useless I think? Didn't bother to understand
/system/xbin/daemonsu
/system/xbin/su
/system/xbin/sugote
/system/xbin/sugote-mksh
/system/xbin/supolicy
/system/lib64/libsupol.so
/system/app/SuperSU/SuperSU.apk
وقم بتعديل /system/bin/install-recovery.sh
لينتهي بـ:
/system/xbin/daemonsu --auto-daemon &
/system/etc/install-recovery-2.sh
ثم تعديل سياقات الملف وحقوق الوصول عن طريق تعديل system_file_contexts.txt
لينتهي بـ:
/system/app/SuperSU/SuperSU.apk u:object_r:system_file:s0
/system/xbin/su u:object_r:system_file:s0
/system/bin/.ext/.su u:object_r:system_file:s0
/system/xbin/daemonsu u:object_r:system_file:s0
/system/xbin/sugote u:object_r:zygote_exec:s0
/system/xbin/supolicy u:object_r:system_file:s0
/system/lib64/libsupol.so u:object_r:system_file:s0
/system/xbin/sugote-mksh u:object_r:system_file:s0
و system_fs_config.txt
لينتهي بـ:
system/app/SuperSU 0 0 0755
system/app/SuperSU/SuperSU.apk 0 0 0644
system/xbin/su 0 2000 0755
system/bin/.ext 0 2000 0755
system/bin/.ext/.su 0 2000 0755
system/xbin/daemonsu 0 2000 0755
system/xbin/sugote 0 2000 0755
system/xbin/supolicy 0 2000 0755
system/lib64/libsupol.so 0 0 0644
system/xbin/sugote-mksh 0 2000 0755
عملت بشكل جيد تماما.
كان من السهل تنفيذ برنامج نصي سريع، ولكن في هذه المرحلة كنت قد دخلت للتو إلى جذر Android وكانت خطتي هي تثبيت جذر مناسب بدون نظام من magisk.
يمكن لـ Magisk إنتاج نواة boot.img "جذر" وramdisk المعدلة مسبقًا عن طريق تغذيتها بـ boot.img غير المعدل.
خذ boot.img
من جذر update.zip
الخاص بك وانسخه إلى /storage/emulated/0/Download
Sideload أحدث Magisk مثل ذلك:
adb install Magisk-v25.x.apk
على الجهاز، انتقل إلى Settings > Apps > My apps
لجعل النظام يقوم بتحديث قائمة التطبيقات وإضافة Magisk إلى الشريط الجانبي. قد يتعين عليك التمرير إلى هناك للعثور عليه، نظرًا لأنه من الواضح أن واجهة مستخدم Launcher ليست مصممة للأشخاص الذين لديهم العديد من التطبيقات.
قبل أن أتمكن من اختيار ملف لتصحيحه في Magisk، كنت بحاجة إلى تثبيت DocumentProvider الذي اخترته ليكون Total Commander (تنزيل) لأنه مجاني وسهل الاستخدام للغاية. تم التحميل الجانبي على ذلك:
adb install tcandroidxxxx-universal.apk
افعل نفس ما ورد أعلاه لجعله يظهر في الشريط الجانبي. افتحه وانقر بشكل أعمى على الجزء العلوي الأيمن لفتح قائمة "فارغة" حيث تحاول النقر على العنصر الثاني الأخير للتبديل من المظهر الداكن إلى المظهر الفاتح حتى تتمكن أخيرًا من رؤية كل شيء بشكل صحيح.
افتح Magisk (امنحه حق الوصول إلى الجذر)، وانقر فوق "تحديث"، واترك كل شيء كما هو، ثم انقر فوق "التالي"، "تحديد ملف وتصحيحه"، واختيار Total Commander (url...) كموفر، ثم حدد boot.img الخاص بك.
انسخ مرة أخرى ملف magisk_patched-xxx.img
الناتج من مجلد العمل الافتراضي /storage/emulated/0/Download
مرة أخرى إلى جهاز الكمبيوتر الخاص بك.
من تشغيل جهازك إلى fastboot:
adb reboot fastboot
وإصدار المعيار:
fastboot flash boot magisk_patched-xxx.img
و
fastboot reboot
إذا سارت الأمور على ما يرام، فسيتم تشغيل جهازك في النظام، ويمكنك فتح Magisk وسيقوم بالإبلاغ عن الإصدار المثبت مع Ramdisk: نعم . إذا قمت بتثبيت SuperSU مسبقًا أو لم تقم بإزالة ثنائي su المثبت مسبقًا، فسوف يحذرك من التثبيت التالف ويطلب منك إزالة أي جذر سابق. يمكنك القيام بذلك عن طريق إزالة كافة الملفات التي أضفتها أو فقط su
و libsupol.so
المثبتين مسبقًا
افتح أي تطبيق يطلب من Superuser التأكد من أن الأمور تعمل بشكل صحيح ويتم الترحيب به من خلال مطالبة Superuser المألوفة:
لقد قمت بتجميع قائمة بملفات البرامج الثابتة السابقة التي تعود إلى الإصدار v1.0.1(077).
سيتم الانتهاء منه بمجرد أن يكون لدي الوقت.
في حالة حدوث أي شيء لجهازك، افتحه، وأزل الغطاء الواقي من وحدة المعالجة المركزية، وقم بتقصير رؤوس الدبوسين التاليتين أثناء الضغط على مفتاح إعادة الضبط بجوار مفتاح الطاقة.
سيؤدي هذا إلى وضع جهازك في وضع Maskrom. لن أخوض في كل التفاصيل حول كيفية استرداد الجهاز بالضبط، لكنني سأترك لك المعلومات الأكثر صلة بالإضافة إلى النصائح لعمل نسخ احتياطية لجميع الأقسام الخاصة بك قبل إجراء أي تعديلات على جهازك.
بعد ذلك، قم بتثبيت برامج تشغيل Maskrom (تأكد من تمكين برامج التشغيل غير الموقعة في نظام التشغيل Windows ثم استخدم أدوات مثل RKImageMaker
و AFPTool
لإنشاء ملف update.img الذي يمكن وميضه من خلال RKDevTool (من هنا) في Maskrom. يحتوي RKDevTool على الثنائيات المذكورة أعلاه والتي تحتاجها لإنشاء الملف حزمة التحديث.
يأتي RKDevTool افتراضيًا باللغة الصينية ومع عمليات التحقق من صحة البرامج الثابتة الخاصة بك والتي لا فائدة منها والتي يمكنك إيقاف تشغيلها باستخدام .ini:
[Language]
Selected=2
و
FW_NOT_CHECK=TRUE
RB_CHECK_OFF=TRUE
CHECK_MACHINE_MODEL=FALSE
بشكل عام، كان اكتشاف العملية تجربة ممتعة نظرًا لأن Rockchip SDK ومشهد الأدوات مجزأ للغاية.
ستكون هذه الملفات مطلوبة لتحديث صورة كاملة.img. يمكنك الحصول عليها من أماكن مثل النسخ الاحتياطية للأقسام التي قمت بإنشائها وفي أجزاء من SDK أو googling المذكور أعلاه.
ملفات krnl موجودة منذ أن قمت بإنشاء سلسلة أدوات تستخدم أداة تسمى imgRePackerRK (تنزيل) لتحويل ملفات .img الأولية إلى تنسيق Rockchip المتوافق (.img.krnl).
يبدو أن الأداة مصممة لتحل محل RKImageMaker وAFPTool وتكون حلاً شاملاً لإنشاء Rockchip update.img. لكنها لن تسفر عن نتائج متسقة بالنسبة لي.
ولكنه يقوم بتحويل صور kernel والتمهيد والاسترداد المتوافقة مع Rockchip Recovery.
الصورةboot.img.krnl مقابل الصورةboot.img
لذلك أستخدمه لإنشاء ملفات .krnl بشكل ملائم ثم تشغيل Toolchain.bat الخاص بي لإنشاء تحديث عملي.img مع الاحتفاظ بملفات .img الأصلية مع ملفات .krnl.
move Imageboot.img Imageboot.img.tmp
move Imagerecovery.img Imagerecovery.img.tmp
move Imagekernel.img Imagekernel.img.tmp
move Imageboot.img.krnl Imageboot.img
move Imagerecovery.img.krnl Imagerecovery.img
move Imagekernel.img.krnl Imagekernel.img
copy Imageparameter.txt .parameter
Afptool -pack ./ Imagetmp-update.img
RKImageMaker.exe -RKPX30 ImageMiniLoaderAll.bin Imagetmp-update.img update.img -os_type:androidos
move Imageboot.img Imageboot.img.krnl
move Imagerecovery.img Imagerecovery.img.krnl
move Imagekernel.img Imagekernel.img.krnl
move Imageboot.img.tmp Imageboot.img
move Imagerecovery.img.tmp Imagerecovery.img
move Imagekernel.img.tmp Imagekernel.img
del Imagetmp-update.img
pause
ولمساعدتك على طول الطريق، إليك أيضًا ملف /Image/parameter.txt
المتوافق: