Как выполнить APK в настраиваемом каталоге данных?
Мне было интересно, как приложение Parallel Space может дублировать и запускать другие приложения без копирования их APK или запуска их под измененными именами пакетов, как это делают другие приложения в Playstore (например, "com.whwhat.name-of-duplicated-app").
После изучения их AndroidManifest.xml, папок, созданных в / data / data /, и журналов на устройстве, я могу сделать единственный вывод, что каким-то образом Parallel Space способен выполнять код из других APK, но он отображает каталоги данных. из этих приложений в свой собственный каталог данных.
Evidences:
- Каталоги создаются следующим образом: /data/data/com.lbe.parallel.intl/parallel_intl/0/whwhat-package-name-you-cloned
- Каждое выполнение дублированного приложения начинается с новой задачи одного из их прокси- действий, а затем каким-то образом дублированное приложение заменяется новым процессом.
Сначала я думал, что это что-то с API 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. Таким образом, в основном, если мы наблюдаем последние два процесса, один из них размещается в параллельном идентификаторе процесса, а другое - в собственном идентификаторе процесса.
Обратное проектирование параллельного пространства с использованием apktool
а также dex2jar
выводы были следующими.
Parallel Space объявляет 100 прокси-операций, 100 прокси-сервисов и 100 прокси-провайдеров. Они используются для размещения приложения, которое должно быть клонировано. Следовательно, клонированное приложение будет находиться в том же пространстве процесса, что и Parallel Space. Также у него были заглушки для Android Framework от ActivityManager, ServiceManager, AccountManager, LocationManager и многих других. В основном, когда приложение скомпилировано, оно создает те же классы, что и в framework.jar, который поставляется с устройствами Android. Используя эту заглушку Proxy и отражение Java, она создает и размещает приложение в своем собственном пространстве процессов. Для этого он просто перехватывает вызовы диспетчера операций и собирает новую информацию, которая затем направляется в платформу.
Он также создает новую структуру каталогов для хранения информации о приложении в своей папке / data / data / для размещения клонированных данных приложения.
Детали огромны, разработчик Parallel Space использовал обширные знания из исходного кода AOSP, чтобы усилить поведение, а также усилил использование классов Java с помощью Reflection и Proxies.
Обновить:
Только что нашел версию с открытым исходным кодом Parallel space на GitHub. Это работает точно по тем же принципам. Ссылка ниже.