这是关于 iOS 模拟的详细记录,主要内容如下:
- 起始阶段:开始研究 iOS 模拟,尝试了多个开源项目,如[alephsecurity/xnu-qemu-arm64]和[TrungNguyen1909/qemu-t8030],后者能恢复 iOS 等,是良好起点,设定长期目标为模拟功能完整的 iOS 界面及运行应用。
遇到的问题及解决方法:
- t8030 项目问题:在 t8030 项目中,其在 QEMU 中添加代码修补 xnu 内核,想要更干净的方式,因有 jailbroken 经验,考虑用[Pongo]应用 checkra1n 补丁,以去除 QEMU 中的补丁。执行 PongoOS 存在问题,如缺少启动代码,A13 及之后设备的某些功能导致补丁模式匹配失败。为此制作工具对比 Mach-O 生成补丁文件,最终成功生成并应用补丁。
- 图形渲染问题:现代 iPhone 图形渲染通过[Metal]API,模拟 Apple Silicon GPU 复杂,考虑软件渲染(iOS 旧版本可用 gpu=0 启动参数)或将 Metal 调用转发到其他设备,实验后确定先从软件渲染入手,虽有局限性但能解决部分问题,还探索了代理 Metal 调用的方法,但道路漫长。
- IOMFB 相关问题:原始 t8030 QEMU 未实现帧缓冲设备,找到[ChefKissInc/QEMUAppleSilicon]的分支进行调试,发现两种显示模式,先尝试原始帧缓冲但系统未写入,后研究更复杂模式,仍需调试为何启动后无显示。
- 调试与地址随机化:虽有 SSH 访问,但需用 GDB 调试内核和用户空间组件,关闭 t8030 板初始化中的内核随机化较容易,对于用户空间,通过修改_load_machfile 内核函数关闭可执行文件的随机化,对于动态库,通过 dlopen 每个框架库并使用_dyld*函数获取加载信息来调试。还发现可通过补丁内核来禁用 dyld 缓存,方便调试。
- 系统日志与安全问题:获取系统日志对了解系统很有帮助,在模拟中遇到 lockdownd 问题,通过创建 shellcode 解决,获取系统日志后发现 QuartzCore 初始化正常但仍无显示,还遇到指针认证失败问题,通过测试验证可在 QEMU 中禁用 PAC 以方便修改代码。
- 显示问题排查:通过多种方法排查显示问题,如尝试 dump 物理 DMA 内存、在 GDB 中查找 backboardd 中的表面映射地址等,最终发现通过修改 DTB 可使 iPhone X 的 logo 显示,之后又遇到进度条卡住问题及用户空间补丁相关问题。
- 最终成果:经过一系列努力,最终实现了在模拟环境中显示部分界面,如出现白进度条、解锁后的新屏幕及可输入密码的文本框等,离 SpringBoard 正常显示不远。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。