我正在分析小米红米 Note 3,它允许 whatsapp 的多实例应用程序。它所做的非常简单,它从框架内创建另一个用户配置文件以区分两者。
u0_a171 1832 631 1094576 91608 SyS_epoll_ 0000000000 S com.whatsapp
u999_a171 8571 631 1037396 65024 SyS_epoll_ 0000000000 S com.whatsapp
平行空间正在做一些更有趣的事情。在进入细节之前,让我们分析一下ps的输出
u0_a45 2915 249 1120668 61264 SyS_epoll_ b6ca7010 S com.lbe.parallel.intl
u0_a45 6876 249 1081464 40588 SyS_epoll_ b6ca7010 S com.google.android.gms.persistent
u0_a45 6945 249 995016 19828 SyS_epoll_ b6ca7010 S com.google.process.gapps
u0_a45 11296 1 1220488 22760 futex_wait b6c7a8b0 S com.google.android.gms
u0_a45 12303 249 1064788 59680 SyS_epoll_ b6ca7010 S com.freecharge.android
u0_a100 12786 249 699476 45096 jbd2_log_w b6ca6fe8 D com.freecharge.android
在这里,我使用 Parallel Space 为FreeCharge创建了另一个帐户。所以基本上,如果我们观察最后两个进程,其中一个托管在并行空间进程 ID 中,而另一个应用程序位于它自己的进程 ID 中。
使用逆向工程平行空间apktool
,dex2jar
结果如下。
Parallel Space 声明了 100 个代理活动、100 个代理服务和 100 个代理提供者。这些用于托管要克隆的应用程序。因此,克隆的应用程序将位于与并行空间相同的进程空间内。它还有来自 ActivityManager、ServiceManager、AccountManager、LocationManager 等的 Android 框架存根。基本上,在编译应用程序时,它会创建这些类,这些类与 Android 设备随附的 framework.jar 中的类相同。使用此代理存根和Java 反射,它在自己的进程空间中创建和托管应用程序。为此,它只是拦截活动管理器调用并编组新信息,然后将其转发到框架。
它还创建了一个新的目录结构,用于在其 /data/data/ 文件夹中存储应用程序信息,以托管克隆的应用程序数据。
细节非常丰富,Parallel Space 开发人员使用了来自 AOSP 源代码的广泛知识来利用该行为,并利用反射和代理来利用 Java 类的使用方式。
更新:
刚刚在 GitHub 上找到了 Parallel space 的开源版本。这完全符合相同的原则。下方链接。
https://github.com/asLody/VirtualApp