Hlavní navigace

Hackujeme telefon s Google Android

11. 3. 2009
Doba čtení: 8 minut

Sdílet

V dnešním díle našeho seriálu o Google Android se společně podíváme na dění kolem odblokování T-Mobile G1. Ukážeme si také, jak zkompilovat a nahrát vlastní obraz systému, jak zálohovat nastavení telefonu a jak změnit statický i animovaný bootovací obrázek na našem odblokovaném telefonu.

Prolomení ochrany T-Mobile G1

Po slavnostním představení T-Mobile G1 v České republice nastalo velké zklamání. Jiná verze firmware znemožňovala získání absolutní kontroly nad telefonem v podobě rootovského přístupu. Jelikož stejným problémem trpí všechny evropské G1, rozhořelo se mnoho debat o tom, jak ochranu prolomit. Cílem bylo přimět telefon k změně firmware na americkou (RC29) nebo britskou (RC7) verzi. Tyto umožňují rootovský přístup poměrně snadno získat. Při hledání řešení se zkoušelo mnoho technik, ale žádná z nich nevedla k cíli. Až teprve nedávno došlo k zásadnímu obratu. Byla nalezena metoda, která umožňuje změnu firmware provést.

Celá metoda spočívá v tom, že se pomocí specializovaného nástroje QMAT upraví obsah SD karty tak, že se po nakopírování obrazu systému do základního adresáře SD karty a restartování telefonu odemkne BootLoader, který umožní provést aktualizaci systému z SD karty. Takto upravená karta je známa také pod názvem GoldCard.

QMAT je program pro MS Windows, a pro vytvoření GoldCard je navíc potřeba přístroj s Windows Mobile. Existuje však i postup, který umožňuje vytvořit GoldCard i pod Linuxem.

Tvůrci QMATu neměli z masového nasazení jejich aplikace moc velkou radost, a tak veřejně dostupnou verzi, která vytvoření GoldCard pro G1 umožňovala, odstranili a vydali novou limitovanou verzi, kde tato funkcionalita již není zadarmo. Pokud chcete telefon odblokovat s aktuální verzí QMATu, musíte si koupit registrovanou verzi v ceně 20 EUR. Podle tvůrců programu budou takto získané prostředky vynaloženy na nákup nového hardware pro testování.

Reakce na zpoplatnění QMATu byly různorodé. Pravdou je, že se najde mnoho uživatelů, kteří ani pořádně nevědí, co jim rootovský přístup přináší a chtějí mít svoji G1 hacknutou jen proto, aby byli „IN“. Samotní tvůrci QMATu zastávají názor, že by G1 měla být odblokována jen pro ty, kdo to opravdu potřebují.

Sestavení vlastního obrazu systému

Repositář

Jak bylo zmíněno v prvním díle našeho seriálu o Google Android, téměř všechny zdrojové kódy jsou dostupné v několika GIT repositářích. V těchto repositářích se nacházejí dvě větve. První z nich se nazývá master a obsahuje produkční verzi platformy Android. Druhá verze je testovací a nazývá se cupcake. Testovací větev sloužila k internímu vývoji v Google. V dnešní době je již nepoužívaná a pracuje se jen na větvi master. Ani v jedné větvi však nenaleznete aplikace s uzavřeným kódem (gmail, sync, calendar, maps, market, IM, mp3 store, …).

Nastavení

Předtím než začneme kompilovat, musíme nejdříve připravit prostředí pro stažení zdrojových kódu z GIT repositáře. Budeme předpokládat, že na vašem počítači je nainstalovaný program git.

Nejdříve si tedy vytvoříme naši GIT identitu:

$ git config --global user.email "jmeno@gmail.com"
$ git config --global user.name "Jmeno"

Následně vytvoříme adresář pro stažení všech zdrojových kódů příslušné větve a stáhneme si nástroj repo, který nám ulehčí práci s GIT repositářem.

$ mkdir ./myandroid
$ cd ./myandroid
$ wget http://android.git.kernel.org/repo
$ chmod 755 ./repo

Pokud chceme kompilovat větev master, použijeme následující příkaz:

$ ./repo init -u git://android.git.kernel.org/platform/manifest.git

V případě že chceme kompilovat větev cupcake, použijte tento příkaz:

$ ./repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

GIT repositář obsahuje zdrojové kódy pro kompilaci na více zařízení. Musíme proto nadefinovat, že chceme stáhnout veškeré kódy pro G1. Tato definice musí být uložena v souboru local_manifes­t.xml v adresáři .repo:

