Журнал LinuxFormat - перейти на главную

LXF157:Android и Motorola

Материал из Linuxformat
Версия от 05:42, 22 июля 2018; Olkol (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск


Как отстоять права root: внедрим теорию в жизнь

Android и Motorola

Алек­сандр Хрю­кин де­лит­ся лич­ным опы­том об­хо­да ти­вои­за­ции в те­ле­фо­не на ба­зе опе­ра­ци­он­ной сис­те­мы Android.


Ти­вои­за­ция – это когда вен­дор занима­ет­ся при­вяз­кой кон­крет­ной вер­сии соф­та к же­лез­кам уст­рой­ст­ва. По­доб­ные ог­раничения не по­зво­ля­ют мо­ди­фи­ци­ро­вать софт или по­зво­ля­ют это де­лать толь­ко в ог­раничен­ных пре­де­лах. [Тер­мин «ти­вои­за­ция» скон­ст­руи­ро­вал Ри­чард Стол­лмен из на­звания ком­пании TiVo, ко­то­рая при­менила ПО, ли­цен­зи­ро­ван­ное под GPL, на сво­их циф­ро­вых ви­део­магнито­фо­нах, ап­па­рат­но бло­ки­ро­вав, од­на­ко, воз­мож­ность мо­ди­фи­ци­ро­вать ПО, – прим. ред.]

Что де­лать, ес­ли вен­дор вы­пустил те­ле­фон, но не хо­чет вы­пускать ап­дей­ты к нему?

В про­шлом го­ду я ку­пил непло­хой та­кой те­ле­фон от ком­пании Motorola c Android под ка­по­том, это был уже мой вто­рой де­вайс.

Ка­кое-то вре­мя ме­ня все уст­раи­ва­ло, но Google име­ет похвальное свой­ст­во вы­пускать обновления одно за дру­гим и в доста­точ­но ко­рот­кий срок, и что са­мое важ­ное – с доста­точ­но боль­ши­ми ко­ли­че­­ст­вен­ны­ми и ка­че­­ст­вен­ны­ми из­менения­ми, как в са­мом фрейм­вор­ке, так и в яд­ре Linux.

Мой же те­ле­фон был, что на­зы­ва­ет­ся, ти­вои­зи­ро­ван по са­мое не мо­гу, а ста­ло быть, об­нов­ления ему никоим образом не све­ти­ли.

За­чем это нуж­но кон­крет­но для те­ле­фо­нов со «сво­бод­ным» Android, мне несколь­ко неяс­но: на мой взгляд, Moto­rola пы­та­ет­ся ка­тить из го­да в год од­ну и ту же те­ле­гу, до­вер­ху на­би­тую под­лы­ми и уста­рев­ши­ми прие­ма­ми, ра­ди, яко­бы, «поль­зо­ва­тель­ской безо­пас­но­сти».

Итак, воо­ру­жив­шись ста­рым до­б­рым Vim, па­роч­кой ком­пи­ля­то­ров и git, я при­сту­пил к ко­вы­рянию в про­грамм­ных внут­рен­но­стях ап­па­ра­та под на­званием Motorola Charm MB502.

Сна­ча­ла сле­до­ва­ло от­де­лить от­кры­тые ком­понен­ты от про­прие­тар­ных ком­понен­тов или тех GPL-ком­понен­тов, для ко­то­рых ком­пания «за­бы­ла» от­крыть ис­ход­ные ко­ды.

А ес­ли очень хо­чет­ся по­ста­вить свою вер­сию опе­ра­ци­он­ной сис­те­мы, нуж­но при­ду­мать спо­соб, как ее за­ли­вать в NAND-па­мять уст­рой­ст­ва.

Во вре­мя раз­ра­бот­ки ин­женер мо­жет ра­бо­тать с NAND-чи­пом, на­при­мер, при по­мо­щи JTAG-ка­бе­ля, но я по­доб­ной роско­ши, в си­лу не за­ви­ся­щих от ме­ня при­чин (ти­вои­за­ция же по­всю­ду), не имел. Со­от­вет­ст­вен­но, оста­вал­ся един­ст­вен­ный спо­соб: ис­поль­зо­вать стан­дарт­ные сред­ст­ва опе­ра­ци­он­ной сис­те­мы, то есть recovery + Android Debug Bridge (ADB).

По­сле это­го мож­но под­клю­чить те­ле­фон USB-ка­бе­лем к ком­пь­ю­те­ру, вве­сти ко­ман­ду

adb shell

и по­пасть на­конец-то внутрь уст­рой­ст­ва.

Что­бы гу­лять по фай­ло­вой сис­те­ме даль­ше то­чек мон­ти­ро­вания ти­па /tmp, /sdcard/ и неболь­шо­го ку­соч­ка /data/, необ­хо­ди­мо по­лу­чить root-доступ.

Де­таль­но опи­сы­вать про­цесс не бу­ду, ска­жу лишь, что по­доб­ные про­грам­мы доступ­ны непо­сред­ст­вен­но в Android-мар­ке­те и яв­ля­ют­ся аб­со­лют­но бес­плат­ны­ми.

Ну вот, те­перь у ме­ня поя­ви­лась воз­мож­ность со­вер­шать лю­бые непо­треб­ст­ва с та­ки­ми раз­де­ла­ми, как /data (где хра­нят­ся лич­ные дан­ные, учет­ки, па­ро­ли и про­чее) и /system, где на­хо­дит­ся соб­ст­вен­но сам Android, то есть его фрейм­ворк, де­мо­ны и про­чие ра­до­сти де­фолт­ной мо­то­ро­лов­ской по­став­ки те­ле­фо­на.

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

На­при­мер, при пе­ре­хо­де с Android 2.1 на 2.3 ин­женеры Google внесли несколь­ко из­менений в яд­ро Linux, свя­зан­ных с шиф­ро­ванием, ну и в 2.3, конеч­но же, пе­ре­шли на но­вую ста­биль­ную вет­ку яд­ра 2.6.32.

Про­ис­хо­дит за­ме­на сле­дую­щим об­ра­зом: поль­зо­ва­тель за­пуска­ет­ся в ре­жим recovery – при по­мо­щи мас­те­ра об­нов­лений или со­от­вет­ст­вую­щей ком­би­на­ции кно­пок на уст­рой­ст­ве; даль­ше recovery в со­от­вет­ст­вии со скрип­том мо­жет са­мо­стоя­тель­но на­чать про­цесс об­нов­ления, ну или при­дет­ся ру­ка­ми вы­брать пункт “Update”.

В слу­чае с ти­вои­за­ци­ей же со­вер­шен­но невоз­мож­но про­шить что-то еще, кро­ме ап­дей­та, под­пи­сан­но­го клю­чом вен­до­ра, а ключ этот вы­да­ют толь­ко осо­бо из­бран­ным – и про­стым смерт­ным он недосту­пен. Взло­мать его то­же не очень получится: на бру­то­форс по­доб­ных под­пи­сей долж­но уй­ти вре­мя, сравнимое со вре­менем су­ще­ст­во­вания Все­лен­ной. По­иск клю­ча hash-collision в тео­рии дол­жен за­нять мень­ше вре­мени, но оно все рав­но зна­чи­тель­но доль­ше че­ло­ве­че­­ской жизни.

Итак, что­бы про­шить в NAND-па­мять пра­виль­ный ап­дейт, ну­жен recovery, ко­то­рый не про­ве­ря­ет ту за­вет­ную циф­ро­вую подпись.

Та­ких recovery на са­мом де­ле пол­но: в про­ек­те CyanogenMod ис­поль­зу­ет­ся ClockWork Recovery, го­да два на­зад бы­ли еще несколь­ко, но в ито­ге все сли­лись в еди­ный про­ект CyanogenMod.

Про­цесс ком­пи­ля­ции recovery в рам­ках этой ста­тьи я рас­смат­ри­вать не бу­ду, оста­но­вим­ся на этом как-нибудь в дру­гой раз. Сей­час же ва­жен спо­соб за­пуска но­во­го мо­ди­фи­ци­ро­ван­но­го recovery, ко­то­рое не про­ве­ря­ет под­пи­си.

На­ста­ло вре­мя на­помнить, что но­вое recovery за­пи­сать в Nand невоз­мож­но, по­то­му что за­груз­чик про­ве­ря­ет при стар­те сис­те­мы подпись раз­де­лом boot и, соб­ст­вен­но, са­мо­го recovery.

Зна­чит, нуж­но за­пускать с ка­ким-нибудь хит­рым косты­лем. По­ко­пав­шись весь­ма про­дол­жи­тель­ное вре­мя во внут­рен­но­стях опуб­ли­ко­ван­но­го Мо­то­ро­лой яд­ра, его кон­фи­га и фай­ло­вой сис­те­мы те­ле­фо­на, я об­на­ру­жил, что су­ще­ст­ву­ет дво­ич­ный файл под на­званием mot_boot_mode, и, что са­мое уди­ви­тель­ное, его за­пуска­ет непо­сред­ст­вен­но яд­ро.

Ис­ход­ный код би­нарника был за­крыт, но, на мое сча­стье, раз­мер ис­пол­няе­мо­го фай­ла был все­го 6 КБ, а во мне про­снул­ся та­лант ре­верс-ин­женера.

Файл был немед­лен­но ди­зас­семб­ли­ро­ван и пе­ре­пи­сан под сво­бод­ной ли­цен­зи­ей.

Суть про­грам­мы mot_boot_mode сво­ди­лась к сле­дую­ще­му: при стар­те сис­те­мы за­пуска­ет­ся про­грам­ма, даль­ше она чи­та­ет файл /proc/bootinfo и спра­ши­ва­ет у него: «А че­го ж мне яд­ро ту­да по­на­пи­са­ло и что же де­лать?» И в со­от­вет­ст­вии с со­дер­жи­мым вы­пол­ня­ет па­роч­ку команд, ко­то­рые за­пуска­ют или не за­пуска­ют Android.

Итак, ре­ше­но, бу­ду за­пускать но­вое recovery при по­мо­щи этой шту­ко­ви­ны.

При­мер­но за час я до­пи­сал еще неболь­шую часть ко­да, суть ко­то­рой сво­ди­лась к то­му, что при су­ще­ст­во­вании фай­ла /data/.recovery_mode mot_boot_mode оста­но­вит за­груз­ку Android, раз­вернет ар­хив с recovery из раз­де­ла /cdrom, ко­то­рый я при­спо­со­бил под хранение но­во­го recovery, и соб­ст­вен­но за­пустит его.

Вот по­доб­ным нехит­рым спо­со­бом я смог за­пустить но­вое recovery, ко­то­рое об­ла­да­ет мас­сой пре­иму­ществ по сравнению со стан­дарт­ным, а имен­но:

  • воз­мож­ность со­хранения те­ку­ще­го об­раза те­ле­фо­на на кар­ту па­мя­ти;
  • ка­либ­ров­ка ба­та­реи;
  • уста­нов­ка zip-ар­хи­ва с кар­ты па­мя­ти;

и мно­же­ст­во дру­гих при­ят­ных ме­ло­чей.

Весь код легко раздобыть на сайте:

Персональные инструменты
купить
подписаться
Яндекс.Метрика