从QEMU启动XNU

想看原文自己尝试的朋友可以走传送门
https://alephsecurity.com/2019/06/17/xnu-qemu-arm64-1/

想方便的体验一下功能的往下看
首先你需要准备文件:
1 ipsw
2 https://github.com/alephsecurity/xnu-qemu-arm64
3 https://github.com/Co2333/iQemu-iPsw-iPreparer

注意,目前QEMU只支持从不超过2G大小的只读磁盘镜像启动,只支持iPhone6s Plus机型。

请务必使用git clone下载仓库,然后更新子模块。QEMU的编译就不多说了。

mkdir build; cd build; ../configure; make

然后使用终端以root身份运行iemu_prep_out,请注意各类路径不要有空格,你的用户名不能有空格(鬼知道你们都会干点啥😂)如果ipsw包含多设备信息,那么准备期间可能会选择一些选项。由于要从GitHub下载脚本和iOSBinpack,请先export proxy。请注意开始操作之前强烈推荐卸载多余的磁盘避免名字重复出现空格操作失败

然后你就会得到下面这样的输出。其中iPhone6s Plus主板为n66ap

最后你会得到下面的文件列表

kernel.fout      secure_monitor.fout      file static_tc.fout      boot_image.fout      device_tree.fout

和启动指令

qemu-system-aarch64 -M iPhone6splus-n66-s8000,kernel-filename=kernel.fout,dtb-filename=device_tree.fout,secmon-filename=secure_monitor.fout,ramdisk-filename=boot_image.fout,tc-filename=static_tc.fout,kern-cmd-args="debug=0x8 kextlog=0xfff cpus=1 rd=md0 serial=2" -cpu max -m 6G -serial mon:stdio

要想启动QEMU,需要执行至少如下的编译。

cd xnu-qemu-arm64
./configure --target-list=aarch64-softmmu --disable-capstone
make -j16

最后,你会在目录下面找到我们要的QEMU

./xnu-qemu-arm64/aarch64-softmmu/qemu-system-aarch64

我们 cd 到输出目录,也就是你一开始指定的输出目录,检查文件列表是否完整,可靠。(不要出现0b的文件应该就没问题)(请一定在输出目录启动QEMU,把QEMU拖进终端)(然后剩下的参数直接复制)

Enjoy!

Darwin localhost 18.2.0 Darwin Kernel Version 18.2.0: Tue Oct 16 21:02:23 PDT 2018; root:xnu-4903.222.5~1/RELEASE_ARM64_S8000 iPhone8,2

话说XNU QEMU的contributor都800人了还只有36颗小星星哇真的可怜。。。

3 Likes

那是 qemu 历史 commit 的 contributor

跳起来
字数补丁

楼主是 qemu 历史 commit 的 contributor

那是qemu助手

挖个早坟。。实现的思路貌似是Driverless

原文中的参考文中把除了arm核心,(看门狗?)定时器和串口保留外,其他内核驱动全部禁用了。
要从Root Filesystem启动而不是RAMDISK就要保留APFS及其依赖的驱动,要支持usbmuxd就要保留下网络和USB及其依赖驱动。要支持屏幕显示,触控模拟等等等基本要做到保留大部分的内核驱动了…

算下来不敢想,是个浩大的逆向工程,话说CorelliumHQ团队都花了9年之久啊…

1 Like


虚拟机跑起来了但是怎么与主机连接?

qemu启动参数配了 -net user,hostfwd=tcp:127.0.0.1:1122-:22也没连上
ssh user@127.0.0.1 -p 1122
ssh: connect to host 127.0.0.1 port 1122: Connection refused

你的楼上说了呀 很多驱动被禁用了
这就说你大概不能用ssh了 因为你没法配置NAT或者个他联网。。。