อุปกรณ์กำลังใช้ชิปเซ็ต RTL8197DN โดยใช้ชุดคำสั่ง MIPS ขนาดใหญ่ จากการวิจัยของฉันแกน MIPS ที่แท้จริงภายในดูเหมือนจะเป็น Lexra (เพื่อตรวจสอบ)
การกด WPS และรีเซ็ตในเวลาเดียวกันระหว่างการบูตเข้าสู่โหมด bootloader bootloader ให้อินเทอร์เฟซคำสั่งอย่างง่ายผ่าน UART รวมถึงอนุญาตให้อัปโหลดการอัปเดตผ่าน TFTP (ดู ./upload_update.sh ) bootloader จะถูกป้อนโดยอัตโนมัติหากการบูตล้มเหลว (ทำหน้าที่เป็นโหมดการกู้คืน)
เมื่ออัปโหลดผ่าน TFTP จะถูกโหลดลงใน RAM ที่ที่อยู่ 0x80500000 หากไฟล์เป็นไฟล์อัปเดตที่เหมาะสมการกะพริบจะเริ่มขึ้นโดยอัตโนมัติมิฉะนั้นไฟล์จะอยู่ใน RAM และสามารถใช้งานได้ด้วยตนเองโดยใช้คำสั่ง FLW
ยืนยันคำสั่งการทำงาน:
อุปกรณ์เปิดเผยส่วนหัว UART ด้วยข้อความ bootloader และเชลล์ Linux 38400 Baud
ชื่อผู้ใช้: รหัสผ่านรูท: อะไรก็ตามที่กำหนดค่าเป็นรหัสผ่านผู้ดูแลระบบสำหรับแผงเว็บ (ค่าเริ่มต้น: ผู้ดูแลระบบ)
ทุกอย่างใหญ่โต ดู ./check_update.py สำหรับสคริปต์ที่แยกวิเคราะห์ไฟล์อัปเดตและ ./make_header.py สำหรับสคริปต์ที่ผนวกส่วนหัวการอัปเดตเข้ากับไฟล์ไบนารีดิบ
ไฟล์อัปเดตทำจากบล็อกต่อไปนี้ซึ่งรวมเข้าด้วยกัน:
| ชดเชย | ขนาด | คำอธิบาย |
|---|---|---|
| 0 | 4 | ประเภทไฟล์-ดู https://github.com/jameshilliard/wecb-vz-gpl/blob/master/rtl819x/bootcode/boot/init/rtk.h สำหรับประเภทที่ถูกต้อง อุปกรณ์ที่เรามีดูเหมือนจะใช้ "CR6C" สำหรับเคอร์เนลและ "R6CR" สำหรับ rootfs (และอาจเป็น "boot" สำหรับ bootloader?) |
| 4 | 4 | โหลดที่อยู่ใน RAM (ใช้สำหรับภาพเคอร์เนลเท่านั้นที่ดูเหมือน?) |
| 8 | 4 | ที่อยู่ในหน่วยความจำแฟลช |
| 12 | 4 | ความยาวของข้อมูล |
| 16 | - | ข้อมูล |
ข้อมูลถูกตรวจสอบ - ผลรวม endian ขนาดใหญ่ 16 บิตของไบต์ทั้งหมดจะต้องเป็น 0x0000 (เว้นแต่ว่าคุณกำลังกระพริบพาร์ติชันเว็บไฟล์ซึ่งอุปกรณ์นี้ไม่มี - ในกรณีนั้นการตรวจสอบคือ 8 บิต) สิ่งนี้มักจะทำได้โดยการต่อท้ายสองไบต์ในตอนท้าย
เมื่อ bootloader พยายามโหลดครั้งแรกที่ดูที่ที่อยู่ hardcoded ~ 4 ก่อนจากนั้นจะดำเนินการค้นหาแฟลชทั้งหมดสำหรับลายเซ็นซึ่งดูเหมือนจะบ่งบอกว่าเค้าโครงแฟลชอาจแตกต่างกันในอุปกรณ์ที่แตกต่างกัน ข้อมูลมีการตรวจสอบการตรวจสอบที่เหมือนกันไปยังไฟล์อัปเดตด้านบน
ดู ./split_img.sh
| เริ่มต้นที่อยู่ | ที่อยู่ | ส่วนหัว | คำอธิบาย |
|---|---|---|---|
| 0x00000000 | 0x00006000 | - | รหัส bootloader |
| 0x00006000 | 0x00008000 | H601 (?) | การกำหนดค่าฮาร์ดแวร์ (ที่อยู่ MAC ฯลฯ ) |
| 0x00008000 | 0x00010000 | compds (?) | กำหนดค่าเริ่มต้น |
| 0x00010000 | 0x00018000 | compcs (?) | การกำหนดค่าปัจจุบัน |
| 0x00018000 | 0x00138000 | อัปเดตส่วนหัวสำหรับ CR6C | เคอร์เนล Linux นำหน้าด้วยส่วนหัวที่เหมือนกับรูปแบบส่วนหัวอัปเดต |
| 0x00138000 | 0x00327002 | ส่วนหัวของระบบไฟล์ Squashfs เริ่มต้นด้วย HSQS | ระบบไฟล์รูท สองไบต์สุดท้ายจะถูกเพิ่มเข้ามาสำหรับการตรวจสอบ |
| 0x00327002 | 0x00400000 | - | 0xff 0xff 0xff 0xff ... |