我想知道如何 平行空间 应用程序可以复制和执行其他应用程序,而无需复制其APK或在修改后的软件包名称下运行它们,如Playstore上的其他应用程序(例如: “com.whatever.name-的重复的应用程序内”)。
经过调查他们的 AndroidManifest.xml中,创建的文件夹 /数据/数据/,以及设备上的日志,我能得到的唯一结论是以某种方式 平行空间 能够执行其他APK的代码,但它将这些应用程序的数据目录映射到自己的数据目录中。
证据:
- 目录创建如下: /data/data/com.lbe.parallel.intl/parallel_intl/0/whatever-package-name-you-cloned
- 每个重复的应用程序执行都以其中一个的新任务开始 代理 活动,然后以某种方式重复的应用程序取代新创建的进程。
最初,我认为这是有道理的 DexClassLoader/PathClassLoader API,但我无法进一步调查。我也看到了一些像这样的问题 一,但似乎并非如此。
我正在分析小米Redmi 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个代理提供程序。这些用于托管要克隆的应用程序。因此,克隆的应用程序将与Parallel Space位于同一个进程空间中。它还有来自ActivityManager,ServiceManager,AccountManager,LocationManager等的Android框架存根。基本上,当编译应用程序时,它会创建这些类,这些类与随Android设备附带的framework.jar中的类相同。用这个 代理存根 和 Java反射,它在自己的进程空间中创建并托管应用程序。为此,它只是拦截活动管理器调用并编组新信息,然后将其转发到框架。
它还创建了一个新的目录结构,用于在其/ data / data /文件夹中存储应用程序信息以托管克隆的应用程序数据。
细节是巨大的,Parallel Space开发人员使用来自AOSP源代码的广泛知识来利用行为,并利用反射和代理来利用Java类的使用方式。
更新:
刚刚在GitHub上找到了Parallel space的开源版本。这完全符合相同的原则。下方链接。
https://github.com/asLody/VirtualApp