$ wget -O ./.repo/local_manifest.xml "http://source.android.com/documentation/building-for-dream/local_manifest.xml?attredirects=0"

V tomto okamžiku máme vše připravené ke stažení všech zdrojových kódů. Objem stahovaných dat je přibližně 2 GB.

$ ./repo sync

Kompilace

Ke zkompilování jsou ještě potřeba některé binární soubory, které ze smluvních důvodů nejsou součástí GIT repositáře. Můžeme si je však stáhnout přímo z našeho telefonu pomocí scriptu extract-files.sh v adresáři vendor/htc/dre­am/:

$ cd ./vendor/htc/dream/
$ ./extract-files.sh

Nakonec ještě vytvoříme soubor se specifikací, pro jaké zařízení budeme systém kompilovat:

$ cd ../../../
$ echo "TARGET_PRODUCT:=htc_dream" > ./buildspec.mk

Před samotnou kompilací se musíme ujistit, že máme na našem počítači nainstalované potřebné programy a knihovny. Na Ubuntu by mělo stačit nainstalovat následující balíky:

$ sudo apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

Jelikož většina platformy Android je napsána v Javě, je potřeba nastavit systémovou proměnnou používanou během kompilace:

$ export ANDROID_JAVA_HOME=$JAVA_HOME

Nyní máme vše připravené a můžeme spustit samotnou kompilaci:

$ make

Nahrání obrazu

Po úspěšném zkompilování nalezneme všechny výsledné obrazy v adresáři out/target/pro­duct/dream/. Abychom je mohli otestovat, musíme nejdříve vypnout telefon a znovu ho nastartovat do fastboot módu (CAM+POWER, BACK). K nahrání obrazů do telefonu slouží příkaz fastboot, který je součástí zkompilované větve master (adresář out/host/linux-x86/bin). Před nahráním obrazu je doporučeno provést zálohu (viz další část článku).

$ cd ./out/target/product/dream/
$ ../../../host/linux-x86/bin/fastboot flash system ./system.img
$ ../../../host/linux-x86/bin/fastboot flash boot ./boot.img

Po restartu telefonu by nám měl nastartovat námi zkompilovaný systém.

Komu se nechce procházet celým procesem vlastní kompilace a chce jen vyzkoušet poslední novinky z větve master, může si stáhnout již zkompilované obrazy. I k nahrání těchto obrazů bude potřeba soubor fastboot, který si ale můžete stáhnout již zkompilovaný.

Zálohování

Pokud máte v telefonu nainstalovaný recovery obraz od JesusFreek, pak máte k dispozici také zálohovací program NanDroid. Stisknutím kláves Alt+B v recovery módu (HOME+POWER při startu telefonu) se provede záloha všech částí paměti na SD kartu. Pro obnovení dat je potřeba veškerá zazálohovaná data přehrát na počítač. Samotné nahrání dat zpět do telefonu lze provést pomocí příkazu fastboot, jak bylo ukázáno v předchozím odstavci.

Úprava existujícího obrazu

Pokud chcete zkoumat nebo upravovat již sestavený obraz systému, musíte z něj nejdříve všechny soubory vybalit. Obraz systému je binární kopií obsahu paměti, je tedy nutné k dosažení cíle použít speciální nástroje. Pro rozbalení obrazu části disku se systémem (system.img), s daty (data.img) a keší (cache.img) slouží program unyaffs. Například rozbalení obsahu obrazu systému se provede následovně:

$ unyaffs ./system.img

V případě rozbalení obrazu paměti boot je situace komplikovanější. Nejedná se totiž o klasický souborový systém. Ze zdrojových kódů platformy Android lze vyčíst, že obraz boot se skládá celkem ze čtyř částí. První část je bootovací hlavička. Následuje obraz jádra a ramdisk. Ramdisk obsahuje soubory potřebné pro inicializaci systému. Za ramdiskem se nachází nepovinná část second stage. Podrobnější dokumentaci naleznete na android.git.ker­nel.org.

+-----------------+
| boot header     | 1 page
+-----------------+
| kernel          | n pages
+-----------------+
| ramdisk         | m pages
+-----------------+
| second stage    | o pages
+-----------------+

n = (kernel_size + page_size - 1) / page_size
m = (ramdisk_size + page_size - 1) / page_size
o = (second_size + page_size - 1) / page_size

Pro rozbalení obrazu boot je nutné použít script split_bootimg.pl:

$ ./split_bootimg.pl ./boot.img
Page size: 2048 (0x00000800)
Kernel size: 1388548 (0x00153004)
Ramdisk size: 141166 (0x0002276e)
Second size: 0 (0x00000000)
Board name:
Command line: no_console_suspend=1 console=null
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.

