การทำ Virtualization iOS บน Apple Silicon
(nickb.website)- เป็นการทดลองบูตบิลด์ iOS 15.0.2 สำหรับ iPhone XR บน Mac Apple silicon โดยใช้ Virtualization.framework และสภาพแวดล้อม vma2 จนถึง
PreBoard.app - แกนหลักของแนวทางนี้คือการนำ บูตเชน ของ macOS 12.0.1 มาใช้ซ้ำ แล้วเปลี่ยนเฉพาะอิมเมจระบบ iOS,
mtree,root_hash,trustcacheเพื่อลดภาระในการแก้ไขบูตเชนช่วงต้น - เมื่อเรียกใช้ฟังก์ชันที่ไม่เปิดเผยต่อสาธารณะ
_setProductionModeEnabled(false)เพื่อลดสถานะ VM ลงเป็น CPFM01แล้ว TSS จะเซ็นเฟิร์มแวร์ใด ๆ ให้กับอุปกรณ์ vma2 แบบสาธารณะ ทำให้ความจำเป็นของวิธี vma2pwn เดิมลดลง - การบูตจริงต้องใช้ แพตช์ระดับเคอร์เนลและระบบ ที่แตะการตรวจสอบแพลตฟอร์มของ XNU, system keybag, การตรวจสอบขนาด IOMFB, ramdisk,
launchd,mount, DYLD shared cache,lockdownd,mobileactivationd - ปัญหาที่ยังไม่แก้ไขที่ใหญ่ที่สุดคือ ความเข้ากันได้ของ system keybag และยังไม่ยืนยันว่าการป้อนข้อมูลแบบสัมผัสจะทำได้ผ่าน private API ของ Virtualization.framework หรือไม่
เป้าหมายและจุดเริ่มต้นของการทดลอง
- หลังจากการเปลี่ยนผ่านสู่ Apple silicon และ Mac Catalyst ระยะห่างระหว่าง iOS กับ macOS ก็ใกล้ขึ้น และเมื่อสามารถทำ virtualization ของ macOS ได้ คำถามหลักจึงกลายเป็นว่า iOS จะถูกนำมาทำ virtualization ได้หรือไม่โดยแก้ไขบูตเชนตระกูลเดียวกัน
- งานก่อนหน้านี้อย่าง vma2pwn เป็นโปรเจกต์สำหรับสร้าง บูตเชน vma2 macOS ที่แก้ไขได้สำหรับ VM แขก macOS และกลายเป็นพื้นฐานของการทดลองครั้งนี้
- ตัวอย่างการทำ virtualization/emulation iOS ที่สำเร็จและเผยแพร่ต่อสาธารณะคือผลิตภัณฑ์ virtual iPhone cloud ของ Corellium
- ยังอ้างอิง qemu-t8030, งานบน QEMU และบทความของ Zhuowei Zhang ด้วย โดยเฉพาะความสัมพันธ์ระหว่าง
IOSurfaceRootของ macOS กับIOCoreSurfaceRootของ iOS ที่ช่วยในการค้นหาแพตช์เคอร์เนลในภายหลัง - บทความของ Zhuowei Zhang มองว่าแอป macOS แบบ GUI ไม่สามารถรันบน iOS ได้ แต่แอป iOS แบบกราฟิกรันบน macOS ได้ และคุณสมบัตินี้ใช้ได้กับส่วนสำคัญของระบบกราฟิก iOS ด้วย
ฟีเจอร์ที่ไม่เปิดเผยต่อสาธารณะของ Virtualization.framework
- Virtualization.framework ของ Apple มีฟังก์ชัน private ที่ไม่ได้อยู่ในเอกสารชื่อ
_setProductionModeEnabled(false) - การเรียกนี้และฟีเจอร์ที่สอดคล้องกันในการตั้งค่า VM จะลด VM ลงเป็น Chip Fuse Mode หรือ CPFM
01ทำให้อุปกรณ์เสมือนถูกตั้งค่าให้อยู่ในสถานะ “secure” แต่ “non-production” - บนอุปกรณ์จริง TSS จะปฏิเสธการเซ็น SHSH blob ที่จำเป็นสำหรับอุปกรณ์ non-production/non-secure เช่น CPFM
00หรือ01 - แต่สำหรับ อุปกรณ์ vma2 แบบสาธารณะ TSS จะเซ็นเฟิร์มแวร์ใด ๆ ที่ส่งให้ ดังนั้นความจำเป็นของวิธี vma2pwn ที่เคยใช้สร้างเชนเฟิร์มแวร์ดัดแปลงจึงลดลงอย่างมาก
วิธีประกอบ VM iOS
- แนวทางที่ประสบความสำเร็จมากที่สุดคือใช้บูตเชน macOS 12.0.1 ตามเดิม แล้วแทนที่อิมเมจระบบ OS ด้วยอิมเมจและไฟล์ที่เกี่ยวข้องจากบิลด์ iOS 15.0.2 สำหรับ iPhone XR
- สิ่งที่ถูกแทนที่คืออิมเมจระบบ,
mtree,root_hash,trustcache - วิธีนี้หลีกเลี่ยงความจำเป็นส่วนใหญ่ในการแก้ไขบูตเชนและ ramdisk กู้คืนก่อนขั้นตอน initialization ของ iOS
- สิ่งที่ถูกแทนที่คืออิมเมจระบบ,
- เลือกบิลด์ iPhone XR เพราะรองรับ arm64e และมีโอกาสใช้ความละเอียดต่ำกว่า
- การตั้งค่าอุปกรณ์ arm64e แบบอื่นก็อาจสำเร็จได้ แต่เคอร์เนล vma2 ถูกฮาร์ดโค้ดให้คืนค่า
"iPad8,6"สำหรับคีย์ sysctl บางตัว - ประเมินว่าบิลด์ arm64 ไม่คุ้มลอง เพราะเจอปัญหาเพิ่มเติมและความไม่เข้ากันของไบนารี
- การรัน VM ใช้ super-tart ซึ่งเป็นฟอร์กของ tart แอป third-party สำหรับจัดการ VM บน Apple silicon
- super-tart ทำให้ใช้ฟีเจอร์ private ที่จำเป็นของ Virtualization.framework ได้
- การเปลี่ยนแปลงบางส่วน เช่น การตั้งค่า
_setProductionModeEnabled(false)ยังไม่ได้ push ทั้งหมด - เครื่องมือ Virtualization.framework ที่ใช้ private API ต้องปิด SIP และอาจต้องปิด AMFI ด้วย
- เครื่องมือ restore ที่ใช้คือ ฟอร์กของ idevicerestore
แพตช์เคอร์เนล
- อาจต้องใช้แพตช์ตรวจสอบลายเซ็นที่ใช้ใน vma2pwn แต่ยังไม่แน่ชัดว่าในแนวทาง CPFM
01จำเป็นเสมอไปหรือไม่ - แพตช์ที่เกี่ยวกับลายเซ็นอยู่ในรูปแบบทำให้ฟังก์ชันต่อไปนี้ในเคอร์เนล vma2 คืนค่า 0
_apfs_extract_root_hash_arm_authenticate_root_hash__img4_firmware_property_callback_is_root_hash_authentication_required_img4_firmware_evaluate
- ต้องแพตช์
lookup_in_static_trust_cacheให้คืนค่า 1 - เนื่องจากไบนารี iOS ไม่ใช่ไบนารีแพลตฟอร์ม simulator ช่วงแรกจึงถูกจบการทำงานด้วย
EXEC, [0xe] Binary with wrong platform- แก้ได้โดยแพตช์ให้ข้ามบรรทัดตรวจสอบ
PLATFORM_IOSของ XNU - ในเคอร์เนล vma2 ใช้วิธีเปลี่ยน
B.NEเป็นB
- แก้ได้โดยแพตช์ให้ข้ามบรรทัดตรวจสอบ
- เนื่องจาก system keybag ไม่เข้ากัน
PreBoard.appจึงแสดง “Swipe up to upgrade.” แทนSetup.app- หากใส่แพตช์สองรายการที่
ipc_make_system_keybagเพื่อบังคับไม่ให้ฟังก์ชันคืน error จะไปถึงPreBoard.appได้ - ข้อจำกัดนี้ยังไม่ได้รับการแก้ไขอย่างสมบูรณ์
- หากใส่แพตช์สองรายการที่
- ความไม่ตรงกันของขนาด struct IOMFB ระหว่างเฟรมเวิร์กระบบ iOS กับเคอร์เนล macOS ทำให้เกิด kernel panic พร้อมข้อความ
CLCDTransaction size mismatch. Returning error 0x%X.- เมื่อลบการตรวจสอบขนาดใน
IOMobileFramebufferUserClient::swap_submitแล้ว panic จะหยุดลง
- เมื่อลบการตรวจสอบขนาดใน
การเตรียมแพตช์ไฟล์ระบบ
- recovery ramdisk และไฟล์ระบบ iOS ถูกเซ็นไว้ ดังนั้นถ้าไม่เซ็นใหม่หลังแพตช์จะถูกจบการทำงานขณะรัน
- ในสภาพแวดล้อมที่แก้ไข แนะนำให้ใช้
ldidของ Procursus- ตัวอย่างการติดตั้ง:
brew install ldid-procursus - ตัวอย่างการเซ็นใหม่:
ldid_macosx_arm64 -S -M <binary> -Sจะ pseudo-sign ไบนารี และ-Mจะคง entitlements เดิมไว้
- ตัวอย่างการติดตั้ง:
- ไบนารีจำนวนมากตรวจสอบ identity ดังนั้นก่อนเซ็นใหม่ต้องเปลี่ยนชื่อเป็น identity แล้วค่อยเปลี่ยนกลับเป็นชื่อเดิม
keybagdตรวจพบIdentifier=com.apple.keybagdด้วยcodesign -d -v keybagdmv keybagd com.apple.keybagdldid_macosx_arm64 -S -M com.apple.keybagdmv com.apple.keybagd keybagd
- ฟังก์ชันที่ไม่ได้ติดสัญลักษณ์โดยอัตโนมัติสามารถหาได้ด้วยการค้นหา string XRef แล้วไล่ตามฟังก์ชันที่เรียกผ่าน reference ของ logging call
- สามารถพอร์ต Bash และ LaunchDaemon เพื่อให้ได้ shell ที่โต้ตอบได้ผ่าน serial terminal
- วิธีที่ใช้คือคัดลอกไฟล์ที่เกี่ยวข้องจาก payload ของ iOS jailbreak ที่เข้ากันได้ตามเวอร์ชัน เช่น Procursus
การแก้ไข DMG และ ramdisk
- หากต้องการแพตช์ระบบหรือ recovery ramdisk ต้องแก้ไขวอลุ่ม DMG โดยตรง
- ในตัวอย่าง iOS 15.0.2 จะแปลงวอลุ่ม iOS System ที่อยู่ใน IPSW ให้เป็นรูปแบบอ่าน/เขียนได้
hdiutil convert -format UDRW -o 018-66258-074-rw.dmg 018-66258-074.dmg- หลังเมานต์แล้ว
sudo mount -uw /Volumes/Sky19A404.N104N841OS - หลังแก้ไขแล้ว
hdiutil convert -format ULFO -o 018-66258-074.dmg 018-66258-074-rw.dmg - จากนั้น
asr imagescan --source 018-66258-074.dmg
- ก่อนบูต iOS ต้องแก้ไข
/usr/local/bin/restored_externalใน recovery ramdiskrestored_externalเวอร์ชัน iOS พยายามสร้าง system keybag ด้วยMKBKeyBagCreateSystemแต่เข้ากันไม่ได้กับเคอร์เนล macOS- ใช้วิธีลบการตรวจสอบ error เพื่อหลีกเลี่ยง
- แพตช์เงื่อนไขการเรียก
ramrod_set_NVRAM_variableให้ตั้งallow-root-hash-mismatchเป็น true หรือ1แล้วข้ามการยืนยัน root hash
- ต้องแก้ไข
/usr/sbin/asrใน recovery ramdisk ด้วย- สามารถใช้ asr64_patcher ของ iSuns9 ได้
- ค้นหาฟังก์ชันที่พิมพ์สตริง
"Image failed signature verification."แล้วในฟังก์ชันที่อ้างอิงถึงฟังก์ชันนั้น ให้เปลี่ยนคำสั่งเรียกBLของ ARMv8-A เป็น jump แบบBที่ไปยังเส้นทาง"Image passed signature verification" - ในไบนารี
asrของ iOS 15.0.2 ให้ใช้b #0x7cที่ออฟเซ็ตไฟล์0x27A18
การแก้ไขวอลุ่มระบบ iOS
- เพื่อปรับ iOS system เองให้เข้ากับเคอร์เนล macOS ต้องย้ายไฟล์ส่วนใหญ่ที่จะถูกติดตั้งที่ root ของไฟล์ซิสเต็มจากวอลุ่มระบบไปยัง
/System/Library/Templates/Data - เมื่อระบบบูตแล้ว ไฟล์เหล่านี้จะปรากฏอยู่ที่
/ - โฟลเดอร์ว่างใน root ปกติอาจต้องคงอยู่ในวอลุ่มระบบ แม้ว่าจะว่างจริงก็ตาม
- ตัวอย่างคือ
/Applications - ส่วนนี้ยังไม่ได้ทดสอบอย่างเพียงพอ
- ตัวอย่างคือ
แพตช์ launchd และ keybagd
- ในช่วงต้นของการบูต iOS จะรัน
/sbin/launchdและต้องมีแพตช์เพื่อเริ่มกระบวนการบูตช่วงต้นได้โดยไม่ล้มเหลว - แพตช์แรกใช้กับ plist การตั้งค่าที่ฝังอยู่ในไบนารี
- ค้นหาสตริง
<key>SIGTERMTimeout</key>แล้วดูย้อนหลังไปประมาณ 172 ไบต์ จะพบการตั้งค่านั้น - เพิ่ม
<key>PerformAfterUserspaceReboot</key><true/>ใน sectionmount-phase-2,fips,tzinit,finish-demo-restore,fud,xpcroleaccountd,prng_seedctl,MSUEarlyBootTask - เปลี่ยน
RequireSuccessใน sectiondata-protectionเป็น<false/>
- ค้นหาสตริง
- การเปลี่ยน
data-protectionจำเป็นเพราะ/usr/libexec/init_data_protectionล้มเหลวเมื่อรันใน VM- ไฟล์ดังกล่าวเป็น symbolic link ไปยัง
/usr/libexec/seputil
- ไฟล์ดังกล่าวเป็น symbolic link ไปยัง
- การเปลี่ยน plist ที่ฝังอยู่ในไบนารีอาจเกินพื้นที่สตริงเดิมได้ ดังนั้นสามารถบีบอัด XML ด้วย XML minimizer แล้ววาง XML ที่บีบอัด จากนั้นเขียนทับพื้นที่ที่เหลือด้วยอักขระช่องว่างที่เป็นมิตรกับ XML
launchdยัง initialize/usr/libexec/keybagdด้วย แต่ไบนารีนี้ล้มเหลวเพราะความแตกต่างของเคอร์เนลข้างต้น- วิธีเลี่ยงอย่างหนึ่งคือคอมไพล์ executable ที่เพียงจบด้วย exit code 0 แล้วใช้แทน
keybagd - เคยพิจารณาโปรเจกต์ fixkeybag แล้ว แต่โค้ดสร้าง system keybag ของแอปนั้นก็เรียก
MKBKeyBagCreateSystemจึงล้มเหลวแม้อยู่ในสถานะ iOS ที่บูตแล้ว
- วิธีเลี่ยงอย่างหนึ่งคือคอมไพล์ executable ที่เพียงจบด้วย exit code 0 แล้วใช้แทน
launchdต้องมีแพตช์เพิ่มเติมโดยทำNOPกับ conditional branchTBZที่ทำให้เกิดสตริง panicUserspace reboot changed system version: previous %s != current %s
การแก้ไข mount, DYLD shared cache และเลเยอร์กราฟิก
- เนื่องจากใช้บูตเชน macOS และ macOS ramdisk จัดการกระบวนการ restore ทำให้
/sbin/mountของ iOS ไม่สามารถจัดการวอลุ่ม APFS ที่สร้างขึ้นได้อย่างถูกต้อง - วิธีแก้คือเอาไบนารี
mountจากวอลุ่มระบบ macOS มาแก้ metadata ของ Mach-O ให้รันบน iOS ได้ แล้วใช้แทน- ทำด้วยมือได้ และสามารถใช้
vtoolที่รวมมากับ macOS ได้ด้วย
- ทำด้วยมือได้ และสามารถใช้
- การแก้ที่ยากกว่าคือแพตช์ DYLD shared cache
IOSurfaceRootของ macOS และIOCoreSurfaceRootของ iOS โดยพื้นฐานแล้วเป็น driver เดียวกัน แต่ไม่เข้ากันเพราะชื่อต่างกัน- ใน DYLD shared cache ของ iOS มีสตริงที่ยาวกว่าคือ
"IOCoreSurfaceRoot"ดังนั้นให้เปลี่ยนเป็น"IOSurfaceRoot"แล้วเติมไบต์ที่เหลือด้วย0x00
- การวิเคราะห์และแยก DYLD shared cache ใช้เครื่องมือ ipsw ของ blacktop
- แยก dylib ที่ฝังอยู่ด้วย
ipsw dyld split <dsc file> - ในไบนารี
/System/Library/Frameworks/IOSurface.framework/IOSurfaceค้นหา reference ไปยัง"IOCoreSurfaceRoot"ของฟังก์ชัน__iosConnectInitalize - ใช้
ipsw dyld a2oแปลง virtual address เป็น file offset - ในตัวอย่าง แพตช์ออฟเซ็ต
0x28fde373ของdyld_shared_cache_arm64e
- แยก dylib ที่ฝังอยู่ด้วย
- หลังแก้ไข DYLD shared cache แล้ว cdhash ในตำแหน่งอื่นไม่ตรงกัน ทำให้เกิด exception
- ใช้ GDB stub ที่ฟรอนต์เอนด์ของ Virtualization.framework ให้มา ตั้ง breakpoint ที่ฟังก์ชัน
cs_validate_hashของเคอร์เนลเพื่อดู cdhash ทั้งหมด - ในตัวอย่าง iOS 15.0.2 แพตช์ไบต์เดิมที่ออฟเซ็ตไฟล์
0x5a9cffc0ด้วย cdhash ใหม่
- ใช้ GDB stub ที่ฟรอนต์เอนด์ของ Virtualization.framework ให้มา ตั้ง breakpoint ที่ฟังก์ชัน
แพตช์ system daemon และ activation
watchdogdตรวจสอบว่ากำลังรันอยู่ใน VM หรือไม่ และเกิด crash-loop เพราะไม่มี code path ของ macOS ที่จบการทำงานอย่างปกติ แต่ crash นี้ถือว่าไม่เป็นอันตราย- ใน
backboarddมีการทดลองแพตช์ call ที่เกี่ยวข้องกับ data migration ซึ่งอาจกระตุ้นPreBoard.appแต่ไม่เห็นความแตกต่างนอกจากค้างที่โลโก้ Apple - ในฟังก์ชัน
get_device_type_internal_block_invokeของlockdowndแพตช์การเรียกgetMGIntสำหรับ"ShouldHactivate"เป็นmov x0, #1เพื่อบังคับ hactivation ซึ่งข้ามข้อจำกัดการ activate iOS ปกติในสภาพแวดล้อมพัฒนา mobileactivationdก็สามารถแพตช์ให้อนุญาต hactivation ได้เช่นกัน- เปลี่ยนฟังก์ชัน
shouldHactivateเป็นคำสั่ง ARMv8-Amov x0, #0และret
- เปลี่ยนฟังก์ชัน
- การแก้ไขเพิ่มเติมที่จำเป็นกับ vma2 device tree ถูกปล่อยไว้เป็นงานให้ผู้อ่านจัดการเอง
- สำหรับการทำงานบางอย่าง อาจต้องใช้มาตรการที่ไม่ปกติ เช่น
chmod -R 777 /
ข้อจำกัดที่เหลือและการป้อนข้อมูลแบบสัมผัส
- หากต้องการข้ามปัญหา system keybag ต้องทำความเข้าใจโครงสร้างที่เกี่ยวข้องในระบบ iOS และเคอร์เนลให้มากขึ้น แล้วสร้างแพตช์เพิ่มเติม
- โปรเจกต์นี้ใช้เวลาไปอย่างน้อยหลายร้อยชั่วโมงแล้ว และสถานะที่เผยแพร่ในปัจจุบันคือบูตได้ถึง
PreBoard.app - ยังไม่ยืนยันว่า ฟังก์ชันสัมผัส ทำงานได้ผ่านเคอร์เนลและเฟิร์มแวร์ public vma2 Mac หรือไม่
- Virtualization.framework มี private API ที่เกี่ยวกับการสัมผัส
_VZAppleTouchScreenConfiguration_VZUSBTouchScreenConfiguration_VZTouch_VZMultiTouchEvent
- สามารถส่ง touch event ด้วย API เหล่านี้ได้ แต่ยังไม่เข้าใจวิธีใช้พารามิเตอร์ที่ถูกต้องอย่างสมบูรณ์
- enum
TouchPhaseเป็น enum ง่าย ๆ ที่ implement ค่าชื่อเดียวกับNSTouch.Phase - โค้ดตัวอย่างบางครั้งอาจทำให้เกิด exception
- ยังไม่ยืนยันว่าค่าพิกัดถูก map ในแบบที่ VM คาดหวังหรือไม่ และ VM จัดการค่านั้นได้หรือไม่
- enum
- เดโมแสดงลำดับการบูต โดยช่วงรอประมาณ 30 วินาทีตรงกลางถูกตัดออก
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
Corellium ชนะคดีความ ทำให้สามารถให้เช่า iOS cloud VM สำหรับงานวิจัยด้านความปลอดภัยได้ https://hn.algolia.com/?query=corellium
ถ้าสามารถทำ virtualization ของ iOS บน Apple Silicon MacBook ได้ ความต้องการบริการ iOS virtualization เชิงพาณิชย์อาจลดลง
สำหรับบุคคลทั่วไปอยู่ที่เดือนละ $400 ส่วนองค์กรอยู่ราวปีละ $60,000 https://support.corellium.com/subscriptions/pricing
ดีเลย ต่อไปก็หวังว่าจะมีคนหาวิธีติดตั้ง macOS บน iPad ได้ด้วย จะได้ใช้ คอมพิวเตอร์เครื่องนั้น ที่เราอยากให้ Apple ทำให้สักที
https://www.theverge.com/2024/7/22/24200536/windows-xp-ipad-...
Mac Catalyst ก็ดูเหมือนจะทำงานได้ทางเดียวตามที่คาดไว้
ถ้าดูแค่ขนาด iPad Mini น่าสนใจ แต่ iPadOS ใช้ทำอะไรไม่ได้ ตอนนี้เลยกำลังดู Surface Go อยู่ แต่ก็ค่อนข้างใหญ่ไปนิด
รู้ว่าไม่มีผลิตภัณฑ์ที่ใส่ MacOS มาให้ แต่ถ้ามีแท็บเล็ตขนาดเล็กที่รัน Win11 ได้แนะนำก็บอกด้วย ยินดีสั่งจากจีนถ้าจำเป็น
ดูโปรไฟล์ GitHub ของผู้เขียนแล้ว เหมือนเพิ่งเป็น บัณฑิตวิทยาการคอมพิวเตอร์ ใหม่ ๆ งานนี้น่าประทับใจจริง ๆ
รู้สึกว่าเหตุผลที่ Apple ไม่ทำ Simulator ให้เป็น Emulator ก็เพราะไม่อยากให้คนไปขุดคุ้ย ชั้นฐานภายในของ iOS
พอผ่าน bootloader ไปแล้ว โดยเฉพาะในสถานการณ์ที่ Apple ควบคุมฮาร์ดแวร์เองด้วย ก็สงสัยว่ามีเหตุผลอะไรที่ต้องคงความแตกต่างจำนวนมากระหว่างสองระบบปฏิบัติการไว้ต่อไป
คนที่สร้าง qemu-t8030 เคยรัน SpringBoard ได้สำเร็จ https://mastodon.social/@ntrung03/109712247237110967 แต่ไม่ได้เปิดเผยโค้ด
ถ้าความคืบหน้านั้นเอามารวมกับงานนี้ได้ก็น่าจะยอดเยี่ยม
https://www.xia0.sh/2024/03/09/Boot-Newer-iOS-with-QEMU-Step...
คอมเมนต์ในอดีต: https://news.ycombinator.com/item?id=40219423
บทความที่เกี่ยวข้อง: https://worthdoingbadly.com/hv/
พูดถึง เครื่องเสมือนแบบเร่งด้วยฮาร์ดแวร์ บน iPhone 12 ที่เจลเบรกแล้ว / iOS 14.1
ออกนอกเรื่องนิดหน่อย แต่อยากรู้ว่ามีใครเคยทำ virtualization ของ ARM macOS บน x86-64 บ้างไหม
ดังนั้นจึงทำ virtualization ได้เฉพาะระบบปฏิบัติการที่ build มาสำหรับ สถาปัตยกรรม CPU เดียวกับระบบโฮสต์เท่านั้น
กรณีอื่น ๆ เช่นรันซอฟต์แวร์ ARM บน x86 หรือกลับกัน ต้องใช้ emulation ซึ่งใช้วิธีตีความโค้ดหรือ recompile แบบไดนามิก
ตามนิยามแล้ว อะไรก็สามารถ emulate บนอะไรก็ได้ ช่วงหลังยังมีกรณีที่บูต Linux สำหรับ MIPS บน Intel 4004 ซึ่งเป็นไมโครโปรเซสเซอร์ตัวแรกได้ด้วย แต่ประสิทธิภาพอาจเป็นปัญหา
การทำ virtualization ของ CPU ตระกูล Mn ก็น่าจะยิ่งมีประโยชน์น้อยกว่า
Apple มี iOS Simulator อยู่ใน Xcode อยู่แล้ว เลยสงสัยว่าโปรเจกต์นี้ดีกว่าเครื่องมือที่ Apple ให้มาอย่างไร
เช่น คุณไม่สามารถเอา iOS binary จาก App Store มารันตรง ๆ ใน iOS Simulator ได้ โดยเฉพาะบน Intel Mac ยิ่งไม่ได้
เพราะ Simulator ไม่ได้รัน iOS แบบสมบูรณ์ คุณจึงตรวจสอบและเรียนรู้ไม่ได้ว่า iOS ภายในทำงานอย่างไรจริง ๆ ถ้าขุดลึกพอในเฟรมเวิร์กของ Simulator สุดท้ายก็จะกลับไปเจอ macOS
ในทางกลับกัน emulator คือการรัน iOS build เต็มชุดแบบเดียวกับอุปกรณ์จริง ตามทฤษฎีแล้ว iOS binary ใด ๆ ก็สามารถรันได้โดยไม่ต้องแก้ไข และสามารถตรวจสอบได้ว่าระบบปฏิบัติการจริงทำงานอย่างไร
คล้ายความต่างระหว่างการรันแอปด้วย Wine กับการรันแอปใน Windows VM เพียงแต่กรณีของ Simulator จะใกล้เคียงกับสถานการณ์ที่ต้อง recompile และลิงก์แอป Windows ใหม่ให้เข้ากับสภาพแวดล้อมของ Wine ก่อนจะรันมากกว่า
ถ้าอยากศึกษาภายในของ Windows การรันด้วย Wine อย่างเดียวคงเรียนรู้ได้ไม่มาก แต่ถ้าตรวจสอบ Windows VM จะเรียนรู้ได้มากกว่ามาก
น่าจะเป็น ของขวัญคริสต์มาส ล่วงหน้าสำหรับพวก click farm