Как выполнить APK в настраиваемом каталоге данных?

Мне было интересно, как Parallel Space приложение может дублировать и выполнять другие приложения, не копируя их APK или не запуская их под измененными именами пакетов, как другие приложения на Playstore do (например: "com.whatever.name-of-duplicated-app" ).

После изучения их AndroidManifest.xml, папок, созданных на /data/data/, и журналов на устройстве, единственный вывод, который я мог получить, заключается в том, что каким-то образом Parallel Space способен выполнять код из других APK, но он отображает каталоги данных этих приложений в свой собственный каталог данных.

Evidences:

  • Каталоги создаются следующим образом:/data/data/com.lbe.parallel.intl/parallel_intl/0/whatever-package-name-you-cloned
  • Каждое повторное выполнение приложения начинается с новой задачи одной из своих действий с прокси-сервером, а затем как-то дублируемое приложение имеет место для вновь созданного процесса.

Первоначально я думал, что это что-то с DexClassLoader/PathClassLoader, но я не мог продвинуться дальше с этим расследованием. Я также видел несколько таких вопросов, как один, но, похоже, это не так.

Ответ 1

Я анализировал Xiaomi 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. Таким образом, в основном, если мы наблюдаем последние два процесса, один из них размещается в параллельном идентификаторе процесса, а другое приложение в своем собственном идентификаторе процесса.

Обратное проектирование Parallel Space с использованием apktool и dex2jar к следующим результатам.

Parallel Space объявляет 100 прокси-операций, 100 прокси-сервисов и 100 прокси-провайдеров. Они используются для размещения приложения, которое должно быть клонировано. Следовательно, клонированное приложение будет находиться в том же пространстве процессов, что и Parallel Space. Также у него были заглушки для Android Framework от ActivityManager, ServiceManager, AccountManager, LocationManager и многих других. По сути, когда приложение компилируется, оно создает те же классы, что и в framework.jar, который поставляется с устройствами Android. Используя эту заглушку Proxy и отражение Java, она создает и размещает приложение в своем собственном пространстве процессов. Для этого он просто перехватывает вызовы Activity Manager и собирает новую информацию, которая затем пересылается в платформу.

Он также создает новую структуру каталогов для хранения информации о приложении в своей папке /data/data/для размещения клонированных данных приложения.

Детали огромны, разработчик Parallel Space использовал обширные знания из исходного кода AOSP, чтобы усилить поведение, а также усилил использование классов Java с помощью Reflection и Proxies.

Обновить:

Только что нашел версию с открытым исходным кодом Parallel space на GitHub. Это работает точно по тем же принципам. Ссылка ниже.

https://github.com/asLody/VirtualApp