Tímto jsme získali obraz jádra a ramdisk. Ramdisk je ve standardním formátu který je vyžadován jádrem. Abychom mohli upravovat inicializační scripty v ramdisku, musíme jej nejdříve rozbalit:

$ mkdir ramdisk
$ cd ramdisk
$ gzip -dc ../boot.img-ramdisk.gz | cpio -i

Nyní máme obsah ramdisku v adresáři ramdisk, a můžeme provádět změny. Abychom mohli změny nahrát zpět do telefonu, musíme obraz boot složit opět dohromady. S tím nám pomohou příkazy mkbootfs a mkbootimg, které jsou součástí zkompilované větve master (adresář out/host/linux-x86/bin/):

$ mkbootfs ./ramdisk | gzip > ramdisk-new.gz
$ mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img

Upravený obraz se nahraje do telefonu takto:

$ adb push ./boot-new.img /sdcard/
$ adb shell
# cat /dev/zero > /dev/mtd/mtd2
# flash_image boot /sdcard/boot-new.img

Nutno podotknout, že pokud se něco nepovedlo, tak telefon nenabootuje. Pro ten případ je dobré mít na SD kartě poslední dostupný update (soubor update.zip) a v případě neúspěchu jej v recovery módu aplikovat (HOME+POWER, Alt+S).

Změna splashscreenu

Při spouštění telefonu se postupně zobrazují tři obrázky. První dva jsou statické a jsou zobrazeny při zavádění jádra. Třetí je animovaný a zobrazuje se při spouštění systému. Změna statického obrázku je poměrně jednoduchá. Pro vytvoření použijeme nástrojů z balíku ImageMagick a také některé nástroje vytvořené při kompilaci větve master.

Nejprve převedeme libovolný (v našem případě splash.png) obrázek do osmibitového neprůhledného RAW formátu:

$ convert -depth 8 splash.png rgb:splash.raw

Tím získáme soubor o velikosti přesně 460800 bytů. Tento soubor s daty obrázku je nutné převést do formátu, kterému rozumí framebuffer telefonu. K tomu použijeme příkaz rgb2565, který je součásti zkompilované větve master (adresář out/host/linux-x86/bin/).

$ rgb2565 < splash.raw > splash.raw565

Konverzí získáme soubor o velikosti přesně 307200 bytů. Velikost souboru je potřeba zkontrolovat ještě před jeho kopírováním do telefonu. Následně restartujeme telefon do fastboot módu (CAM+POWER, BACK), kde pomocí příkazu fastboot nahrajeme vytvořený obrázek do telefonu:

$ fastboot flash splash1 splash.raw565

A telefon restartujeme:

$ fastboot reboot

Po zapnutí telefonu bychom měli vidět námi vytvořený obrázek na obrazovce telefonu.

Nahradni logo

Možná náhrada loga T-Mobile G1 při startu telefonu

Obdobný postup platí i při vytváření druhého statického obrázku. Jediným rozdílem je postup jeho kopírování do paměti telefonu:

$ fastboot flash splash2 splash.raw565

Pokud vše funguje, jak má, můžeme ještě změnit animovaný obrázek. Animovaný obrázek není na rozdíl od statického nahrán přímo v paměti telefonu, ale je součástí systémové aplikace framework-res.apk. Jelikož se jedná o aplikaci napsanou v Javě, je celý soubor ZIP archivem. V tomto archivu je adresář /assets/images, kde se nalézají obrázky potřebné pro animaci (android_320×480­.png, boot_robot.png a boot_robot_glow­.png). Obrázky můžeme libovolně upravovat, musíme však zachovat jejich rozměry a formát. Samotnou animaci zajišťuje obrázek boot_robot_glow­.png, který se při startování periodicky objevuje a mizí. Standardní rozostřený obrys postavy Androida může být nahrazen například za ohnivé pozadí:

Ohnivý Android

Ohnivý Andoid (stáhněte si)

CS24_early

Samotné nahrazení obrázků provedeme například takto:

$ mkdir -p ./assets/images
$ cp ~/android_320x480.png ~/boot_robot.png ~/boot_robot_glow.png ./assets/images
$ adb pull /system/framework/framework-res.apk ./
$ zip -ru framework-res.apk ./assets/images/*
$ adb shell mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
$ adb push ./framework-res.apk /system/framework/

Nakonec bych rád poděkoval Davidu Bělohradovi za cenné připomínky a názory při psaní článků o Google Android.

Byl pro vás článek přínosný?