В кирпич и обратно

...или танцы вокруг одного девайса с андроидом с целью чистки от всякого разного и последующего обустройства по своему желанию.

В качестве подопытного кролика на сей раз выступает китаец '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аф и почту!"

И через F-Droid ставится всё остальное:

  • Barcode scanner
  • CalDav sync
  • CoolReader
  • cSipSimple
  • Document Viewer
  • ES FileManager
  • Firefox
  • jTalk
  • notes
  • wake-on-lan
  • XBMC remote

В настройках чистим "администраторов устройства" (ничего быть не должно, но мало ли), выключаем геолокацию и фоновые данные.

После этого, девайс готов к базовому использованию.

Если захотелось повторить

Если вы будете выбирать себе планшет, и смотреть этот, перечислю то, чем он мне НЕ понравился. Возможно, сумею разубедить.

На поддержку от производителя я бы рассчитывать не стал.

  • Во-первых, нужно ещё найти сервисный, который за это чудо-юдо возьмётся.
  • Во-вторых, они скорее всего тупо отправят его "на замену", это от 2х недель до 2х месяцев ожидания.
  • В-третьих, через год вы можете обнаружить, что такой фирмы уже нет в природе.

Это, вобщем-то, справедливо для всех "китайцев". Чисто технические недостатки:

  • включение/громкость сделаны "под левую руку".
  • нет отдельного входа для зарядки. Сжечь/расшатать/оторвать usb - достаточно просто.
  • глянцевый, сука, задник. Залапывается просто в момент.
  • нет стерео