Introducing scrcpy — статья об утилите scrcpy, позволяющей в одну команду получить на экране ПК картинку с экрана телефона, с возможностью управления с помощью мыши и клавиатуры. Однако интересна статья не этим, а тем, что рассказывает, как эта утилита работает.
Рекомендуем к прочтению: Создание биткойн-майнера на Java
Чтобы получить картинку с экрана, scrcpy должна загрузить на смартфон и выполнить с правами adb shell код, который запустит процесс скринкастинга экрана и передачи видеопотока на комп. И утилита делает это весьма интересным образом. Код, запускаемый на смартфоне, написан на Java, но это не приложение для Android, а просто запакованный в jar файл DEX.
Разработчик scrcpy объясняет, как сделать такое «неприложение».
- Пишем приложение на Java (пример простейший):
12345678910[crayon-66281b3009f16752741462 inline="true" ]import android.os.SystemClock;public class HelloWorld {public static void main(String... args) {System.out.print("Hello,");SystemClock.sleep(1000);System.out.println(" world!");}} - Собираем приложение:
1234[crayon-66281b3009f18031121484 inline="true" class="console"]$ javac -source 1.7 -target 1.7 \-cp "$ANDROID_HOME"/platforms/android-27/android.jarHelloWorld.java - Перегоняем его в DEX:
123[crayon-66281b3009f1a228258542 inline="true" class="console"]$ "$ANDROID_HOME"/build-tools/27.0.2/dx \--dex --output classes.dex HelloWorld.class - Запаковываем в jar:
12[crayon-66281b3009f1c866739752 inline="true" class="console"]$ jar cvf hello.jar classes.dex - Закидываем на устройство и запускаем:
123[crayon-66281b3009f1e205866504 inline="true" class="console"]$ adb push hello.jar /data/local/tmp/$ adb shell CLASSPATH=/data/local/tmp/hello.jar app_process / HelloWorld
Вуаля, мы получили приложение, которое нет необходимости устанавливать и которое имеет права shell, то есть может выполнять многие привилегированные действия, недоступные обычным приложениям (signature level permission): бэкап, скринкастинг, снятие скриншотов, установку и удаление приложений.