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


#1

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


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


#4

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

拓展阅读:


#5

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


#6

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


#7

保卫萝卜这家开发商的节操就更没底线了,参见我的博客 http://mayuyu.io/2017/09/22/AdAppActive/


#8

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


#9

指令集不一样的。


#10

安卓只用模拟userland啊。


#11

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


#13


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