- โปรเจกต์ที่อธิบายกระบวนการทางเทคนิคอย่างละเอียดสำหรับการรัน iOS 6 บน iPod touch รุ่นที่ 3 ซึ่งไม่ได้รับการรองรับอย่างเป็นทางการ
- ปรับแก้และประกอบใหม่องค์ประกอบหลักของ iOS เช่น DeviceTree, iBoot, Kernelcache, Restore Ramdisk, Root Filesystem เพื่อให้เวอร์ชันที่ใหม่กว่าทำงานบนอุปกรณ์รุ่นเก่าได้
- ใช้สคริปต์ Pythonเพื่อเปรียบเทียบและปรับใช้ความต่างของ DeviceTree ระหว่าง iPhone 3GS กับ iPod touch 3 แบบอัตโนมัติ และใช้ แพตช์ iBoot เพื่อข้ามการตรวจสอบลายเซ็นโค้ด
- ในการสร้าง Kernelcache ใหม่ ใช้เครื่องมือ
kcgen ของ macOS เพื่อรวมเคอร์เนลและ kext สำหรับ armv7 พร้อมตัดสัญลักษณ์ที่ไม่จำเป็นและบีบอัด
- มีคุณค่าทางเทคนิคสูงจากการขยายศักยภาพของฮาร์ดแวร์เก่า และการแบ่งปันความรู้ด้าน การวิเคราะห์โครงสร้างภายในของ iOS และเทคนิคการสร้างคัสตอมเฟิร์มแวร์
ภาพรวมองค์ประกอบของ iOS
- iOS ประกอบด้วย iBoot, Kernelcache, DeviceTree, ระบบไฟล์ user space, เฟิร์มแวร์สำหรับโปรเซสเซอร์เสริม เป็นต้น
- iBoot เป็นบูตโหลดเดอร์ และมีอยู่ 4 รูปแบบคือ iBSS, iBEC, LLB, iBoot
- Kernelcache คือไฟล์ที่รวมเคอร์เนลและ kernel extension (kext) ไว้ในไบนารีเดียว
- DeviceTree กำหนดค่าคอนฟิกฮาร์ดแวร์และพารามิเตอร์การทำงานของซอฟต์แวร์ โดย iBoot จะปรับแก้ระหว่างการทำงาน
- ระบบไฟล์แบ่งเป็น restore ramdisk สำหรับการติดตั้ง และ root filesystem สำหรับการเก็บข้อมูลถาวร
ทดสอบกับ iPhone 3GS
- iPhone 3GS และ iPod touch 3 ใช้ SoC S5L8920X / S5L8922X ที่ใกล้เคียงกัน
- เนื่องจาก iPhone 3GS รองรับ iOS 6 อย่างเป็นทางการ จึงทดสอบบูต iOS 6.0 ร่วมกับ iBoot และ DeviceTree ของ iOS 5.1.1
- ปัญหาหลักคือ DeviceTree ไม่ตรงกัน โดย iOS 6 ต้องใช้โหนดและพร็อพเพอร์ตีที่เพิ่มเข้ามาใหม่อย่าง
nvram-proxy-data
การแก้ไข DeviceTree
- เขียนสคริปต์ Python เพื่อคำนวณและปรับใช้ความต่างระหว่าง DeviceTree ทั้งสอง
- สคริปต์เผยแพร่อยู่ในรีโพซิทอรี SundanceInH2A
- พร็อพเพอร์ตี
nvram-proxy-data ต้องมี NVRAM dump อยู่ภายใน หากปล่อยว่าง เคอร์เนลจะหยุดตั้งแต่ช่วงเริ่มต้น
- เมื่อนำไปใช้กับ iPod touch 3 จะลบรายการเฉพาะของ iPhone ออกก่อนแล้วจึงใช้ diff
แพตช์ iBoot
- โดยพื้นฐานจะทำ การข้ามการตรวจสอบลายเซ็น Image3, การฉีด boot-args, และ แพตช์ debug-enabled
- จำเป็นต้องเติม
nvram-proxy-data แบบไดนามิก เพราะหากใช้ค่าแบบคงที่อาจเสี่ยงให้ NVRAM จริงถูกเขียนทับ
- แทนที่การเรียก
UpdateDeviceTree() เพื่อแทรก nvram-proxy-data และ random-seed
- เพิ่มอาร์กิวเมนต์
amfi=0xff เพื่อปิดการตรวจสอบลายเซ็นโค้ด
- สำหรับชุด iBoot+เคอร์เนลแบบอื่น ต้องตรวจสอบความต่างของ DeviceTree และโครงสร้าง
boot_args
การสร้าง Kernelcache
- แม้จะมีเคอร์เนล iOS 6 และ kext สำหรับ iPod touch 3 อยู่ในบิลด์ภายใน แต่หากต้องการโหลดพร้อมกันจำเป็นต้องสร้าง prelinked kernelcache
- ใช้เครื่องมือ
kcgen ของ macOS เพื่อสร้าง kernelcache สำหรับ armv7
- ออปชันหลัก:
-arch armv7, -all-personalities, -strip-symbols, -uncompressed
- หลังจากตัดสัญลักษณ์ที่ไม่จำเป็นแล้ว แปลงเป็น single slice ด้วย
lipo -thin armv7
- Kernelcache ที่สร้างขึ้นจะถูกบีบอัดแล้วแพ็กลงในคอนเทนเนอร์ Image3
- รายการ kext จัดทำโดยเทียบ iOS 5.1.1 กับ 6.0 ของ iPhone 3GS และจำเป็นต้องแก้ไข Info.plist ของ Wi‑Fi kext
การแก้ไข Restore Ramdisk
- แพตช์
asr และเปลี่ยน options.n88.plist เป็น options.n18.plist เพื่อปรับเลย์เอาต์พาร์ทิชัน
- รีอิมพลีเมนต์ไบนารี
rc.boot เพื่อติดตั้ง iBoot exploit
- รีเมานต์ ramdisk และตั้งค่า
umask
- เรียก
restored_external -server เพื่อกู้คืนโดยไม่ให้รีบูตทันทีหลังเสร็จ
- เมื่อกู้คืนเสร็จ ให้สร้างพาร์ทิชันที่สาม เขียน exploit ตั้งค่า
boot-partition เป็น 2 แล้วจึงรีบูต
การแก้ไข Root Filesystem
- เพิ่ม
/System/Library/CoreServices/SpringBoard.app/N18AP.plist และสะท้อนฟีเจอร์ของ iOS 6
- ผสานคอนฟิกหน้าโฮมระหว่าง iOS 5.1.1 กับ iPod touch 4
- เพิ่มเฟิร์มแวร์ Multitouch, Wi‑Fi, Bluetooth
- สำหรับ Bluetooth จะ override ค่าที่ฮาร์ดโค้ดไว้ใน
/usr/sbin/BlueTool ด้วย /etc/bluetool
- ลบคีย์
LimitLoadToHardware ของ FairPlay daemon เพื่อให้เปิดใช้งานบน iPod touch 3 ได้
- ใน iOS 6.1 ขึ้นไป จำเป็นต้องมีแพตช์เพิ่มเติมเนื่องจาก LaunchDaemon signature cache
- แก้ไข Product ID map: เปลี่ยน
0x2714 ของ iPhone 3GS เป็น 0x2715 ของ iPod touch 3
- แก้ไข
getDeviceVariant() ของ MobileGestalt ให้คืนค่า "A" เสมอ
- เมื่อต้องแก้ไข DYLD shared cache สามารถกู้คืนการเซ็นโค้ดได้ด้วยการคำนวณแฮช SHA-1 ใหม่
iBoot exploit
- เขียน exploit ใหม่โดยอาศัย บั๊กของไดรเวอร์ HFS+ ใน iOS 5
- ปรับปรุงให้มีความแน่นอนในการทำงานมากกว่าเวอร์ชันก่อน
บทสรุปและแผนต่อไป
- งานทั้งหมดไม่ได้ยากอย่างที่คาดไว้ และหลังเผยแพร่เครื่องมือก็มีคำถามเกี่ยวกับ การเจลเบรก (jailbreak) เข้ามาจำนวนมาก
- มีความเป็นไปได้ที่จะเจลเบรกได้ง่ายด้วยการแพตช์เคอร์เนลและติดตั้ง Cydia
- เป้าหมายถัดไปคือทดสอบการรัน iOS 6 บน iPad 1
- โปรเจกต์นี้เป็นแหล่งอ้างอิงเชิงปฏิบัติที่มีประโยชน์สำหรับการวิเคราะห์โครงสร้างภายในของ iOS และการนำอุปกรณ์เก่ากลับมาใช้ประโยชน์
1 ความคิดเห็น
ความเห็นจาก Hacker News
คิดว่าอุปกรณ์ iDevice ก็ควรมีอะไรแบบนี้เหมือนกัน
มันไม่สมเหตุสมผลเลยที่ iPad Air รุ่นที่ 1 ซึ่งเก่าแล้วแต่ยังพอใช้งานได้ จะต้องถูกทิ้งเป็น e-waste
ปัญหาคือ Apple ไม่รองรับอีกต่อไป และยังมี นโยบายที่ขัดขวางแม้กระทั่งการติดตั้งระบบปฏิบัติการอื่น
บน Mac ยังมี OpenCore Legacy Patcher ที่ทำให้รัน macOS รุ่นใหม่บน Mac รุ่นเก่าได้
แทนที่จะเป็น “เก่าแต่ยังพอใช้ได้” มันก็แค่ “อุปกรณ์เก่า” เท่านั้น
เพราะความก้าวหน้าทางเทคโนโลยีเร็วมาก อุปกรณ์อย่าง iPad Air ปี 2013 ตอนนี้แม้แต่การท่องเว็บก็ยังลำบาก
ผมเคยลองใช้ Mac mini ปี 2012 กับ OpenCore Legacy Patcher แต่สุดท้ายก็เปลี่ยนไปใช้ Linux เพราะ ประสิทธิภาพที่ลดลงและ kernel panic
สุดท้ายแล้วอุปกรณ์พวกนี้ควรถูกมองว่าเป็น สินค้าอุปโภคบริโภคแบบชั่วคราว อย่างหนึ่ง
สิทธิในการซ่อมเป็นเรื่องสำคัญ แต่ผู้ใช้ส่วนใหญ่ก็ไม่ได้ใช้อุปกรณ์เก่าต่อไปเรื่อย ๆ
ถ้าเปรียบกับรถยนต์ ต่อให้ Corolla ปี 1999 กลายเป็นโอเพนซอร์สทั้งหมด คนส่วนใหญ่ก็คงซื้อรถใหม่อยู่ดี
ทีม Dortania ก็เคยบอกว่าการรองรับ Apple Silicon แทบเป็นไปไม่ได้ และ Mac Intel ที่มีชิป T2 ก็น่าจะถูกยุติการรองรับในไม่ช้า
สุดท้ายก็คงถึงวันที่ Mac รุ่นเก่าต้องเผชิญกับ การถกเถียงเรื่องยุติการรองรับ แบบเดียวกับ iPhone และ iPad
มันจัดการ EPUB กับ PDF ได้ดี แต่เพราะ WebKit เก่าเกินไป เลยแทบจะท่องเว็บไม่ได้
ดูเหมือนเคอร์เนลจะเป็นเวอร์ชันปี 2021 แต่ WebKit น่าจะหยุดอยู่หลังปี 2018
อาจจะออกนอกประเด็นนิดหน่อย แต่ผมมี iPhone 5/5s/SE หลายเครื่อง
ตอนนี้ใช้งานแบบออฟไลน์อย่างเดียวสำหรับ บันทึกอัตราการเต้นหัวใจ, ควบคุมแอ็กชันแคม, อัดเสียง
มันยังเล็กและเร็ว และแม้ในปี 2025 ก็ยังใช้งานได้ดีพอ
ไม่รู้ว่าบน iPhone จะทำได้ไหม แต่ก็เป็นการทดลองที่น่าสนใจ
ตอนเข้าทำงานที่ Apple ใหม่ ๆ ผมเคยผ่านโครงการ iOS 6 กับ Snow Leopard
พออ่านบทความนี้ก็รู้สึกดีที่ได้นึกถึง โครงสร้างและคำศัพท์ของ OS แบบปิดในยุคก่อน
ผมยังรัก iPad Air ปี 2014 ของผมอยู่
แม้ iOS 12.5 จะเป็นเวอร์ชันสุดท้าย แต่แอปส่วนใหญ่ก็ยังทำงานได้ดี
ผมใช้มันวันละ 6~7 ชั่วโมง และถ้ามีแค่ เบราว์เซอร์ที่ใหม่กว่านี้อีกนิด ก็เพียงพอแล้ว
Apple ห้ามเบราว์เซอร์บน iOS ใช้เอนจินเรนเดอร์ของตัวเอง
เพราะงั้นพอ iOS หยุดอัปเดต ไม่ใช่แค่ Safari แต่ ทุกเบราว์เซอร์และแอป WebView ก็จะล้าสมัยไปพร้อมกัน
น่าสนใจดี แต่ถ้าวิธีนี้ทำให้ดาวน์เกรดจาก iOS 26 ไปเป็น iOS 18 ได้ก็คงเหมือนเวทมนตร์จริง ๆ
ทั้งบน MacBook และ iPhone คุณภาพก็ไม่เหมือนเมื่อก่อน
ผมเองก็อยากเอาโทรศัพท์เก่ามารัน iOS 16 แล้ว เจลเบรก ดูเหมือนกัน
อยากให้บนอุปกรณ์ Apple มี ระบบปฏิบัติการทางเลือกแบบ Lineage OS บ้าง
ตราบใดที่ Apple ยังไม่ปลดตรงนี้ การติดตั้ง OS อย่างอิสระก็เป็นไปไม่ได้
สงสัยว่าวิธีนี้จะบูต iPhone OS 1.0 บน iPhone 2G ได้ไหม
บนอุปกรณ์ของผมมันบูตได้ถึงแค่ 1.1.4 และ 1.1.1 จะค้างที่ FTL initialization failure
ผมอยากลองทำ การเปิดใช้งานด้วยการแฮ็กหน้าจอโทรฉุกเฉิน แบบสมัยก่อนอีกครั้ง แต่เครื่อง 2G ที่เคยใช้ตอนนั้นทำหายไปแล้ว
เป็นบทความที่น่าสนใจ
แต่ในตัวอย่างโค้ด
--bundle-idนั้นอยู่หน้าของแต่ละบรรทัด ดังนั้นคำว่า prepend จึงถูกต้องกว่าผมมี iPad Air 1 เก่าอยู่เครื่องหนึ่ง และสงสัยว่าจะ อัปเกรดจาก iOS 12 ได้ไหม
อยากให้มีกฎหมายบังคับให้บริษัทต่าง ๆ ต้อง เปิดอุปกรณ์ที่เลิกซัพพอร์ตแล้ว