В кирпич и обратно
...или танцы вокруг одного девайса с андроидом с целью чистки от всякого разного и последующего обустройства по своему желанию.
В качестве подопытного кролика на сей раз выступает китаец 'Perfeo 7143'.
Дисклеймер
Эта статья ни в коем случае не является готовым руководством к действию. ССЗБ, заявившие что-то в духе "я скопипастил всё как в статье и получил кирпич" - будут посылаться без лишних разговоров в направлении, которое зависит только от богатства фантазии автора.
В статье также попадаются колоритные и сильные выражения русского языка. С этим я ничего делать не намерен, читается интереснее и живее, а благородных девиц я прошу вернуться обратно в монастырь.
Зачем?
Короткий ответ: потому что мы можем.
Развёрнутый же ответ подразумевает выяснение политических взглядов оппонента, его отношению к копирайту, seo, продаже его личных данных и данных его родственников, аргументу "мне нечего скрывать", и тому подобных вещей. Долго, нудно, достаточно заковыристо и строго индивидуально.
Конкретные цели: время жизни девайса близкое к максимально возможному, список программ, помещающийся на один экран, и некая степень приватности данных. Нет, я не хочу делиться ими ни с кем. Ecto gammat!
Как?
Распространённое мнение о жручести андроид-девайсов - на самом деле полуправда. Если пользоваться коробочной версией и повключать все внешние средства связи - естественно батарейка будет улетать в момент. Не последнюю роль в этом играет предустановленный софт. Поэтому - в первую очередь нужно его проредить от совсем уж говнософта, который не даёт телефону спать. А во вторую - от того, чем мы пользоваться не собираемся.
Всё это "добро" как правило находится на системном разделе и так просто его удалить не получится. Некоторые вендоры предусматривают процедуру отключения "защиты от дурака". Другим приходится "помогать" в излечении от излишней заботы о пользователе.
Чтобы таки получить полный контроль над устройством, нам нужен как минимум доступ суперпользователя (root). А как максимум - разлочка загрузчика (bootloader). Второе позволяет ставить сторонние прошивки и ядра.
Для данного девайса я решил ограничиться первым пунктом, поскольку других прошивок под него нет, а собирать её самому - значит потратить порядочно времени с сомнительным результатом. Не мой профиль, проще говоря.
Бинарник su и управление доступом
В android'е, su - это нечто большее, чем "спросить пароль, выдать доступ". Здесь оно занимается ещё и логами (в sqlite), и ещё черте чем. Далее, каждая программа норовит впихнуть свой собственный бинарник, который уникален и неповторим.
- superuser (старый), версии 3.X.X
Иконка - зелёная голова-полусфера андроида, с повязкой на одном глазу. /system/xbin/su --version
сообщает нам что-то вроде "3.0.3.2"
На моём девайсе - не заработал. Ошибка достаточно расплывчатая:
WARNING: generic atexit() called from legacy shared library
Permission denied
- superuser (новый), версии 1.X.X.X
Иконка - голубой квадрат с белым '#' на переднем плане. !!! opensource /system/xbin/su --version
сообщает нам что-то вроде "16 com.koushikdutta.superuser"
Иконка - жёлтый "брыльянт" с коричневым '#' на переднем плане (в старых версиях). В новых - что-то стилизированное под супермена.
Пользоваться не приходилось, поэтому ничего не скажу. Но судя по наличию pro-версии - те ещё фрукты-авокады.
Немного о бестиарии рутовалок
Небольшой обзор способов рутования андроидов, выпущенных несознательными вендорами.
- ломалка компьютерная
Как правило виндовая программа, в комплекте с базой телефонов и набором эксплоитов. Исходники - как правило отсутствуют, эффективность - от полного 0 до 90%. Под полным нулём понимается банальный троян, даже без попыток что-то сделать с телефоном. Как правило, такие викинги долго не живут, но при выходе очередной "новой, пока неломаемой версии" могут забрасываться на форумы в рассчёте на жадного полуграмотного лоха.
Выделяется подвид "облачных", могущих сливать информацию напрямую в интернет. Притом, как ожидаемую - "модель устройства, окружение, результат операции", так и приватную. :-)
Размер - от 5 до 150мб, в зависимости от комплектации и требования онлайна. Последствия для девайса - непрогнозируемы, при закрытых исходниках. Может и только рут получить, может и рекламы в довесок навешать, может и попробовать прошить что-то кривое, с последующим окирпичиванием.
Предствители: kingroot
- ломалка "стелефонная"
Принцип тот же, что и выше, но оформлено в виде apk. Эффективность - от того же нуля до 60%, из-за ограничений на размер, что может выливаться в отсутствие любой эвристики, сокращённым набором эксплоитов и т.д.
Пример: baiduroot
В этом случае на девайс как правило ставятся всякие довески, из серии "ускоритель интернета на 300%". Зачастую, интерфейс - на китайском, если повезёт - найдёте серию скринов, с детальным описанием на какие кнопки тыкать и в какой последовательности.
- эксплоит в чистом виде
Некий бинарник, эксплуатирующий уязвимость в ядре или системном окружении. Загружается на телефон и выполняется. Иногда содержит свой урезанный шелл.
Размер - как правило маленький, последствия для девайса: как правило безобидные, от кернелпаника/сегфолта ещё никто не умирал. Возможна установка трояна/руткита "в довесок".
Пример представителей этого семейства: zergrush, towelroot
- использование инженерной особенности
Для взлома используются штатные средства системы. Не используется "левых" бинарников, только adb под линукс, который можно собрать и руками.
Самый "чистый" способ из перечисленных, встречается редко. Последствия для девайса - зависят от кривизны рук, МНУ применяющего и понимания собственных действий.
Представители: doomlord
Краткая справка по adb
Общая последовательность действий такова:
- достаём/компиляем бинарник adb
- разрешаем отладку в настройках
- втыкаем девайс в комп
- запускаем adb в виде сервера, через который и пойдёт в дальнейшем вся работа (
./adb wait-for-device
)
Грабли первые: права на файл устройства в /dev/. Чинится а) выяснением, где конкретно висит устройство (lsusb), б/1) выставлением прав на него, или б/2) добавлением себя в нужную группу (не рекомендуется для разовой операции)
Грабли вторые: adb не может понять, что вот это устойство - таки сцуко андроид. Актуально для мелко- и среднесерийной китайчатины. Чинится так:
Bus 004 Device 002: ID 04b4:0033 Cypress Semiconductor Corp. Mouse
Bus 004 Device 003: ID 04d9:1603 Holtek Semiconductor, Inc. Keyboard
<...>
Bus 008 Device 002: ID 1f3a:1002
# ^^ -- ага, вот эти ребята. обратите внимание на отсутствие описания
# смотри, сцуко, вот оно!
mkdir -p ~/.android/
echo 0x1f3a >> ~/.android/adb_usb.ini
- работаем с устройством
./adb (shell|push|pull|remount|reboot) <...>
- прибиваем демона
./adb kill-server
- отсоединяем девайс
alltogether
# приготовления
./adb wait-for-device
./adb remount
# сносим всё предустанавливаемое ПО
./adb shell 'ls /system/preinstall'
./adb shell 'rm /system/preinstall/*.apk'
# чистим конюшни в системных приложениях
./adb shell 'ls /system/app'
./adb shell 'rm ...' # удаление одной или больше apk, см ниже, чем это грозит
# Superuser / gui
./adb push Superuser_1_0_3_0.apk /system/app/Superuser.apk
# этот бинарник вытащен из Superuser'а (не промахнитесь с архитектурой)
# P.S. я подозреваю, что этот шаг можно и пропустить, но не проверял
./adb push sh /system/xbin/su
./adb shell 'chmod 04755 /system/xbin/su'
./adb shell 'chown root.shell /system/xbin/su'
# busybox (опционально)
./adb push busybox /system/bin/busybox
./adb shell 'chmod 00755 /system/bin/busybox'
./adb shell 'chown root.shell /system/bin/busybox'
./adb shell '/system/bin/busybox --install -s /system/bin/'
#
./adb reboot
./adb kill-server
Удалить нельзя оставить
Ниже - список "до", "после" и "почему".
7143-HD.apk 7143-HD.apk # инструкция к девайсу
AdobeFlashPlayer.apk < # понятно
AdobeReader.apk < # понятно, есть более вменяемые читалки pdf'а
ApplicationsProvider.apk ApplicationsProvider.apk
BackupRestoreConfirmation.apk BackupRestoreConfirmation.apk
BasicDreams.apk < # перделка
Browser.apk < # огрызок, ff рулит
Calculator.apk Calculator.apk
Calendar.apk Calendar.apk
CalendarProvider.apk CalendarProvider.apk
CertInstaller.apk CertInstaller.apk
ChromeBookmarksSyncAdapter.apk < # нафиг гуглосервисы
ConfigUpdater.apk ConfigUpdater.apk
Contacts.apk Contacts.apk
ContactsProvider.apk ContactsProvider.apk
DefaultContainerService.apk DefaultContainerService.apk
DeskClock.apk DeskClock.apk
DownloadProvider.apk DownloadProvider.apk
DownloadProviderUi.apk DownloadProviderUi.apk
DrmProvider.apk < # нафиг гуглосервисы
Email.apk < # огрызок, нужна будет почта - поставлю k9-mail
Exchange2.apk < # MS-crap
FaceLock.apk < # на 0.3M камере, распознавание лиц, ага
FileExplore.apk FileExplore.apk # огрызок, но нужен при первой настройке
FusedLocation.apk FusedLocation.apk # ни в коем случае, см примечание [1] ниже
Galaxy4.apk Galaxy4.apk # судя по всему - тоже обои, не дочистил
Gallery2.apk Gallery2.apk
GmsCore.apk < # нафиг гуглосервисы
GoogleBackupTransport.apk < # нафиг гуглосервисы
GoogleCalendarSyncAdapter.apk < # нафиг гуглосервисы
GoogleContactsSyncAdapter.apk < # нафиг гуглосервисы
GoogleFeedback.apk < # нафиг гуглосервисы
GoogleLoginService.apk < # нафиг гуглосервисы
Google_maps.apk < # нафиг гуглосервисы
GooglePartnerSetup.apk < # нафиг гуглосервисы
GoogleServicesFramework.apk < # нафиг гуглосервисы
GoogleTTS.apk < # нафиг гуглосервисы
HoloSpiralWallpaper.apk < # перделка
HTMLViewer.apk HTMLViewer.apk # нужен, см. примечание [2]
InetService.apk InetService.apk
InetUpdate.apk < # сам обновлю когда надумаю, пнх
InputDevices.apk InputDevices.apk
KeyChain.apk KeyChain.apk
LatinImeDictionaryPack.apk LatinImeDictionaryPack.apk
LatinImeGoogle.apk LatinImeGoogle.apk # ни в коем случае: клавиатура
Launcher2.apk Launcher2.apk # ни в коем случае: "рабочий стол"
LiveWallpapers.apk < # жрёт батарейку
LiveWallpapersPicker.apk < # раз нет обоев - тоже не нужен
MagicSmokeWallpapers.apk < # жрёт батарейку
MediaProvider.apk MediaProvider.apk
MediaUploader.apk < # куда, блеать?!
Music2.apk < # огрызок
MusicFX.apk < # сканирует карту на любой чих, пиздец батарейке
NetworkLocation.apk NetworkLocation.apk
NoiseField.apk < # перделка
OneTimeInitializer.apk OneTimeInitializer.apk
PackageInstaller.apk PackageInstaller.apk
PhaseBeam.apk < # перделка
Phone.apk Phone.apk
Phonesky.apk < # нафиг гуглосервисы
PhotoTable.apk PhotoTable.apk
Settings.apk Settings.apk
SettingsProvider.apk SettingsProvider.apk
SetupWizard.apk SetupWizard.apk
SharedStorageBackup.apk SharedStorageBackup.apk
Skype.apk < # MS-crap
SoftWinnerService.apk < # vendor-crap
SoundRecorder.apk SoundRecorder.apk
SpeechRecorder.apk SpeechRecorder.apk
SystemUI.apk SystemUI.apk
Talk.apk < # нафиг гуглосервисы
Talkback.apk < # нафиг гуглосервисы
TelephonyProvider.apk TelephonyProvider.apk
UserDictionaryProvider.apk UserDictionaryProvider.apk
VisualizationWallpapers.apk VisualizationWallpapers.apk
VoiceSearchStub.apk < # нафиг гуглосервисы
VpnDialogs.apk VpnDialogs.apk
WAPPushManager.apk WAPPushManager.apk
Web-RF.apk < # яндекс-crap
- [1] во всех версиях 4.X, кроме 4.2 - эта фигня занимается определением приблизительного местоположения устройства. НО! в 4.2 - это ремаппер путей типа: /mnt/extsd -> /sdcard. Короче, удалите - получите бесконечный ребут. Я вот на эти грабли благополучно наступил. :-)
- [2] видел новость об уязвимости в похожем компоненте, в ключе «поскольку %дарасы-вендоры не обновляют прошивки старых моделей, эта уязвимость останется навсегда»
Зомби
Итак, после манипуляций из предыдущего пункта, я получил полуживой девайс. Самое время прочитать инструкцию "READ THIS FIRST" и немного пораскинуть мозгами.
# ./files/adb get-state
device
Ага, отлично, жив, но до конца не загружается.
# ./adb logcat
Видим упоминания 'fused', соображаем, что что-то пошло не так, и припоминаем файл 'FusedLocation.apk'.
Поскольку удаления приложений проводились итеративно, есть бэкапы части этих apk'шек. (бэкапилось через adb pull + bash, и на каком-то этапе мне стало лениво копипастить имена в bash'евский 'for').
Сходил на сайт "вендора", нашёл одну-единственную прошивку для этой модели, выложенную на яндекс-диск(!). Немедленно скачал и заныкал в надёжное место на своём диске.
Теперь у нас есть выбор - попробовать её прошить, разобрать или поискать нужные/совместимые файлики по интернету.
От первого варианта я отказался сразу - неспортивно и в случае неудачи - запорем весь девайс полностью. Кроме того, я сильно не уверен, что это прошивка от "той" модели. Ну бывает, чо. Раз уж додумались положить её на яндекс-диск, может и такое быть.
От третьего варианта - тоже, по итогам получасовой разведки ситуации на 4pda. Характеристика, данная выше - оказалась удивительно точной, именно "мелкосерийная".
Значит будем играть в дохтура, а точнее - в патологоанатома.
Разбираем прошивку
Первая возникшая мысль - подцепить прошивку как блочное устройство и поискать на ней сигнатуры разделов fat/ext[234]. Вдруг не стали муд ...рствовать в этот раз.
# losetup -f 7143.img
# losetup -a
# fdisk -l /dev/loop0
...mbr-разделов нету. Ну ладно, у нас же всё-таки arm, там скорее всего и не должно быть, попробуем testdisk.
Disk /dev/loop0 - 524 MB / 500 MiB - CHS 1025099 1 1
Partition Start End Size in sectors
>P FAT16 2902 265045 262144
...что-то нашёл, посмотрим что именно.
P FAT16 2902 265045 262144
Directory /
.
>drwxr-xr-x 0 0 0 1-Jan-1980 00:00 bat
-rwxr-xr-x 0 0 57656 1-Jan-1980 00:00 bootlogo.bmp
-rwxr-xr-x 0 0 344813 1-Jan-1980 00:00 font24.sft
-rwxr-xr-x 0 0 357443 1-Jan-1980 00:00 font32.sft
-rwxr-xr-x 0 0 512 1-Jan-1980 00:00 magic.bin
-rwxr-xr-x 0 0 37680 1-Jan-1980 00:00 script.bin
-rwxr-xr-x 0 0 37680 1-Jan-1980 00:00 script0.bin
Ага, что-то есть, но явно мало. Прошивка-то > 400мб, а тут - жалкие килобайты. Значит одно из 2х - или testdisk лажает, или таки всё как обычно - луковица.
Лезем в интернет, читать о том как здесь правильно готовить прошивку: 1.
В процессе находим вот этот проектик, компиляем его и натравливаем на прошивку. На выходе получается такой список файлов:
COMMON _SYS_CONFIG100000.hdr COMMON _SYS_CONFIG100000
COMMON _SYS_CONFIG_BIN00.hdr COMMON _SYS_CONFIG_BIN00
COMMON _SPLIT_0000000000.hdr COMMON _SPLIT_0000000000
COMMON _SYS_CONFIG000000.hdr COMMON _SYS_CONFIG000000
BOOT _BOOT0_0000000000.hdr BOOT _BOOT0_0000000000
12345678_1234567890BOOT_0.hdr 12345678_1234567890BOOT_0
12345678_UBOOT_0000000000.hdr 12345678_UBOOT_0000000000
FES _FES_1-0000000000.hdr FES _FES_1-0000000000
PXTOOLSB_XXXXXXXXXXXXXXXX.hdr PXTOOLSB_XXXXXXXXXXXXXXXX
UPFLYTLS_XXXXXXXXXXXXXXXX.hdr UPFLYTLS_XXXXXXXXXXXXXXXX
UPFLTL32_XXXXXXXXXXXXXXXX.hdr UPFLTL32_XXXXXXXXXXXXXXXX
12345678_1234567890CARDTL.hdr 12345678_1234567890CARDTL
12345678_1234567890SCRIPT.hdr 12345678_1234567890SCRIPT
12345678_1234567890___MBR.hdr 12345678_1234567890___MBR
12345678_1234567890DLINFO.hdr 12345678_1234567890DLINFO
RFSFAT16_BOOTLOADER_FEX00.hdr RFSFAT16_BOOTLOADER_FEX00
RFSFAT16_VBOOTLOADER_FEX0.hdr RFSFAT16_VBOOTLOADER_FEX0
RFSFAT16_ENV_FEX000000000.hdr RFSFAT16_ENV_FEX000000000
RFSFAT16_VENV_FEX00000000.hdr RFSFAT16_VENV_FEX00000000
RFSFAT16_BOOT_FEX00000000.hdr RFSFAT16_BOOT_FEX00000000
RFSFAT16_VBOOT_FEX0000000.hdr RFSFAT16_VBOOT_FEX0000000
RFSFAT16_SYSTEM_FEX000000.hdr RFSFAT16_SYSTEM_FEX000000
RFSFAT16_VSYSTEM_FEX00000.hdr RFSFAT16_VSYSTEM_FEX00000
RFSFAT16_RECOVERY_FEX0000.hdr RFSFAT16_RECOVERY_FEX0000
RFSFAT16_VRECOVERY_FEX000.hdr RFSFAT16_VRECOVERY_FEX000
RFSFAT16_DISKFS_FEX000000.hdr RFSFAT16_DISKFS_FEX000000
...уже что-то. Обозначению 'RFSFAT16' - не верьте, оно пиз###ит, на самом деле там особым образом™ упакованная ext4. Чтобы его сконвертировать в нормальный образ, нам понадобятся исходники отсюда И дописанные каким-то добрым человеком: здесь.
$ simg2img RFSFAT16_SYSTEM_FEX000000 > test.bin
# losetup -f test.bin
# losetup -a
# mount -r /dev/loop1 /mnt/src
...отлично, достаём все файлы из /system/app/. И закидываем наиболее подозрительные обратно на устройство.
# ./files/adb wait-for-device
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
# ./files/adb push ./FusedLocation.apk /system/app/FusedLocation.apk
failed to copy 'FusedLocation.apk' to '/system/app/FusedLocation.apk': Read-only file system
# ./files/adb remount
remount succeeded
# ./files/adb push ./FusedLocation.apk /system/app/FusedLocation.apk
174 KB/s (9232 bytes in 0.051s)
# ./files/adb reboot
...после чего девайс загружается полностью. Легко отделались, вобщем-то.
Идём дальше
Это всё лирика, но по пути к первоначальной цели "сделать девайс маложрущим и юзабельным", мы дали достаточно большой крюк. Как говорил дедушка Ленин, в "пеrвую очередь, товаrищи, захватывайте телегrаф и почту!"
- DroidWall
- F-Droid
И через F-Droid ставится всё остальное:
- Barcode scanner
- CalDav sync
- CoolReader
- cSipSimple
- Document Viewer
- ES FileManager
- Firefox
- jTalk
- notes
- wake-on-lan
- XBMC remote
В настройках чистим "администраторов устройства" (ничего быть не должно, но мало ли), выключаем геолокацию и фоновые данные.
После этого, девайс готов к базовому использованию.
Если захотелось повторить
Если вы будете выбирать себе планшет, и смотреть этот, перечислю то, чем он мне НЕ понравился. Возможно, сумею разубедить.
На поддержку от производителя я бы рассчитывать не стал.
- Во-первых, нужно ещё найти сервисный, который за это чудо-юдо возьмётся.
- Во-вторых, они скорее всего тупо отправят его "на замену", это от 2х недель до 2х месяцев ожидания.
- В-третьих, через год вы можете обнаружить, что такой фирмы уже нет в природе.
Это, вобщем-то, справедливо для всех "китайцев". Чисто технические недостатки:
- включение/громкость сделаны "под левую руку".
- нет отдельного входа для зарядки. Сжечь/расшатать/оторвать usb - достаточно просто.
- глянцевый, сука, задник. Залапывается просто в момент.
- нет стерео