全宇宙第一款iOS模拟器,原理是把arm二进制事先转成x86_64?

前几天号称全宇宙第一的某模拟器(http://www.heilei.com)开始了内测,内测期间每天通过自己的应用商店提供一款游戏供测试。我原本以为他们自己写了一个运行时的二进制翻译器,像安卓模拟器一样,但是找了半天都没找到,今天才发现他们提供的游戏里可执行文件是x86_64的!下图是原版《保卫萝卜3》和模拟器修改版的对比,可以看出修改版加载了几个自己的库,而且原版二进制体积40M,修改版只有20M。


我只是小白,今天搜索时第一次发现这里。想请教一下各位大大,这种把arm二进制转换成x86_64的技术应该是什么原理,是不是很难实现。而且该模拟器号称兼容所有热门游戏和应用,是怎么做到批量转换的?

是开发者要自己编译一份模拟器版的,他们公众号有写,合作需要打专门的包。 另外即使真的arm64转x86也是没有用的。因为userland的应用程序是要跟darwin内核交互的。内核是要跟硬件交互的。如果这个模拟器连这些都模拟了的话也就不需要装macOS虚拟机了。群里有完整的技术讨论我懒得翻了简单这边打几行字供参考。
老外的那个Corellium靠谱很多,似乎是硬件层去做的一些魔改,但硬件不属于我的领域细节不很清楚。国内这个的话,我只想知道如果真的做到了真正意义上的iOS模拟为什么需要模拟macOS

拓展阅读:

2 个赞

单纯指令集模拟简单很多。多年前我就已经尝试过用UnicornEngine去模拟执行过某个app被混淆过的一个算法。 但是要模拟整个iOS的话。userland自己实现一遍dyld已经非常费劲了。在此之上还有模拟内核/内核访问的硬件功能/系统的XPC服务/GPU Shader/等等。麻烦非常非常多。我原来是指望这个东西是用户态自己模拟arm指令然后把其他东西转交给macOS内核来处理的。但是目前看起来比我想的更Low。 当然我很愿意被打脸,一个完整的模拟器对整个社区来说都是好事,但至少目前来看完全不是这么回事

这个模拟器是魔改的 Xcode 模拟器,给模拟器重新包一个外壳,或者直接 hook 原版模拟器改个标题加个监听服务。而 x64 架构,说白了就是找游戏厂商合作编译了一份模拟器专用包,接入所谓联运SDK,内购支付走联运SDK进行。

保卫萝卜这家开发商的节操就更没底线了,参见我的博客 A Short Analysis of AdAppActive | Believe Be:leave

如果是这样,那号称兼容所有热门游戏和应用可以算欺诈了……另外还想请教一下,如果单纯给模拟器做一个arm到x86的指令翻译器难度有多大,为什么安卓模拟器有iOS这边一直没有呢?

指令集不一样的。

安卓只用模拟userland啊。

安卓一个是很多apk里自带了x86 64的native库,另一个就是只用模拟用户态。这部分比较成熟的就是intel的libhoudini通过劫持相应的调用native用的函数然后用unicorn engine去做的翻译


补个图,这就是他们官方去年在微博上装逼用的那个号。

感觉是因为安卓开源,所以才可以在x86平台上重写对应的底层api实现类似bluestack式的安卓模拟器。而ios不开源,所以底层api实现未知,也就无从谈起在x86上重新实现了。

但是我不太懂,既然有virtualbox式的安卓模拟器,为什么不能用这种方式来做一个virtualbox式的ios模拟器呢?

俺小白一个,大佬看见了帮忙顺手解解惑,谢啦!

virtualbox式的安卓模拟器,其实就是在虚拟机上安装一个安卓系统。
所以其实还是因为ios不开源,而且苹果也没有提供ios系统的安装包(?安装包应该式随便就能下载到吧,这里想不明白。),所以就无法在虚拟机上安装一个ios系统。是这样吗

安卓开源,内核可以编译为x86、x64的可执行文件,于是有了可以在pc机上面运行的内核,有了这个基础一切都好说了。
而iOS不开源,没办法生成x86/x64的内核,唯一可能可行的方法是把Xcode的模拟器打包,而这个模拟器看起来应该就是这么做的。

Corellium 似乎需要自己维护一个arm服务器集群

可怜我大明湖

直接建立给予ARM核心的而模拟器,有人做这方面吧研究吗?