การจำลอง iPhone ด้วย QEMU
(eshard.com)- eShard ตั้งเป้าพัฒนาอีมูเลเตอร์ที่ต่อยอดจากงานโอเพนซอร์สด้านการจำลอง iOS เดิม โดยสามารถ บูต iOS 14 บน QEMU และรัน UI รวมถึงบางแอปได้
- แทนที่จะใส่แพตช์เคอร์เนลเข้าไปใน QEMU โดยตรง ใช้ PongoOS และ checkra1n KPF เพื่อแยกแพตช์ XNU ออกมา และทำให้ตรวจสอบเนื้อหาแพตช์ได้ด้วยเครื่องมือที่อิง Mach-O diff
- การจำลอง GPU ของ Apple Silicon มีขอบเขตกว้างเกินไป จึงเลือกใช้ software rendering ก่อน และยืนยันได้จากการแพตช์
QuartzCoreบน iPhone ที่เจลเบรกแล้วว่า UI ของ UIKit สามารถถูกวาดได้ แม้จะช้า - เพื่อแก้ปัญหาหน้าจอยังคงดำ ได้ดำเนินการต่อเนื่องทั้ง ปิด address randomization, ดีบักด้วย GDB, อ้อมกระบวนการ pairing ของ
lockdownd, ปิด PAC, พอร์ตไป QEMU 8.2.1 และทำระบบอัตโนมัติสำหรับการแพตช์ dyld cache - ท้ายที่สุดสามารถแสดง UI ป้อน passcode ของ UIKit บนหน้าจอ QEMU และควบคุม textbox ด้วยอินพุตคีย์บอร์ดผ่าน VNC พร้อมมีพื้นฐานที่จำเป็นจนถึงขั้นแสดง
SpringBoard
จุดเริ่มต้นของการจำลอง iOS
- จากการตรวจสอบโซลูชันโอเพนซอร์สเดิม alephsecurity/xnu-qemu-arm64 เคยใช้งานได้จริง แต่โปรเจกต์อยู่ในสถานะอ่านอย่างเดียว
- จากนั้นใช้ TrungNguyen1909/qemu-t8030 เป็นจุดเริ่มต้น
- สามารถ restore iOS ได้ผ่านการเชื่อมต่อ USB ด้วย QEMU “companion” ตัวที่สอง
- รองรับการรัน iOS 14
- อิง QEMU เวอร์ชันใหม่กว่า
- มีวิกิอธิบายวิธีรันอีมูเลเตอร์
- แก้ไข
System/Library/xpc/launchd.plistเพื่อให้เข้าถึง shell และ SSH ได้อย่างรวดเร็ว - เป้าหมายระยะยาวคือ การจำลอง iOS ที่ใช้งานได้จริง มี UI และสามารถรันอย่างน้อยบางแอปได้
แยกแพตช์เคอร์เนลด้วย PongoOS
- โปรเจกต์
t8030ใส่โค้ดแพตช์เคอร์เนล XNU ไว้ใน QEMU เอง แต่เนื่องจากมีโอกาสที่แพตช์จะเพิ่มขึ้นในอนาคต จึงต้องการโครงสร้างที่สะอาดกว่า - จากประสบการณ์กับ iPhone ที่เจลเบรกจริง จึงพิจารณาวิธีใช้ PongoOS เพื่อใช้ แพตช์ checkra1n
- ใน flow เจลเบรกทั่วไป หลังจากถูก pwn ด้วย checkmate แล้ว PongoOS จะถูก inject เข้า SRAM และโมดูล
checkra1n-kpfจะถูกส่งผ่าน USB- ในงานนี้ เพื่อเลี่ยงการจัดการ USB ช่วงต้น จึง เพิ่ม SRAM ของ iPhone ที่จำลอง และใช้ PongoOS กับโมดูล checkra1n KPF
- ช่วงแรกของการรัน PongoOS เกิดปัญหาเพราะไม่มีโค้ด initialization ที่ปกติ bootrom หรือ iBoot ทำให้
- ต้อง ตั้งค่า FPU ก่อนคำสั่ง double/float
- แก้ไขได้โดยอ้างอิงเอกสาร ARM และโค้ดที่เกี่ยวข้องกับ QEMU เดิม
- ฟีเจอร์ของอุปกรณ์ตั้งแต่ A13 เป็นต้นไป Pongo ไม่รองรับ ทำให้ pattern matching ของบางแพตช์พัง
- มีการเพิ่มคำสั่ง Pointer Authentication(PAC) อย่าง
autda,xpacd - Apple ใช้ slide แบบอื่น
- ในแพตช์
task_for_pid(tfp0)พบความแตกต่างของ address และ binary pattern ระหว่าง iPhone X กับ iPhone 11
- มีการเพิ่มคำสั่ง Pointer Authentication(PAC) อย่าง
ไฟล์แพตช์เคอร์เนลแบบ declarative
- Pongo ช่วยให้ใช้แพตช์ checkra1n เดิมสำหรับ iOS หลายเวอร์ชันได้ แต่รูปแบบการ apply แบบ dynamic อ่าน แก้ไข และแชร์ได้ยาก
- เพื่อให้จัดการเหมือนแพตช์โค้ดจริง จึงสร้างไฟล์ แพตช์แบบ declarative ด้วยเครื่องมือภายใน
- diff
Mach-Oสองไฟล์เพื่อสร้างไฟล์แพตช์ข้อความที่อิงความต่างของ assembly - เขียนโปรแกรมแยกต่างหากสำหรับ apply ไฟล์แพตช์ที่สร้างขึ้นกับไบนารี
- diff
- หลังบูตด้วย Pongo ใช้ QEMU monitor dump ส่วน memory ที่ Pongo แพตช์ไว้
- จากนั้นประกอบเคอร์เนลที่แพตช์แล้วกลับเข้าไปใหม่ และสร้างไฟล์แพตช์ขนาดใหญ่ที่รวมการแก้ไขทั้งหมด
- เมื่อนำแพตช์ใหญ่ไปแบ่งส่วนและใส่คอมเมนต์ ก็สามารถ ตรวจสอบและควบคุม ได้ว่าส่วนใดของเคอร์เนลถูกแพตช์
กลยุทธ์วาดหน้าจอโดยไม่มี GPU
- การเรนเดอร์กราฟิกของ iPhone รุ่นใหม่สุดท้ายต้องผ่าน API Metal ของ Apple และต้องใช้ GPU จริง
- มองว่าการจำลอง GPU ของ Apple Silicon ซับซ้อนเกินไป จึงพิจารณาสองทางเลือก
- ใช้ bootarg
gpu=0เพื่อทำ software rendering เหมือนที่เคยทำได้ใน iOS รุ่นเก่า - ส่งต่อ Metal call ไปยัง iPhone จริงหรือ Mac ที่มี macOS เพื่อทำการเรนเดอร์
- ใช้ bootarg
- ใน iOS 14 ตัวเลือก bootarg
gpu=0ของเคอร์เนล XNU ถูกนำออกไปแล้ว - จากการวิเคราะห์ framework
QuartzCoreด้วย Ghidra พบว่า software rendering ถูกเรียกในฐานะ fallback เมื่อไม่มี renderer ของMetal - แพตช์
QuartzCoreบน iPhone ที่เจลเบรกจริงและยืนยันการใช้ software rendering- UI ช้าลงมาก
- บางพื้นที่เกิด artifact และส่วนนั้นอาจต้องการการเรนเดอร์ด้วย
Metalโดยตรง
- จากการทดลองนี้ จึงมองว่าในขอบเขตที่ไม่ได้ใช้
MetalหรือOpenGLโดยตรง หรือก็คือ แอป UIKit ส่วนใหญ่ น่าจะทำ software rendering บน QEMU ได้
ทดลอง proxy Metal call
- อีกทางเลือกคือการ proxy Metal call โดยทดลองกับ iPhone จริงสองเครื่อง
- parse header ของ iOS ทั้งหมดด้วย LLVM
- แทน pointer ของ Objective-C object ฝั่ง server เป็น stub pointer ฝั่ง client
- สร้างโค้ดแลกเปลี่ยน struct และ pointer อัตโนมัติ
- hook function และ method ทั้งหมด
- ส่งต่อทุก call ไปยัง server และคืนผลลัพธ์การรัน
- การเรียกไปกลับพื้นฐานของการ initialize Metal สำเร็จบางส่วน
- แต่ภาษา Objective-C และ API
Metalมีความซับซ้อนและมีฟีเจอร์จำนวนมาก งานที่ต้องทำเพื่อให้ทำงานจริงจึงใหญ่มาก - จึงเลื่อนวิธีนี้ไว้ภายหลัง และตัดสินใจแก้ปัญหาอื่นด้วย software rendering ก่อน แม้จะมีข้อจำกัด
- framework ของ iOS ยัง expose private API ที่ไม่มีใน public header ด้วย และแม้จะมีวิธี parse เพื่อสร้าง header ได้ แต่ส่วนใหญ่ใช้งานโดยตรงได้ยากและเพิ่มความซับซ้อน
ดีบัก IOSurface และ framebuffer
- หลังพยายามใช้ software rendering ก็ยังต้องมีอุปกรณ์ framebuffer ขั้นต่ำ แต่ QEMU
t8030เดิมไม่ได้ implement ไว้ - พบ fork QEMUAppleSilicon ที่มีงานรองรับ IOMFB และนำมาใช้ดีบัก display
- เมื่อ restore iOS ด้วยเวอร์ชันนี้ จะเห็นโลโก้ Apple และ progress bar แต่ในการบูตปกติหน้าจอยังคงดำสนิท
- จากการดู IOMFB kext ด้วย Ghidra และตรวจสอบ implementation ของ QEMU framebuffer ดูเหมือนมีสองโหมด
- raw framebuffer ที่ address ฮาร์ดแวร์คงที่
- API ที่ซับซ้อนกว่า โดยตั้งค่า plane หลายตัวด้วย register และเขียน surface data ด้วย DMA
- สามารถแสดง ARGB surface ใด ๆ ผ่าน raw framebuffer ได้ แต่ระหว่างบูตระบบไม่ได้เขียนไปยัง framebuffer นั้น
- ใน display mode ที่สอง เห็น trace ว่าเคอร์เนลตั้งค่า graphical plane ผ่าน register แต่หลังจากนั้นไม่มี output บนหน้าจอ
ปิด address randomization และดีบักด้วย GDB
- การเข้าถึงผ่าน SSH อย่างเดียวมีข้อจำกัดในการสังเกตระบบที่กำลังรัน จึงจำเป็นต้อง ดีบักเคอร์เนลและ user space ด้วย GDB
- kernel address randomization ถูกตั้งค่าในการ initialize บอร์ด
t8030จึงสามารถปิดได้ทั้งหมด - ใน userland มี randomization ของ executable และ dynamic library ภายใน dyld cache
- executable ถูกปิดผ่านการแพตช์ฟังก์ชัน
_load_machfileของเคอร์เนล - ไลบรารีใน dyld cache จะถูก randomize address หนึ่งครั้งตอนบูต แล้วถูกโหลดที่ address เดียวกันในทุก executable
- executable ถูกปิดผ่านการแพตช์ฟังก์ชัน
- dyld cache ที่
/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64eมี framework library ทั้งหมดอยู่ในรูป binary blob ขนาดใหญ่ - สร้างเครื่องมือภาษา C เพื่อ
dlopenframework library ทั้งหมด แล้วใช้ฟังก์ชัน_dyld*แสดงรายการ image ที่โหลดและ offset - ใช้วิธีนี้ร่วมกับกระบวนการย้อน address ของ GDB ทำให้ดีบักไลบรารีใน dyld cache ได้
- เป้าหมายที่สนใจเป็นพิเศษคือ
IOMFBkext,backboardd,SpringBoard,QuartzCore - ต่อมาพบวิธีปิด dyld cache ด้วยแพตช์เคอร์เนล และใช้ไลบรารี Rust object ของโปรเจกต์ Gimli เพื่อหา virtual address ของ dyld cache บน host โดยตรง
- การดีบัก user space ต้องใช้ GDB server ฝั่ง guest เช่นใช้แพ็กเกจ
debugserverของ Procursus
system log และการอ้อม lockdownd
- จาก GDB ดูเหมือน
backboarddเริ่มทำงานปกติ แต่เพื่อเข้าใจสถานการณ์จริงจำเป็นต้องมี system log - บน iPhone จริง สามารถดู system log ด้วย
idevicesyslogหลัง pair USB กับคอมพิวเตอร์ - กระบวนการ pairing รวมถึงการสร้าง key pair โดย private key จะถูกเก็บใน iPhone และ
lockdowndจะตรวจสอบตัวตนของคอมพิวเตอร์ - ในสภาพแวดล้อมจำลอง แม้โต้ตอบผ่าน USB ได้ แต่
lockdowndทำงานไม่ถูกต้อง - จากการวิเคราะห์ด้วย Ghidra พบว่า
lockdowndพยายามใช้keybagเพื่อเก็บ private key ซึ่งต้องใช้ SEP ที่ไม่มีอยู่ - inject shellcode ที่แทนที่บางฟังก์ชันเดิม เพื่ออ่าน public/private key pair ที่สร้างไว้ล่วงหน้าจาก filesystem และโหลดทุกครั้งที่
lockdowndพยายามดึงจากkeybag - ด้วยการดีบักและแพตช์เพิ่มเติม จำลองสถานะว่าผู้ใช้เชื่อถือคอมพิวเตอร์แล้วและ iPhone ถูกปลดล็อกแล้ว
- สุดท้ายสามารถ pair กับ iPhone ที่จำลองผ่าน companion QEMU ได้
- ใน log ยืนยันได้ว่า
QuartzCoreinitialize ปกติ ตรวจพบขนาด display และใช้ fallback ของ software rendering - ทุกอย่างดูเหมือนปกติ แต่หน้าจอยังไม่แสดงผล
- ข้อผิดพลาดเดียวที่เกี่ยวกับ pixel format ถูกอ้อมด้วยการบังคับระบุ RGBA แต่ภายหลังถูกถอดออก
ปัญหา PAC และการพอร์ต QEMU 8
- ระหว่างแก้ข้อผิดพลาด pixel format ของ
backboarddพบปัญหาเพิ่มเติมจากฟีเจอร์ด้านความปลอดภัยของ iOS - การตรวจสอบ signature ตอนโหลดและ runtime แก้ได้ด้วยแพตช์เคอร์เนล แต่ระหว่างรัน
backboarddที่ถูกแก้ไขเกิดความล้มเหลวของ Pointer Authentication - Pointer Authentication เป็นฟีเจอร์ที่เพิ่มใน ARMv8.3 และเป็นปัญหาใหม่ที่พบกับบอร์ด
t8030ที่กำลังจำลอง ไม่ใช่ t8015 ที่เคยใช้ก่อนหน้า - ตอนแรกคิดจะเปลี่ยนคำสั่ง PAC ทั้งหมดเป็น NOP หรือคำสั่งเทียบเท่าที่ไม่มี PAC
- ต่อมาพบว่า binary ARM64 PAC สามารถ build ได้สองแบบ
- ใช้ชุดคำสั่ง PAC เฉพาะที่รันได้เฉพาะบน CPU ARMv8.3+ เท่านั้น
- ใช้ชุดคำสั่ง “unused” ที่บน ARMv8.3+ จะถูกตีความเป็น PAC และบน ARM รุ่นก่อนหน้าจะถูกตีความเป็นคำสั่งเทียบเท่าที่ไม่มี PAC
- ทดสอบบน buildroot และระบบ ARM64 Linux เพื่อยืนยันพฤติกรรมนี้ และยืนยันว่า binary สำหรับ
t8030ใช้ arm64e ซึ่งเป็นชุดคำสั่งแบบ backward compatible - คาดว่าถ้าปิดเฉพาะ PAC enforcing ใน QEMU ก็จะรันเหมือนโค้ดที่ไม่มี PAC ได้ แต่ QEMU 7 ใช้งานไม่ได้ ขณะที่ QEMU 8 มีพฤติกรรมต่างออกไป
- พอร์ต codebase ปัจจุบันไปยัง QEMU 8.2.1
- คำสั่งเฉพาะของ Apple
genter,gexit - โค้ดจัดการ GL exception levels
- มีการแก้ไข QEMU generic code จำนวนมาก ทำให้พอร์ตยาก
- คำสั่งเฉพาะของ Apple
- หลังเจอ XNU panic หลายครั้ง ดีบักเคอร์เนลด้วย GDB ดีบัก QEMU เอง และทำ git bisect ในที่สุดก็บูต iOS บน QEMU 8 ได้อีกครั้ง
- ทำให้สามารถปิด PAC และแก้ไขโค้ดใด ๆ ที่รันอยู่ ณ ตำแหน่งที่ต้องการได้
ไล่หาสาเหตุของหน้าจอดำ
- จาก system log ดูเหมือน
backboarddทำงานปกติ จึงไล่หาสาเหตุที่ไม่แสดงผลให้ลึกขึ้น - หากเขียน raw ARGB frame ไปยัง address โดยตรง display จริงจะเปลี่ยน และสามารถวาดไปยัง graphical plane หลายตัวได้
- ดังนั้น implementation ของ display เองดูเหมือนปกติ เหลือความเป็นไปได้สามอย่าง
backboarddไม่เขียนอะไรเลย- เขียนไปยัง address ที่ไม่ถูกต้อง
- data ที่เขียนไม่ valid
- ใช้ QEMU monitor เพื่อดึง physical address ที่ไม่ต่อเนื่อง และใช้สคริปต์ dump physical DMA memory แล้วรวมเป็นไฟล์เดียว
- ตีความเป็น ARGB frame ด้วย
ffplayแต่ไม่ได้ผลลัพธ์ที่มีความหมาย - ถัดมาตั้ง breakpoint ที่
iosurface_lockเพื่อรับ address ของ surface ที่ map ใน memory ของbackboarddแล้วตรวจสอบ - บางครั้งพบรูปทรงแปลก ๆ ที่ดูคล้ายโลโก้ Apple แต่ดูเหมือนมีปัญหาในวิธีเขียน frame
- เมื่อทำงานเดียวกันบน iPhone 10 จริง สามารถ dump raw ARGB frame ของหน้าจอปัจจุบันได้อย่างง่ายดาย
- บน iPhone 11 หรือก็คือตั้งแต่
t8030เป็นต้นไป ดูเหมือน surface จะถูกส่งใน รูปแบบบีบอัด ที่ GPU สามารถประมวลผลได้ - เนื่องจากเรื่องนี้ไม่เกิดบน
t8015ของ iPhone X จึงแก้ให้ DTB ของ QEMU ส่งchip-idเป็น 8015 แทน 8030 - ผลคือหลังบูต หน้าจอแสดงโลโก้ Apple
progress bar และแพตช์ authentication
- แม้โลโก้ Apple จะแสดงแล้ว แต่ UI ยังไม่ไปต่อ และ system log มีข้อความจำนวนมากจาก daemon และไลบรารีหลายตัว
- เดินหน้าโดยเดาว่าข้อผิดพลาดใดเกี่ยวข้องกับปัญหา UI จริง แล้วแก้ทีละจุด
- พบปัญหาที่เกี่ยวข้องกับ user authentication โดยแหล่งที่มาของข้อผิดพลาดคือ daemon
mobileactivationdและ frameworkSpringBoardFoundation - หลังแพตช์สิ่งเหล่านี้ มี progress bar สีขาว ที่คล้ายกับที่เห็นในขั้น restore แสดงขึ้นมา
- progress bar ดูเหมือนกำลังเคลื่อนที่ แต่หลังผ่านไปหลายชั่วโมงก็ดูเหมือนค้างที่ 90%
ปรับปรุงการวนซ้ำแพตช์ dyld cache และ user space
- การปิด address randomization ทำให้แพตช์ user space และ framework ใน dyld cache ได้
- สร้างไฟล์แพตช์ข้อความสำหรับแต่ละ binary/library ด้วยวิธีเดียวกับเคอร์เนล และ apply ด้วยเครื่องมือภายใน
- dyld cache มีขนาดราว 2GB การแพตช์โดยตรงหรือคัดลอกซ้ำผ่าน SSH จึงไม่เหมาะสม
- เนื่องจากทำงานบน Linux จึงแก้ไข NVMe โดยตรงไม่ได้เช่นกัน
- ขยายเครื่องมือ diff/patch ภายในให้รองรับ dyld cache โดยหา offset ของ framework ภายใน blob ของ dyld cache
- เพิ่มตัวเลือกสร้างคำสั่ง
ddแบบง่ายที่ apply บน iPhone ได้ทันที พร้อมคำสั่ง revert - หลัง remount filesystem เป็นโหมดอ่าน/เขียนแล้ว apply คำสั่ง
ddก็สามารถวนแก้ dyld cache ได้อย่างรวดเร็ว - การทำให้การแก้ไขมีผลต้องรีบูต iOS เท่านั้น
- เพื่อให้วิธีนี้ทำงานได้ ต้องมีแพตช์เพิ่มเติมบางส่วนต่อ signature check ของเคอร์เนล
รัน PreBoard และแสดงหน้าจอ UIKit
- ก่อนจะแก้ progress bar ที่ค้าง ได้ทดลองกับโปรเซสระบบ
PreBoard PreBoardดูเหมือนจะแสดงให้ผู้ใช้เห็นเฉพาะเมื่อมีปัญหา เช่น การอัปเดตถูกขัดจังหวะ- เป็น system application ที่วาดโดยตรงผ่าน
backboarddเหมือนSpringBoardจึงสามารถเริ่มจาก command line ได้โดยตรง - ผลการรันคือหน้าจอสีขาวที่ขอให้ “swipe to upgrade” แสดงขึ้นมา
- จากประสบการณ์เดิมที่เคยใช้ VNC server บน iPhone จริง จึงเพิ่ม VNC และหลังล้มเหลวหลายครั้ง ก็ปลดล็อกหน้าจอได้ด้วย ปุ่มคีย์บอร์ด แทนการ swipe
- ทันทีหลังปลดล็อก QEMU หยุดการรันเพราะ iOS ใช้ illegal instruction
- จากการวิเคราะห์
backboarddพบว่า frameworkvImageใช้คำสั่ง AMX(Apple Matrix Coprocessor) สำหรับงานกราฟิกแบบ hardware-accelerated เช่น_vHorizontal_Scale_ARGB_8888_Accelerate - AMX เป็นชุดคำสั่งเฉพาะของ Apple ที่ไม่ได้ implement ใน ARM CPU ที่ QEMU จำลอง
- framework
vImageมีเวอร์ชัน software สำรองที่ใช้เฉพาะคำสั่ง ARM generic จึงแพตช์ให้กลับไปใช้เวอร์ชันนี้ - ผลลัพธ์สุดท้ายคือหน้าต่าง
UIKitจริงแสดงขึ้นมา พร้อมหน้าจอป้อน passcode และ textbox ที่ใช้งานได้ - สามารถป้อนข้อความลง textbox ผ่าน keyboard event ที่ inject ด้วย VNC
- ณ จุดนี้ องค์ประกอบที่จำเป็นสำหรับให้
SpringBoardแสดงอย่างถูกต้องพร้อมแล้ว และดูเหมือนเหลือแค่เรื่องเวลาในการเริ่มต้น - บทความถัดไปต่อที่ Part 2
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
หวังว่า https://github.com/devos50/qemu-ios จะพัฒนาไปจนรองรับได้ถึง iPhone OS 3.x เพื่อให้ได้ลองสัมผัสแอป iPhone ยุคแรก ๆ ในเชิง การอนุรักษ์ดิจิทัล
https://github.com/touchHLE/touchHLE ก็ยอดเยี่ยม แต่ถ้าไม่ใช่แอปพื้นฐานมาก ๆ ก็ต้องมีแพตช์เฉพาะแอป
ถ้าจะรันแอป 32 บิตบน iOS 10 QEMU ก็ต้องรองรับ iPhone 7 ด้วย
เมื่อก่อนเคยเอมูเลต NumWorks N0100[1] และ HP Prime G1[2] ด้วย QEMU จนถึงระดับที่เฟิร์มแวร์ทางการรันได้จริง
[1] https://github.com/boricj/qemu/tree/numworks_calculators
[2] https://github.com/boricj/qemu/tree/s3c2416-boricj
ถ้านำโปรเจกต์นี้ไปประยุกต์แบบสนุก ๆ ก็น่าจะติดตั้งอิมเมจ pmOS แบบขั้นต่ำกับ QEMU เวอร์ชันนี้บนมือถือที่รองรับฮาร์ดแวร์ postmarketOS ได้ค่อนข้างดี แล้วบูต iOS บนโทรศัพท์ Android ได้
อาจเป็นไปได้ด้วยซ้ำที่จะปรับแต่ง QEMU เพิ่มเพื่อส่งผ่านฮาร์ดแวร์ของมือถืออย่างโมเด็มหรือ Bluetooth ไปยังเครื่องเสมือน iOS
แค่นั้นโดยไม่ต้องมีการเอมูเลต iOS/Android ก็น่าจะพอใจแล้ว
เวอร์ชันที่เก็บถาวร: https://archive.ph/l1CwO
นี่หมายความว่าตอนนี้สามารถทำอย่าง การทดสอบ Safari หรือคอมไพล์สำหรับ iOS บนระบบ Linux ได้โดยไม่ต้องมีฮาร์ดแวร์ Apple แล้วใช่ไหม?
https://github.com/ChefKissInc/QEMUAppleSilicon
เป็น อุปกรณ์ Apple Silicon ที่ถูกเอมูเลตใน QEMU และตอนนี้รองรับเฉพาะ iPhone 11
วิดีโอเดโม: https://nitter.poast.org/eshard/status/1908162866609311962
ลองทำตามคำแนะนำการรันแล้ว: https://github.com/TrungNguyen1909/qemu-t8030/wiki/Bringing-...
มันแครชหลายครั้งจนน่าอายที่จะยอมรับ แต่ก็เท่มากทีเดียว
ไม่มีการพูดถึง การเชื่อมต่อเครือข่าย เลย ดูเหมือนว่าจะไม่ได้เอมูเลตชิปเซ็ต Wi-Fi หรือโมเด็มเซลลูลาร์
สงสัยว่าจะเชื่อมต่ออุปกรณ์ที่เอมูเลตนี้เข้ากับอินเทอร์เน็ตอย่างไร อาจเป็นวิธีอย่าง Ethernet ผ่าน USB ก็ได้
ต้องมีอะไรบ้าง Apple ถึงจะยอมรับ การพัฒนา iOS แบบหลายแพลตฟอร์ม?
จากมุมมองของ Apple ไม่มีอะไรที่ได้จากการอนุญาตโมเดลการพัฒนาแบบนั้น
กว่าสิ่งนี้จะเกิดขึ้นได้ วิธีที่ Apple มองโลกทั้งใบต้องเปลี่ยนไป และคงเป็นการเปลี่ยนแปลงใหญ่พอ ๆ กับตอนที่ Microsoft ยอมรับ Linux ในระดับหนึ่งผ่าน WSL และ .NET สำหรับ Linux
มี repository ที่ใช้ทำซ้ำสิ่งนี้ได้ไหม?