[Из песочницы] Залезаем во внутреннее хранилище Android M

geek.png

В 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.

На этом всё, приятного ковыряния.

© Geektimes