首页
社区
课程
招聘
[原创]国人原创 能在x86 PC上运行的ios模拟器iqemu64开源
发表于: 2021-5-10 21:57 25115

[原创]国人原创 能在x86 PC上运行的ios模拟器iqemu64开源

2021-5-10 21:57
25115

2021年,苹果已经出了基于arm指令集的M1芯片,让iOS App能在PC上运行变得很容易。但是我们的开发始于几年前,由于当时放眼世界都没有一个能让ios app运行在PC上的模拟器,所以我们决定自己开发一个。

 

模拟器运行于基于Intel x86-64 CPU的macOS/Xcode(本次发布版本运行于Catalina)。Xcode自带的iOS Simulator只能运行拥有源代码的,自己编译的x86版本的iOS App。我们对iOS Simulator进行了大幅度的hack与修改,使得在苹果AppStore中发布的基于arm指令集的iOS App能够在iOS Simulator中运行。这个模拟器曾经还有一个基于VirtualBox的壳,macOS运行其中,使整个模拟器能运行在Windows中。但是最后由于效率与兼容性方面的原因,这个计划被放弃了。

 

为了使arm指令集的iOS App能够运行,有许多问题需要解决。首先最为显而易见的就是x86-64与arm指令集的转换问题。指令转换上,我们使用了qemu核心做关键的翻译。在模拟过程中,只有iOS App部分的代码是以qemu的JIT翻译模式运行的,其他所有部分的Framework部分的代码是苹果提供的以x86-64原生指令的形态运行的。两种指令拥有不同的ABI,因此很自然地,我们就需要为2个指令形态的代码提供ABI转换。为了做到这一点,我们修改了编译器LLVM的代码,为整个SDK执行了一次扫描,生成了SDK中所有函数的参数信息。根据这些参数信息,ABI转换才能成功地执行。

 

然而ABI不仅包含c标准,也同时包含c++的标准。在不同的指令集下,c++的基础库,类在内存中的布局,虚函数表的排列与实现方式都有小的区别。这种与c相比更无法识别的区别使ABI转换成为不可能。为了解决这个问题,我们干脆抛弃了ABI转换的想法,转而使用arm指令集的libc++.dylib实现iOS App的c++诉求。

 

苹果的Framework代码也使用到了c++代码。因此苹果的Framework使用x86-64的libc++.dylib,iOS App使用arm指令的libc++.dylib。为了使内存中能同时存在两份相同名字的dylib,需要对macOS的动态链接器dyld进行修改。尽管苹果开源了dyld的代码,编译dyld却无法达成。苹果抽掉了一些关键的头文件。因此我们只能选择对dyld_sim(模拟器使用的dyld)进行二进制patch。

 

c++异常也是我们遇到的一个大问题。由于堆栈中同时存在x86-64与arm的函数帧,当有一个异常抛出时,原来的Unwinding代码就无法胜任在双重函数栈中寻找合适的Exception handler的任务。为此我们修改了libunwind的代码并且重新编译。

 

此外,想要达成模拟器能够在x86-64的macOS上成功运行仍然有非常多的问题。譬如objc的兼容与加速,Metal绘图API的兼容,通过Kernel extension对xnu内核的修改等等。而其中最有挑战性的,就是为了让iOS App能够无瑕疵地运行而进行的逆向工作。随着工作进行,整个系统的复杂性开始超出我们的预期。这个项目目前能够成功运行微信与王者荣耀在PC上。

 

与此同时,在苹果放出基于arm指令集的M1的cpu来运行macOS后,我们这个模拟器的必要性与挑战性就没有那么大了。因此最终我们决定开源整个项目。如果有人有兴趣,可以继续完善这个项目。

项目地址

https://github.com/iqemu64/iqemu64

系统需求

现在模拟器只运行于macOS Catalina 10.15.1-10.15.7原始版本(其他的macOS版本可能也能运行,未测试)与Xcode 11.4.1(通过一些小改动能够升级),Xcode模拟器的iOS版本13.4.1.

 

从AppStore里取得的App必须先行解密

 

App的架构必须是ARM64指令集。也可以是FAT格式的,但是其中必须包含一个ARM64架构的部分。不支持单独的Armv7或者Arm64e架构。

