[Из песочницы] Залезаем во внутреннее хранилище Android M
В Android 6.0 ввели функцию, позволяющую отформатировать карту памяти так, чтобы она являлась не отдельным хранилищем, а придатком ко внутренней памяти. Это позволяет избежать путаницы с двумя хранилищами данных, особенно при ручной установке некоторых не всегда честно купленных крупных приложений, поставляемых по частям. Однако есть один нюанс: при этом всём нам наглухо блокируют доступ к карте напрямую. Хочешь что-то передать на устройство — используй MTP со всеми вытекающими, вроде скорости передачи файлов, сравнимой с прогулочным шагом контуженной черепахи. Карту теперь не только к ПК через кабель напрямую нельзя подключить: её и из выключенного телефона через кардридер просто так не смонтируешь, ведь она отформатирована в нечто неизвестное ни науке, ни нашим компьютерам.
Но ведь правила созданы для того, чтобы их нарушать? Давайте попробуем обойти это бессовестное ограничение.
Способ первый, простой: adb push/pull
Рекомендуется для ежедневного использования. Судя по всему, даже не требует рут. Всё, что понадобится — это ADB. Те, кто в курсе, могут пролистать до второго способа.
С передачей всё просто: первый аргумент — откуда, второй аргумент — куда. /sdcard — то место, куда на Андроиде монтируется доступное пользователю хранилище, т.е. корневой каталог штатного файлового менеджера почти любого девайса на Андроиде.
$ adb push chunk.bin /sdcard
chunk.bin: 1 file pushed. 4.8 MB/s (44040192 bytes in 8.667s)
Получение — аналогично:
$ adb pull /sdcard/chunk.bin chunk2.bin
/sdcard/chunk.bin: 1 file pulled. 16.0 MB/s (44040192 bytes in 2.627s)
$ cmp chunk.bin chunk2.bin
Основной плюс — двухсторонний обмен данными на вполне удовлетворительной скорости (если сравнивать с MTP). Также ко всей этой красоте прилагается симпатичный счетчик прогресса в процентах, который, к сожалению, отсюда не видно. Полагаю, что к графическому файловому менеджеру тоже можно как-то приделать нечто похожее, но на практике с такими плагинами сталкиваться не приходилось. Возможно, Android всё-таки не зря нас к карте не подпускает, ну да ладно, кто ж его спрашивает?
Способ второй, интересный: ручное монтирование зашифрованных разделов
На этот раз нам понадобятся root-доступ к смартфону и ПК с системой на базе Linux.
Для начала вытянем карту из девайса, подключим к ПК и сразу же посмотрим на её содержимое.
$ parted /dev/mmcblk0 print
Model: SD SD32G (sd/mmc)
Disk /dev/mmcblk0: 31.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 17.8MB 16.8MB fat32 android_meta
2 17.8MB 31.2GB 31.2GB android_expand
Отлично, хотя бы таблица разделов имеется.
Невооружённым взглядом видно, что филейная часть — это второй раздел с неопознанной файловой системой. Первый раздел прекрасно монтируется в fat32 и не менее прекрасно пуст, поэтому про него можно забыть, т.к. я не знаю, что на нём хранится у здоровых людей.
Вторая часть зловещего плана — ключ. Да-да, данные зашифрованы: не просто ж так parted не смог обнаружить на целевом разделе ФС. С ключом всё почти так же просто: хранится он на нашем Android-девайсе в двоичном файлике по адресу /data/misc/vold/expand_PARTUUID.key, где PARTUUID — это UUID шифрованного раздела в нижнем регистре без разделителей. Рут нам понадобится как раз для того, чтобы добраться до этого файла через нечитаемый для всех, кроме рута, каталог /data/misc/vold.
$ partuuid=$(lsblk /dev/mmcblk0p2 -o PARTUUID | tail -1 | tr -d '-')
$ adb root
$ adb pull /data/misc/vold/expand_$partuuid.key magic.key
/data/misc/vold/expand_9d292da2b76a9179118aaa217f23e4a7.key: 1 file pulled. 0.0 MB/s (16 bytes in 0.110s)
Готово. 128 бит заветной информации.
Заключительная часть Мерлезонского балета — подключение раздела. Сделаем это стандартным линуксовским dm-crypt, который, собственно, и самим Андроидом используется.
К сожалению, я не знаю, какой именно метод шифрования используется Андроидом, поэтому понадеюсь на пресвятой дефолт, оставив --cipher неуказанным.
$ cryptsetup open --type plain --key-file=magic.key --key-size=128 /dev/mmcblk0p2 dm-magic
На меня не ругаются, это хорошо. Монтируем.
$ mount /dev/mapper/dm-magic /mnt
$ ls -l /mnt
total 21
drwxrwx--x 33 alpha alpha 3488 Mar 16 08:51 app
drwxr-x--x 3 root root 3488 Nov 29 00:34 local
drwxrwx--- 4 1023 1023 3488 Nov 29 08:01 media
drwxrwx--t 3 alpha 9998 3488 Nov 30 03:02 misc
drwx--x--x 3 alpha alpha 3488 Nov 29 00:34 user
drwx--x--x 3 alpha alpha 3488 Nov 29 00:34 user_de
Кажется, получилось. Неопознанные UID-ы напоминают нам о том, что карточка не с нашего ПК и лучше бы нам здесь особо ничего не ворошить.
Если поковыряться по каталогам, можно увидеть данные приложений, хранящихся на карте памяти, а также непосредственно содержимое SD-карты, которое нам подсовывали в первом способе по адресу /sdcard. Его мы можем найти в каталоге /mnt/media/0.
На этом всё, приятного ковыряния.