Ответ 1
Я считаю, что у меня есть основная идея, как они это сделали. Вот фрагменты головоломки.
-
Любое приложение для Android может запустить процесс, вызвав функцию
Runtime.exec()
.Runtime.getRuntime().exec("chmod 755 '/data/data/my.app/files'/native_code");
После выполнения этой строки кода возникает другой процесс. Этот процесс выполняется под тем же Linux-пользователем, что и само приложение.
-
Когда пользователь открывает Настройки → Приложения → Мое приложение и нажимает кнопку "Силовая остановка", основной процесс приложения убивается, , но хостинг strong > (см. выше) все еще работает. Я лично считаю, что это проблема безопасности, и я собираюсь сообщить об этом в AOSP.
-
Такая нативная программа может работать бесконечно и ничего не делать - просто спать. Но перед сном он регистрирует обработчик сигнала завершения, который будет вызываться, когда процесс вот-вот завершится системой.
int main(void) { signal(SIGTERM, termination_handler); while(1) { sleep(10); } } void termination_handler(int sig) { // handle termination signal here }
-
Теперь вы уже должны знать, что такое последняя часть, не так ли? Мой родной term_handler должен иметь возможность запускать браузер. Я не пробовал это в коде, но я предполагаю, что это возможно, потому что я могу сделать это, используя
adb shell
, как показано нижеadb shell am start -a android.intent.action.VIEW -d http://www.google.com
Теперь вернемся к вопросу о том, как это делает браузер Dolphin. Установите приложение и запустите его хотя бы один раз. После запуска он регистрирует собственный наблюдатель удаления, используя принципы, описанные выше. Чтобы увидеть это, подключитесь к устройству и откройте adb shell
. Затем вызовите ps
, чтобы просмотреть список процессов. Вы увидите два процесса, похожие на следующие
u0_a109 315 ... mobi.mgeek.TunnyBrowser
u0_a109 371 ... /data/data/mobi.mgeek.TunnyBrowser/files/watch_server
Как вы можете видеть, он запускает собственную программу watch_server, которая является частью его apk файла. Теперь откройте страницу App info
браузера Dolphin и нажмите "Force Stop"
. Вернитесь к терминалу и снова вызовите ps
. Вы увидите, что процесс mobi.mgeek.TunnyBrowser больше отсутствует, но watch_server все еще работает.
Кстати, этот подход будет работать только в том случае, если сервер watcher работает все время. к убедитесь, что он всегда вверх, оба приложения требуют "запустить при запуске", разрешение, где они начинают своих наблюдателей.
Теперь, когда вы удаляете приложение, Android останавливает все процессы, принадлежащие этому приложению. Watcher получает сигнал завершения и открывает браузер с предопределенным URL-адресом и затем выключается.
В некоторых деталях я мог бы выглядеть немного по-другому, но основная идея этого взлома должна быть такой, как описано.