警告

iqemu64由许多部分组成,其中的驱动部分会完全干掉macOS的代码签名验证。没有了代码签名后,系统会变得脆弱,容易被入侵。不要在你正在每日工作中使用的macOS上试用模拟器。当然,你可以通过卸载驱动或者重启来恢复代码签名。

编译

关掉SIP

 

关掉Gatekeeper. 有些早期型号的iMac/macbook可能不需要做这一步.

 

确保homebrew与Xcode command line tools已经安装。

1
2
3
4
brew install pkg-config glib
git clone --recursive https://github.com/iqemu64/iqemu64.git
cd ${iqemu64_path}
sh ./setup.sh

编译/安装完成后会有提示。

 

iqemu64只会对Xcode的可执行文件进行patch。它不会修改macOS的系统Framework与内核。模拟器的驱动只会做运行时的patch。如果你想恢复Xcode被patch后的文件,执行以下命令:

1
2
cd ${iqemu64_path}
sh ./restore.sh
注意:
 

目前安装脚本只支持Catalina与Xcode 11.4.1。脚本会对patch过的Xcode的文件进行备份。运行脚本时必须输入你正在使用的Xcode.app的全路径。其中的make命令会失败,这个是正常的。

 

当你成功安装以后,你必须在每次macOS启动后,运行模拟器里的iOS App前,运行以下命令:(因为没有我们的驱动的macOS是无法运行被patch过的Xcode和simulator的)

1
2
sudo cp -r ${HOME}/Develop/kernels/iemukern.kext /tmp/
sudo kextutil -t /tmp/iemukern.kext

向模拟器安装iOS App

用任何压缩软件解压缩ipa文件,取得其中的.app文件夹。

 

如果你系统上有多个Xcode,确保你正在向那个你patch过的Xcode的模拟器安装App。用以下命令安装:

1
xcrun simctl install <device> <pathOf.appFolder>

截图

微信截图

 

王者荣耀截图

已知问题

尽管我们已经做了许多工作,但是由于真实设备与模拟器诸多不同,仍然有很多App会崩溃,或者无法正常运行在模拟器里。现在只有一小部分App经过测试。我们已经修正了很多问题但是仍然有更多的等待修正。如果你非常希望某个App能够运行在iqemu64上,你可以在我们github项目主页上新建一个issue。如果你找到能够运行在iqemu64上的App,也欢迎通知我们。Metal的支持非常有限,你可以在苹果官网上找到相关的文档。我们可以制作一个兼容层,但是还未完成。
Xcode iOS模拟器中OpenGLES的实现是一个软件渲染器,它是非常非常慢的。硬件的OpenGLES实现此次并没有开源。
Signal handler与mach exception port的支持比较差,因此App可能将无法使用崩溃报告这个功能。iOS系统的syscall尚未实现。

联系我们

其他部件,包括提供更好的调试支持,为建立动态分析工具而作的指令级别的测时框架,检测内存管理bug,和提供更好的App兼容性,此次尚未开源。如果你感兴趣,可以向imoltencoreco#gmail.com发一封邮件,也欢迎任何的的反馈和想法。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 13387
活跃值: (4426)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排支持
2021-5-10 23:56
0
雪    币: 357
活跃值: (3573)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
为什么不在win上跑呢,都用了qemu,可以内核也跑起来,github已经有几个开源了
2021-5-11 00:00
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
期待魔改一个win版本的出来
2021-5-11 00:51
0
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
除了指令架构,解决对Xcode模拟器的环境的依赖才能在Win上跑吧,支持
2021-5-11 14:55
0
雪    币: 198
活跃值: (616)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持
2021-5-22 11:16
0
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7

原来是广告 , 打扰了

最后于 2021-6-27 22:57 被透明色编辑 ,原因:
2021-6-27 08:44
0
雪    币: 49
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
大佬,你好,我的qq号是234321121,可以把编译好的安装包,发给我吗,或者方便加个qq交流一下吗,因为有的地方,我整不明白,谢谢
2023-11-18 16:21
0
游客
登录 | 注册 方可回帖
返回
//