Залезаем во внутреннее хранилище Android M +36



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


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

Вы можете помочь и перевести немного средств на развитие сайта

Теги:



Комментарии (54):

  1. DASM
    /#10688323 / -1

    вот врать не надо, а? «сравнимой с прогулочным шагом контуженной черепахи. » — покажите реальные скорости с методикой проверки. Все нормально с МТР

    • immaculate
      /#10688335 / +2

      Почему врать? Я не автор статьи, у меня Linux и было уже 4-5 телефонов на Android. В связке Linux и Android, передача по MTP тупит просто ужасно. При этом сколько-нибудь большие файлы скорее всего не скопируются ни в одну сторону, процесс зависнет где-нибудь в самом начале, сколько не пытайся.

      Поэтому я тоже пользуюсь adb push/pull, или даже передаю файлы через Яндекс.Диск. Так что мой опыт полностью совпадает с опытом автора статьи.

    • nidalee
      /#10688831

      Вместо тысячи слов.
      Все три — отдельные ссылки.

      Воистину, все нормально с MTP. Даунгрейд шагает по планете огромными шагами…

      • aamonster
        /#10688941

        Мой личный опыт — mtp крайне печален, когда надо скопировать много файлов. Вроде это даже не противоречит вашим картинкам, если на них скорость передачи одного большого файла, но от этого не легче.

        • evilrussian
          /#10689209

          Меня больше бесит не скорость ( хотя это тоже ужас), а то что на середине может всё зависнуть напрочь. Включая телефон. И это на всех Android телефонах, что я пользовался.
          Переименовываешь файл/папку на телефоне/планшете через MTP? Получи зависание на минутку.

          • aamonster
            /#10689239

            Ну, справедливости ради, MSD, с которым сравнивается по ссылкам nidalee, тоже не сахар: необходимость размонтировать том не радует.
            Надо будет попробовать adbfs.

          • nlykl
            /#10690201

            Это хорошо, если зависание. В некоторых линуксах при перемещении или переименовании данные вообще пропадают.

        • nidalee
          /#10689859

          Простите, это был сарказм.
          По MTP я всего один раз куда-то залезал — больше никогда.

      • ntfs1984
        /#10689667 / +1

        Снимите пожалуйста видео, как вы входите по MTP в папку DCIM с хотя бы полтыщей фоточек.

        А потом вставьте телефон с музычкой в среднестатистический телевизор или магнитолу в машине с поддержкой USB и MP3, и расскажете как оно.

        • nidalee
          /#10689861

          Выше ответил, неудачный сарказм был. Обеими руками против MTP. И да, тесты подтверждают, что он хуже.

          • ntfs1984
            /#10689891

            А, простите.
            У большинства людей просто сложилось четкое презрение к технологиям, которые в свою очередь требуют другие технологии которые поддерживаются 2.5 устройствами ))

    • betrachtung
      /#10689065

      MTP отучил меня от пиратской музыки, потому что оказалось проще заплатить за подписку на гуглплеймьюзик, чем кидать на телефон альбомы по MTP.
      MTP вынудил меня заплатить за большое облако, потому что скидывать с телефона фото оказалось удобнее через Яндекс.Диск.
      Мне иногда кажется (поправляю шапочку из фольги), что основная задача MTP — пересадить нас на облачные сервисы. По крайней мере, это единственная задача, с которой он справляется.

    • antonn
      /#10689651

      Дело не в скорости копирования, а в том, что для копирования последних пары фотографий на смартфоне MTP сначала должно построить дерево всех файлов в папке. Ну построило, вы скопировали файл, вышли на уровень выше, зашли обратно в папку с фотографиями — и оно опять начинает получать список файлов. Попробуете в другом окне открыть корень устройства MTP и получите ошибку типа «устройство занято». И хорошо если при этом не отвалится в первом окне скан директории.
      Про то, что отсутствует блочный доступ и нельзя воспользоваться программами для восстановления удаленных файлов (неоднократно пользовался, как для карты, так и для встроенной памяти в телефоне, на аппаратах постарше) вообще молчу.

  2. DASM
    /#10688345

    тега перевод нет. у меня опыт противополжен, МТР — проще и быстрее

    • cpcat
      /#10688587 / +1

      Так у вас, наверное, Windows?

      • betrachtung
        /#10689061

        Не панацея. Я использовал MTP на Windows 7, Windows 10, всевозможных линуксах и паре старых версий макоси (тогда нужно было ещё и специальное приложение ставить — не знаю, как сейчас). На трёх, что ли, разных смартфонах.
        В Windows и Linux MTP работало, как говно. На маке — ещё хуже, насколько такое вообще возможно.
        Особенно обидно было, когда при попытке скопировать несколько десятков гигабайт файлов с Windows 7, когда копирование в очередной раз зависло (что для MTP является нормой: если кидаешь много папок, лучше кидать по одной, тогда будет ясно, на какой всё повисло), карта на 64 Гб просто померла и перешла в read only.

        • valera5505
          /#10689659

          не знаю, как сейчас

          Так же и работает оно по-прежнему отвратительно, хотя можно найти файловые менеджеры, которые поддерживают MTP по-своему, но с ними тоже не всё хорошо.

        • Javian
          /#10690407

          На OSX по прежнему жестко вмещается, если много файлов в каталоге.

    • mike114
      /#10688849

      У меня при попытке скопировать больше 250 (примерно) фотографий операция может длиться бесконечно, но главная проблема в том, что порой, если появляются фотографии, у которых разница в имени попадает на первую цифру даты (например, 20180316_212855.jpg и 20180326_212855.jpg), то копируется вторая фотография под именем первой. Дальше все зависит от того, попала ли вторая фотография в копируемый/перемещаемый массив. Если да, то процесс зависает (бесконечный прогресс), а после отмены действия MTP уже не работает. Если нет (ну или после переподключения телефона), то при последующем копировании появляется стандартный диалог с предложением перезаписать существующий файл, и, пока я не обнаружил пропажу нескольких фотографий, я действительно перезатирал их. Вот такой он, MTP.

    • betrachtung
      /#10689067

      Сейчас подключил LG G6 к ноутбуку с Windows 10. Папка с фото (менее тысячи файлов) читалась восемьдесят секунд. Это проще и быстрее чего? Скачивания через GPRS?

  3. Shadow_Moon
    /#10688881

    есть ещё прекрасная программа airdroid. С её помощью можно заходить на телефон как на веб сервер и видны файлы телефона как их представляет андроид. Пользуюсь ей даже когда есть под рукой кабель.

    • jrthwk
      /#10689131

      Еще есть хорошая программа UMS Enabler

      • LESHIY_ODESSA
        /#10689787

        Да, есть такая программа, но я всё же отловил на ней такие же глюки как и под MTP (Android 4.4.2). Если в мобилке отредактировать .txt файл, а потом открыть его с компьютера, то файл не будет содержать последних изменений.
        А вот ниже приведенный пример с Total Commande и плагином выдает желаемый результат.

  4. dmitrodem
    /#10688933

    зачем все это (ADB, MTP) гуглу? Чем не угодил старый добрый SSH? Как в той же Nokia N9.

    • ntfs1984
      /#10693973

      Разные назначения у них.
      ADB — независимый дебаггер. Софтина которая запускается на низком уровне, отлавливает и выполняет команды извне, вне зависимости от того, через какой интерфейс было подключение.

      SSH — всего лишь сетевой протокол, который сам по себе ничто без сторонних утилит.

      MTP — тупо протокол обмена файлами, еще и весьма туговатый, а посему не нужный, ибо есть USB drive. Но хипсторский тренд, и пофиг что 80% устройствами не понимается )

  5. Qwentor
    /#10688963

    Для adb есть плагин для Total Commander — никакой тебе консоли, человеческое копирование. Как для Linux, правда, не знаю. Сомневаюсь что он подходит к какому-либо из аналогов типа Gnome Commander / Double Commander

    • LESHIY_ODESSA
      /#10689789

      Да, подтверждаю, плагин отличный — Android ADB 8.3

      • Qwentor
        /#10689857

        О! В описании как минимум, вижу, что в Double Commander под Linux тоже работает)

  6. Rast1234
    /#10689011 / +1

    Уметь монтировать, конечно, прикольно, но для повседневных задач, к тому же без root, тягания карты и с низким порогом входа, остановился на FTP, и всем страдающим с mtp рекомендую.
    Просто ставим на устройство любой ftp-сервер из маркета, включаем когда надо передавать файлы. Идеальный мультиплатформенный клиент — FileZilla, ничего не потеряется и не побьется. Если смартфон умеет в usb tethering, скорость передачи по проводу близка к теоретически максимальной. Да, с оверхедом на tcp/ip стек.

    //ворчание в тему
    Каким образом можно было допустить во всемирный продакшн такое недоразумение как MTP я вообще не представляю. Никто, видать, не тесиировал передачу больше одного файла, как в андроиде, так и в винде и линуксе. Говнокодит кто-то там далеко, а стыдно мне: объяснять людям почему у них фотки не копируются и учить юзать ftp в 2018 году…

    • h31
      /#10690091

      Плюсую по поводу FTP. На некоторых телефонах есть даже встроенный сервер.


      По-моему, было бы идеально, если бы Гугл добавил бы в Android встроенный SMB-сервер, который активируется при подключении по USB. SMB поддерживается всеми осями, работает стабильно и быстро. Если разработчиков смущает нативный код в Samba, то есть реализации на Джаве. Не понимаю, что им помешало остановиться на таком варианте.

  7. Arxitektor
    /#10689163

    Каким образом можно было допустить во всемирный продакшн такое недоразумение как MTP

    Это да просто какое-то жуткое недоразумение.
    У меня стандартный глюк через USB 3.0 не копируются куча файлов в папках типа электронных книг, через USB 2.0 все ок. Возможен конечно глюк железа.
    OS Переставлял толку нет. Куда делось старое и удобное подключение как обычного диска.?
    И можно ли его вернуть?

    • jrthwk
      /#10689393

      Нет. Гугль выпилил UMS решительно и официально. На некоторых устройствах его все-таки запилил обратно конкретный вендор, если повезло, но это против рекомендаций гугла.

      А так — есть программка для эмуляции UMS Enabler, можно еще ftp server pro или samba filesharing серверы запускать на устройстве.

    • Gordon01
      /#10689411

      > Куда делось старое и удобное подключение как обычного диска.?
      Убрали в 4.1 вроде. Оно отрубало флешку от самого андроида, приложения падали, было много проблем.

      • nidalee
        /#10689869

        Нет, еще в 5 точно было.

        • Leeloush_Keer
          /#10690195

          в 5.1 убрали, ЕМНИП.


          Старенький xperia Z обновил до 5.1 и всё… больше дебиан не видел флешку телефона.
          Так же боролся, всё глючело, долго копировалось, зависало, в итоге плюнул и юзал облака для передачи с/на телефон.

          • Faramant
            /#10690869

            В 5.1 все работает:

            • Leeloush_Keer
              /#10691175

              Проверил сейчас: v5.1.1 на выбор: Зарядка устройства через USB или Передача файлов (MTP).

      • zikasak
        /#10691747

        Убрали в 3.0 (насколько помню)
        Далее официально осталось в устройствах обновлённых с 2. И там, где производитель запилил обратно

  8. antonn
    /#10689629 / +1

    Однако есть один нюанс: при этом всём нам наглухо блокируют доступ к карте напрямую. Хочешь что-то передать на устройство — используй MTP со всеми вытекающими, вроде скорости передачи файлов, сравнимой с прогулочным шагом контуженной черепахи. Карту теперь не только к ПК через кабель напрямую нельзя подключить

    Так они давно же выпилили MassStorage, теперь как карту не форматируй — андроид выдает доступ исключительно через ужасный MTP.

  9. YouHim
    /#10690041

    А есть ли способ поднять FTP и подключиться к нему через мобильную сеть? Ни один из опробованных мной FTP серверов не смог подключиться.

    • Skerrigan
      /#10691109

      Я юзаю файловый менеджер со встроенным FTP — ES… для жадных знакомящихся есть нужные треды на 4pda.
      На стаце всегда запущен OpenServer с FTP так же.

      • YouHim
        /#10691137

        Имел ввиду наоборот. Запустить на телефоне а заходить с ПК. ПК за НАТом, на нем не получается сервер поднять.

        • Skerrigan
          /#10691171

          Я в пределах дома так же за NAT — и ничего, нет проблем. Мобильник видит комп по WiFi в одной сети. Можно же компу задать локальный статический IP.

          • YouHim
            /#10691185

            В том то и проблема, что мобильный не имеет доступа к локальной сети ПК. Это корпоративная сеть. Вот я и ищу простой способ перекидывать файлы через интернет. Можно, конечно облака использовать, но хотелось бы работать как с обычной файловой системой, прямо в Тотал Коммандер.

            • Skerrigan
              /#10691223

              Верно подметили — виноват, не подумал о вашем варианте сразу (и предложил чепуху).

            • Skerrigan
              /#10691255

              Пардон за дабл-пост, но судя по всему ES умеет и поднимать сервак FTP. Ни разу не пробовал так делать, но может быть присмотритесь?

              • YouHim
                /#10691283

                Не смог найти сервер. Где его посмотреть?

            • antonn
              /#10691667

              FTP поднимает второе соединение для передачи данных (помимо дефолтного на 21 порту), и способ его использования заключается в механизме режима работы FTP — активный или пассивный. В первом случае второе соединение пытается подключиться к клиенту (и если клиент за NAT без инспекции протоколов — соединения не будет), во втором сервер инициализирует сокет и передает порт клиенту, чтобы тот сам произвел подключение. Полагаю что есть большая вероятность что ваша корпоративная сеть не позволит серверу из вне достучаться до ПК в активном режиме. А если ваша мобильная сеть так же NATит вас в интернет — клиент из корпоративной сети не подключится к серверу в сети опсоса.
              Потому остаются варианты типа ТимВьювера…

              • YouHim
                /#10691725

                В мобильной сети, похоже, реальный IP. Потому, что я могу телефон пинговать снаружи. Так же у меня есть как минимум две программы, с которыми я могу конектиться снаружи по IP. (программка с веб-мордой и сервер WebDAV). А вот почему это не работает с FTP?

                • antonn
                  /#10691833

                  А что именно в ошибках говорит ftp? Список файлов получает или даже входа нет? Может провайдер режет порт…

                  • YouHim
                    /#10691925

                    Не удалось установить соединение с «ECONNREFUSED — Соединение отклонено сервером».
                    Скорее всего действительно порт

  10. snuk182
    /#10690209

    Может лучше SMB / FTP, если есть рут? SMB pаботает до седьмого андроида включительно, FTP работает везде.

  11. kolu4iy
    /#10690653

    Мой лайфхак заключался в копировании тысяч файлов в обратном направлении. Ну то есть из es проводника допустим на nfs/smb шару. asb push все же не для ленивых, факт.

  12. wickated
    /#10691329

    По внутреннему вайфаю в тысячи раз быстрее, чем с этим мтп. Сам же метод подшивания флешки к основной памяти тоже очень кривой — зачастую камера просто не может фоткать — не существует раздела или ещё какой глюк.