Сейчас всё больше смартфонов идут без слота для sd-card, и информацию приходится хранить на встроенной памяти с доступом к ней по MTP. Такой режим подключения не позволяет стандартными средствами восстановить данные телефона после waip’а или случайного удаления.
Сегодня на примере связки Xiaomi Mi2s и Windows 8.1 я постараюсь рассказать, как можно восстановить утерянные данные, кому интересно, добро пожаловать под кат.
Следует заметить, что если вы по ошибке отформатировали внутреннюю память смартфона/планшета/смартпэда, то не стоит расстраиваться, а главное, ни в коем случае не нужно ничего записывать на память, так у вас получится восстановить больше данных.
Протокол MPT не позволяет компьютеру распознать подключенный девайс как USB-накопитель и программы для восстановления не могут просканировать такое устройство и спасти данные, поэтому нам потребуется скопировать весь внутренний раздел памяти в виде образа системы.
Подготовка PC
Для того, чтобы скопировать раздел системы, нам понадобится:
- Cygwin;
- Netcat;
- VHDtool;
- Драйвера для вашего устройства (в случае проблем habrahabr.ru/post/205572/);
- ADB (http://adbdriver.com/downloads/ или developer.android.com/sdk/win-usb.html);
- Сервер FileZilla.
Сперва устанавливаем USB-драйвера для вашего устройства и ADB. После этого советую перезагрузить ПК.
Cygwin
Запускаем скаченный файл. Install from internet > Далее > Далее > Direct connection (если вы не используете прокси и VPN) > выбираем сервер, с которого будут качаться модули (я качал с box-soft.com) > Далее произойдет загрузка списка модулей и откроется окно с доступными для скачивания > Нам понадобится пункт Devel, а в нём все подпункты, название которых начинается с букв gcc > Далее начнется загрузка выбранных модулей и дальнейшая их установка.
VHDtool
Создаём папку с адресом C:cygwin6400 (имя не имеет значения, не стоит только использовать буквы отличные от латиницы), здесь будет лежать наш образ. Копируем в папку VHDtool.exe.
Netcat
Скачанный архив распаковываем в папку C:cygwin64
FileZilla
В ходе инсталяции соглашаемся на все стандартные установки.
После установки FileZilla запустится автоматом, но из программы необходимо выйти и запустить её от имени Администратора.
При запуске FileZilla спросит имя сервера, оставляем всё как есть.
Далее заходим Edit — Settings и делаем следующие настройки:
listen on those ports 40
timeout settings — по умолчанию стоит 120, 60, 60, а мы ставим везде 0 и нажимаем ОК.
Заходим в edit — users. В окошке users создаем нового юзера. В моем случае это юзер qwer.
Нажимаем Add — пишем имя — нажимаем ОК.
Пароль pass.
Далее в том же меню Users, слева выбираем закладку Shared folders. Заходим туда и добавляем папку в которую будет заливаться наш блок. Нажимаем Add и добавляем папку C:cygwin6400. В окошке появится путь к этой папке. Если слева от надписи C:cygwin6400 не будет буквы H, то нужно нажать Set as home dir. Затем выделив строчку C:cygwin6400 нужно отметить права Read и Write галочками. Затем нажать ОК.
ADB
Нам понадобятся следующие файлы:
- adb.exe
- AdbWinApi.dll
- adb-windows.exe
- AdbWinUsbApi.dll
- fastboot.exe
Скачать их можно на 4pda.
Или вытащить из дистрибутива Android SDK.
Копируем их в папку C:cygwin64bin
Отключаем интернет полностью, если вы используете ноутбук, то воспользуйтесь режимом полёта.
Подготовка Android-устройства
Вам понадобится root.
Свежий BusyBox.
И включенная отладка по USB.
Режим модема по USB
Нам понадобится подключить аппарат по USB к вашему ПК и включить режим модема по USB. Я использую CyanogenMod 11 и у меня этот режим находится по пути: Настройки > Беспроводные сети > Ещё… > Режим модема > USB-модем
Теперь нам необходимо узнать, какой IPv4 адрес получил ваш компьютер.
Идем по пути: Панель управленияСеть и ИнтернетЦентр управления сетями и общим доступом
Кликаем по надписи ’Подключение по локальной сети’ далее Сведения и копируем адрес IPv4.
В моём случае это 192.168.42.79
Важно! При каждом переподключении USB кабеля и вкл/выкл режима модема IPv4 будет меняться.
Какой блок памяти нам нужен?
Вся память в вашем устройстве делится на логические блоки, нам не нужно качать все, достаточно понять, какой раздел содержит стёртую информацию.
Для этого подключаем ваш аппарат к ПК USB-шнурком и от имени администратора запускаем Cygwin.bat в папке C:cygwin64
Вводим команду:
adb devices
В список подключенных девайсов не должен быть пуст, если после строчки List of devices attached пусто, то вы не установили USB-драйвера или не включили отладку по USB.
Когда всё идет хорошо, консоль выглядит так:
20352f2c – мой Xiaomi Mi2s
Теперь нам необходимо посмотреть список блоков памяти, для этого вводим построчно следующие команды:
adb shell
su
find /dev/block/platform/ -name 'mmc*' -exec fdisk -l {} ; > /sdcard/list_of_partitions.txt
Hint: если вам лень вручную переписывать команды или вы боитесь допустить ошибку, то можно воспользоваться копированием, но вставить привычным способом строчку в консоль не выйдет, поэтому необходимо кликнуть правой кнопкой мыши по окну консоли, далее выбрать изменить > вставить.
После чего во внутренней памяти появится файл list_of_partitions.txt, который нам необходимо скопировать на ПК и изучить.
Disk /dev/block/platform/msm_sdcc.1/mmcblk0p27: 25.6 GB, 25698483712 bytes
4 heads, 16 sectors/track, 784255 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Disk /dev/block/platform/msm_sdcc.1/mmcblk0p27 doesn't contain a valid partition table
Disk /dev/block/platform/msm_sdcc.1/mmcblk0p26: 3758 MB, 3758096384 bytes
4 heads, 16 sectors/track, 114688 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Disk /dev/block/platform/msm_sdcc.1/mmcblk0p26 doesn't contain a valid partition table
Disk /dev/block/platform/msm_sdcc.1/mmcblk0p25: 402 MB, 402653184 bytes
4 heads, 16 sectors/track, 12288 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Disk /dev/block/platform/msm_sdcc.1/mmcblk0p25 doesn't contain a valid partition table
итд…
Внутренней памяти в моём аппарате 32 GB. Поэтому я ищу самый большой раздел, в моём случае это mmcblk0p27 размером 25,6 GB, у вас он скорее всего будет иметь другое имя, или вообще не будет иметь приписки p**. Безусловно, никто не гарантирует что именно самый большой раздел окажется тем самым на котором еще совсем недавно лежали ваши фото, видео, документы и тд., но в 90% случаев это оказывается именно тот раздел памяти который нам нужен. В противном случае вам придется по порядку копировать все образы и проверять каждый из них.
Копируем раздел памяти на ПК.
Если вы уже закрыли окно Cygwin, то запускаем его снова от имени администратора через Cygwin.bat
Вводим команды построчно:
adb shell
su
mkfifo /cache/myfifo
ftpput -v -u qwer -p pass -P 40 192.168.42.79 mmcblk0p27.raw /cache/myfifo
Не забудьте внести соответствующие корректировки в код!
Расшифруем написанное:
qwer – имя учетной записи в FileZilla (у вас свой если меняли)
pass – пароль от учетной записи в FileZilla (у вас свой если меняли)
40 – порт сервера FileZilla
192.168.42.79 – адрес сервера FileZilla (у вас свой)
mmcblk0p27.raw – копируемый блок памяти (у вас свой)
Открываем второе окно Cygwin.bat и вводим команды:
adb shell
su
dd if=/dev/block/mmcblk0p27 of=/cache/myfifo
Не забудьте исправить mmcblk0p27 на номер своего блока!
Смотрим в окно FileZilla и видим, что скачивание mmcblk0p27.raw в папку C:cygwin6400 началось, теперь можно закрыть окна cygwin и сделать перерыв на чай.
Конвертируем и восстанавливаем
Вернулись? Файл скачался? Отлично. Отключаем телефон, подключаем интернет. Запускаем Cygwin.bat и вводим следующие команды.
cd /000/
VhdTool.exe /convert mmcblk0p27.raw
Не забудьте исправить mmcblk0p27 на номер своего блока!
У меня конвертирование заняло пару секунд. На выходе у нас получается всё тот же файл mmcblk0p27.raw в папке C:cygwin6400, но уже немного другой. Этот сконвертированный файл можно смонтировать как виртуальный диск, или, например через R-studio, произвести восстановление данных непосредственно из нашего образа. Я так и поступил.
Hint: важные моменты пометил желтым.
Итоги
Моей целью было популярным языком объяснить способ копирования системного раздела с android-девайса на ПК, возможно, некоторые упрекнут меня в сложностях, связанных с USB-модемом и ftp, и скажут, что наверняка можно было проще вытащить образ. Отвечу так: я пробовал другими способами, описанными на 4pda и xda-developers, у меня не вышло, зато с ftp получилось со второй попытки, а входе написания статьи всё вообще прошло как по маслу.
У меня получилось восстановить все утерянные фото без потерь в качестве и даже то, что я и не думал восстановить. В ходе восстановления обнаружились фотографии, которые делал в августе прошлого года, когда только купил телефон и тестировал камеру.
В завершении хочется также упомянуть еще одну небольшую утилиту, которая восстанавливает данные — DiskDigger undelete. Она бесплатная, неплохой функционал, но к сожалению, после 40% она у меня вывалилась с ошибкой.
P.S. Теперь буду чаще делать бэкап...
Автор: bzz11g
автору статьи РЕСПЕКТ !!!
проделал все указанные операции, было увлекательно пройти этот квест, по итогам
немного добавлю , может кому поможет на наступить на мои грабли (на хабре нельзя комментировать):
– не во всех моделях смартфонов напрямую понимаются команды – mkfifo , find , fdisk, ftpput и т п , в этом случае нужно добавить busybox и команда сработает
– не понял зачем cygwin64 ставить , adb работает без него, VhdTool также в нем не нуждается и конвертит образ, НО R-Studio без конвертации понимает скачанный *.raw и распознает его
– для работы процесса передачи файла через ftp необходимо временно отключить брэндмауэр windows, а также заодно и антивирус , у меня последний KIS он вообще лютует и все подозрительное рубит не спрашивая.
– шаманство с транспортом по ftp образа диска смартфона оказалось проще сделать обычным копированием при помощи plugin для Far – FarDroid в native режиме c включенной отладкой по USB на смартфоне, заходим в папку /dev/block и копируем mmc* блоки.
Класс, получилось, спасибо. Только дольше в несколько раз, чем FilleZilla