ฉันได้รับอุปกรณ์เป็นของขวัญ เมื่อใดก็ตามที่ฉันได้รับอุปกรณ์ใหม่ ฉันจะตรวจสอบอุปกรณ์นั้นอย่างรวดเร็ว โดยเฉพาะอย่างยิ่งกับอุปกรณ์ที่เชิญข้อมูลส่วนบุคคลหรือข้อมูลสำคัญทางธุรกิจ แม้ว่าในกรณีนี้ ฉันเชื่อใจบริษัท Ratta มากหรือน้อยให้พยายามอย่างเต็มที่เพื่อปกป้องข้อมูลของฉัน - ในฐานะบริษัทจีน (ส่วนหนึ่ง) ฉันเชื่อว่ามีขีดจำกัดในสิ่งที่พวกเขา สามารถ ทำได้ เราทุกคนต่างตระหนักดีถึงการสนทนาเกี่ยวกับสถานะของกฎหมายและข้อบังคับด้านความเป็นส่วนตัวในประเทศจีน นอกจากนี้ ฉันมีเหตุผลที่เชื่อได้ว่าอุปกรณ์ต่างๆ ผลิตโดยผู้ผลิต OEM บุคคลที่สามซึ่งตั้งอยู่ในจีนแผ่นดินใหญ่เช่นกัน และต้องการดูว่ามีอะไรเกิดขึ้นบนอุปกรณ์อีกบ้าง
TL; DR อุปกรณ์สามารถรูทผ่านเวกเตอร์การโจมตีหลายตัว ซอฟต์แวร์และฮาร์ดแวร์เป็นหลัก
ข่าวดี: หลังจากตรวจดูอุปกรณ์แล้ว ฉันไม่พบสิ่งใดที่อาจกระทบต่อสปายแวร์หรือการกระทำที่รุกรานอื่นๆ อย่างเห็นได้ชัด แอป Ratta บางตัวมาพร้อมกับส่วนประกอบของ Tencent ที่ทำให้สับสนบางส่วนที่ฝังอยู่ ดูเหมือนว่าอุปกรณ์จะเคารพการตั้งค่าการวัดและส่งข้อมูลทางไกลของคุณ (โปรดทราบ Google, Apple และอื่น ๆ ) แต่ตรวจสอบการอัปเดตเป็นประจำซึ่งอย่างน้อยก็อาจติดตามคุณในแง่ของตำแหน่งและรูปแบบการใช้งาน เห็นได้ชัดว่าเซิร์ฟเวอร์บางแห่งตั้งอยู่ในประเทศจีน ดังนั้นจึงอาจเปิดให้รัฐบาลจีนเปิด แม้ว่าบริษัทดูเหมือนจะตระหนักถึงหัวข้อนี้และเปิดตัวเซิร์ฟเวอร์ในสหรัฐอเมริกาก็ตาม เพื่อให้เข้าใจถึงสิ่งต่างๆ: อุปกรณ์ Google หรือ Amazon ที่ฝังอยู่ ระบบปฏิบัติการยอดนิยม สมาร์ทโฟนหรือแอปโซเชียลมีเดียยอดนิยมจะรวบรวมข้อมูลเกี่ยวกับคุณมากกว่าที่ฉันพบที่นี่
คำเตือน: ฉันไม่แนะนำให้ใครปฏิบัติตามการเขียนนี้ในทางปฏิบัติ เนื่องจากคุณอาจทำให้อุปกรณ์ของคุณใช้งานไม่ได้ สิ่งเหล่านี้ส่วนใหญ่เขียนลงมาจากความทรงจำ ซึ่งในกรณีของฉันไม่ค่อยน่าเชื่อถือ ดังนั้นอาจมีข้อผิดพลาดหรือการละเว้นที่เพิ่มความเสี่ยงในการทำให้อุปกรณ์ของคุณใช้งานไม่ได้พร้อมกับทำให้การรับประกันของคุณเป็นโมฆะ
อัปเดต 2022/08/08: ฉันได้แจ้ง Ratta เมื่อสองสัปดาห์ก่อนเล็กน้อยเพื่อแจ้งให้ทราบว่าฉันจะเปิดเผยข้อมูลนี้ ตามที่คาดไว้ Ratta ตอบอย่างใจดีและสัญญาว่าจะแก้ไขปัญหานี้ ฉันยังต้องการชี้ให้เห็นว่าฉันไม่ได้หมายความถึง CHINA = EVIL ในที่นี้แต่อย่างใด ฉันขอแสดงความปรารถนาโดยทั่วไปเพื่อให้ข้อมูลของฉันปลอดภัยและเป็นส่วนตัว และมองเห็นปัญหาในสหรัฐอเมริกา ยุโรป อินเดีย รัสเซีย... แนวปฏิบัติด้านความเป็นส่วนตัว มากเท่ากับที่ฉันเห็นในจีน
ดูด้านบน. การเข้าถึงทางกายภาพของอุปกรณ์นี้ไม่ถือว่าปลอดภัยสำหรับข้อมูลที่ละเอียดอ่อนสูงใดๆ
ด้วยลักษณะของ Android เวอร์ชันที่ล้าสมัยและการขาดมาตรการรักษาความปลอดภัย ฉันจะไม่ทำให้อุปกรณ์ของฉันพร้อมใช้งานแก่บุคคลที่ไม่น่าเชื่อถือไม่ว่าในกรณีใดก็ตาม ฉันขอแนะนำด้วยว่าอย่าต่อเข้ากับคอมพิวเตอร์ที่ไม่รู้จักหรือสายชาร์จสาธารณะ เนื่องจากการโจมตีเหล่านี้บางส่วนสามารถทำได้ด้วยวิธีอัตโนมัติทั้งหมด
ฉันไม่ใช่คนรักษาความปลอดภัย ทำให้ฉันเสียเวลาสองสัปดาห์ในการรวบรวมข้อมูลที่เปิดเผยต่อสาธารณะ บุคคลหรือฝ่ายใดก็ตามที่มีแรงจูงใจเพียงพอและมีความสามารถมากกว่าฉันจะเร็วกว่า นอกจากนี้เนื่องจาก Ratta สัญญาว่าจะอนุญาตให้ไซด์โหลดต่อไปรวมถึงการเห็นอุปกรณ์เปิดกว้างด้วย su binary ที่ติดตั้งไว้ล่วงหน้า, คีย์ทดสอบสาธารณะ, เปิดบูทโหลดเดอร์, (ปิดการใช้งาน, ปลดล็อคได้ง่าย) อินเทอร์เฟซคอนโซล adb และประตูที่เปิดอื่น ๆ ฉันถือว่าสิ่งนี้จะไม่สร้างใด ๆ ความไม่สะดวกที่ไม่คาดคิด
ไม่ว่าด้วยวิธีใดก็ตาม เอกสารนี้จะถูกเผยแพร่แก่ Ratta ทางอีเมลในวันที่ 27 กรกฎาคม 2022 สองสัปดาห์ก่อนการโพสต์ต่อสาธารณะ
ไม่. ไม่ว่าในกรณีใด ฉันจะไม่แจกจ่ายไฟล์ใดๆ ที่อาจมีลิขสิทธิ์หรือสิ่งดังกล่าวครอบคลุมจากระยะไกล หากคุณรู้ว่าคุณกำลังทำอะไรอยู่ บทความนี้มีข้อมูลมากเกินพอ หากไม่เป็นเช่นนั้น โปรดปล่อยให้อุปกรณ์ของคุณอยู่ในสภาพเดิมและขอให้ Ratta เข้าถึงอุปกรณ์ของคุณด้วยเชลล์ / รูท
คุณสามารถค้นหาข้อมูลจำเพาะของอุปกรณ์ในจำนวนที่จำกัดได้โดยการติดตั้งแอป Kindle ซึ่งเป็นแอปเดียวที่มีอยู่ใน "app store" ของอุปกรณ์ ณ เวลาที่เขียน หรือคุณเพียงแค่แกะ OTA update.zip
อุปกรณ์ดังกล่าวใช้ Android 8.1 บนแพลตฟอร์ม Rockchip PX30 ประกอบด้วย ARM Cortex-A35 แบบ quad core ความเร็ว 1.5GHz, RAM 2 GB และจอแสดงผล eink ความละเอียด 1404x1872 ดูเหมือนว่าแพลตฟอร์ม 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.xxxxxxxx.xxx_xxxxxxx","fileName" :"Chauvet.xxxx.xxxxxxxxxx.xxx_xxxxxxx.zip","name":null,"packageName":null,"รุ่น ไม่":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)"แก้ไขจุด":
-
","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
ในโหมดการกู้คืน อุปกรณ์จะอนุญาตให้ใช้เชลล์ซึ่งทำงานในฐานะรูท มีชุดคำสั่งที่จำกัด แต่มีการติดตั้ง busybox ไว้แล้ว ไม่เป็นไร ขั้นตอนที่สมเหตุสมผลคือการปลดล็อกการเข้าถึง 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
เนื่องจาก bootloader ถูกปลดล็อค คุณสามารถแฟลชเคอร์เนลหรือพาร์ติชั่นใดๆ ได้ตลอดเวลาโดยการรีบูตอุปกรณ์เข้าสู่โหมดนี้และ fastboot flash boot boot.img
สำหรับผู้ใช้ที่ไม่ใช่ด้านเทคนิค: หมายความว่าอุปกรณ์ของคุณสามารถปรับเปลี่ยนได้อย่างอิสระในลักษณะที่คุณจะไม่สังเกตเห็น และทำให้ข้อมูลและความเป็นส่วนตัวของคุณตกอยู่ในความเสี่ยง
ในโหมดนี้ อุปกรณ์ถูกตรวจพบว่าเป็น "LOADER MODE" โดยเครื่องมือสำหรับนักพัฒนา Rockchip เช่น RKDevTool จากที่นี่สามารถเขียนทับพาร์ติชั่นได้ สามารถเปลี่ยนเค้าโครงพาร์ติชั่นได้...
...และอุปกรณ์สามารถเข้าสู่ Maskrom Mode ได้ ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนั้นด้านล่าง
สำหรับผู้ใช้ที่ไม่ใช่ด้านเทคนิค: หมายความว่าอุปกรณ์ของคุณสามารถปรับเปลี่ยนได้อย่างอิสระในลักษณะที่คุณจะไม่สังเกตเห็น และทำให้ข้อมูลและความเป็นส่วนตัวของคุณตกอยู่ในความเสี่ยง
เมื่อฉันดูที่ /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
อ้าวHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
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
-----ใบรับรองจบ-----
ส่วนหนึ่งของใบรับรอง Googling ให้ผลลัพธ์อย่างน้อยหนึ่งรายการจาก xda-developers.com ที่มีคนพยายามเข้าถึงอุปกรณ์ Android 8.1 Rockchip PX5
นั่นเป็นสัญญาณที่แย่ยิ่งกว่านั้นอีก หรือสวยงามกว่านั้นสำหรับฉัน
ต่อไป ฉันค้นหา SDK บนแพลตฟอร์ม PX30 ใน Google และพบอันหนึ่งที่นี่:
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 และเริ่มต้น repo git ที่มีอยู่ผ่าน:
git clone PX30_Android8.1.0_LVDS_190706 directory_to_clone_into
หลังจากการโคลนที่มีความยาว ให้ค้นหาคีย์ทดสอบ SDK ภายใต้ /build/make/target/product/security
และคุณก็พร้อมแล้ว
เรื่องน่าสนุก: README ในโฟลเดอร์นั้นระบุว่า:
คีย์ทดสอบในไดเร็กทอรีนี้ใช้ในการพัฒนาเท่านั้น และไม่ควรใช้เพื่อลงนามแพ็คเกจในอิมเมจที่เผยแพร่ต่อสาธารณะ (เนื่องจากจะเป็นการเปิดช่องโหว่ด้านความปลอดภัยที่สำคัญ)
ใช่แล้ว ยืนยันแล้ว
ฉันฝากเทคนิคนี้ไว้กับคุณ - ในขณะที่ทำงานกับ Windows ฉันใช้ Multi Image Kitchen เพื่อแกะและบรรจุใหม่และลงนาม Android OTA คุณจะต้องย้าย testkey.x509.pem
และ testkey.pk8
ของคุณไปที่โฟลเดอร์ bin
ของเครื่องมือ และจากนั้นจะสามารถสร้างการอัปเดตที่แก้ไขได้ อุปกรณ์จะไม่มีทางเลือกนอกจากติดตั้งเมื่อคุณวางไว้ในโฟลเดอร์ EXPORT .
ก็อาจจะ
สิ่งที่คุณทำจากที่นี่มีแนวโน้มที่จะเกิดข้อผิดพลาดและทำให้อุปกรณ์ของคุณเสียหายได้ง่าย เท่าที่ฉันรู้ อุปกรณ์ Rockchip ทั้งหมดไม่สามารถถูกปิดแบบซอฟต์บริคได้โดยสิ้นเชิง เนื่องจากอุปกรณ์เหล่านี้มาพร้อมกับโหมด Maskrom เสมอ ซึ่งโดยพื้นฐานแล้วจะเป็นอินเทอร์เฟซการเขียนโปรแกรมแบบเปิด
โดยปกติแล้วอินเทอร์เฟซนี้สามารถเข้าถึงได้โดยการย่อพินสองตัวบน CPU วิธีนี้ใช้ได้กับ Supernote ของคุณเช่นกัน แต่เกี่ยวข้องกับการเปิดอุปกรณ์ และส่วนใหญ่อาจทำให้การรับประกันที่เหลืออยู่ของคุณเป็นโมฆะ
ดูด้านล่างสำหรับข้อมูลทั้งหมดเกี่ยวกับ PX30 maskrom และวิธีการกู้คืนอุปกรณ์ของคุณ
สำรองพาร์ติชันทั้งหมดในรูท 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 binary และทางลัดมากมายที่ทำให้ฉันเข้าถึงอินเทอร์เฟซ root 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
และในขณะที่อยู่ที่นั่น ฉันได้บล็อกการตรวจสอบการอัปเดตบ่อยครั้งและการวัดระยะไกลเสริม (บล็อก App Store ในตัวด้วย แต่ก็ไม่มีประโยชน์อะไรมาก เนื่องจากตอนนี้เราสามารถไซด์โหลดแอปไปยังอุปกรณ์ได้)
/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
คุณมีอินเทอร์เฟซ adb รูทที่ใช้งานได้จากที่นี่ สามารถไซด์โหลดแอพและแก้ไข /system ตามที่คุณต้องการหลังจากออก 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 ลงในแถบด้านข้าง คุณอาจต้องเลื่อนไปที่นั่นเพื่อค้นหา เนื่องจาก UI ของ 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)
ต้องทำให้เสร็จเมื่อมีเวลา
ในกรณีที่มีอะไรเกิดขึ้นกับอุปกรณ์ของคุณ ให้เปิดอุปกรณ์นั้น ถอดส่วนป้องกันออกจาก CPU ย่อส่วนหัวของพินสองอันต่อไปนี้ให้สั้นลงขณะกดสวิตช์รีเซ็ตที่อยู่ถัดจากสวิตช์เปิดปิด
นี่จะทำให้อุปกรณ์ของคุณอยู่ในโหมดมาสก์รอม ฉันจะไม่ลงรายละเอียดทั้งหมดเกี่ยวกับวิธีการกู้คืนอุปกรณ์ แต่จะให้ข้อมูลที่เกี่ยวข้องมากที่สุดแก่คุณตลอดจนคำแนะนำในการสำรองข้อมูลพาร์ติชั่นทั้งหมดของคุณก่อนที่จะทำการแก้ไขใด ๆ กับอุปกรณ์ของคุณ
ถัดไปให้ติดตั้งไดรเวอร์ 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 หรือ Google ที่กล่าวมาข้างต้น
ไฟล์ krnl อยู่ที่นั่นตั้งแต่ฉันสร้าง toolchain ที่ใช้เครื่องมือที่เรียกว่า imgRePackerRK (ดาวน์โหลด) เพื่อแปลงไฟล์ raw .img ให้เป็นรูปแบบที่เข้ากันได้กับ Rockchip (.img.krnl)
เห็นได้ชัดว่าเครื่องมือนี้ถูกสร้างขึ้นมาเพื่อแทนที่ RKImageMaker และ AFPTool และเป็นโซลูชันครบวงจรในการสร้าง Rockchip update.img แต่มันจะไม่ให้ผลลัพธ์ที่สม่ำเสมอสำหรับฉัน
แต่จะแปลงเคอร์เนล บูต และอิมเมจการกู้คืนที่เข้ากันได้กับการกู้คืน Rockchip
Imageboot.img.krnl กับ Imageboot.img
ดังนั้นฉันจึงใช้มันเพื่อสร้างไฟล์ .krnl อย่างสะดวก จากนั้นรัน toolchain.bat เพื่อสร้าง update.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
: