Vítám čtenáře, kteří sledují náš seriál o “hackování” Androidu. Minule jsme se prokousali přípravou prostředí, abychom se dnes mohli připojit k Androidu pomocí nástroje Android Debug Bridge (ADB).
Praktické příklady zkoušíme na emulovaném zařízení, a tak si na začátku ještě odskočíme k nástroji pro emulaci virtuálních zařízení.
Emulátor
Nemáme-li fyzické Android zařízení, použijeme emulátor a spustíme virtuální zařízení, které jsme si připravili pomocí správce – AVD.
Spuštění emulátoru bez parametrů způsobí chybu. Emulátor si stěžuje, že jsme nespecifikovali jméno zařízení, které se určuje řetězcem, který začíná zavináčem.
1 2 |
$ emulator emulator: ERROR: No AVD specified. Use '@foo' or '-avd foo' to launch a virtual device named 'foo' |
Spustíme emulátor s parametrem -help, sice dostaneme nápovědu na tři obrazovky, ale první volba by nás měla upoutat.
1 2 3 4 5 6 7 |
$ emulator -help Android Emulator usage: emulator [options] [-qemu args] options: -list-avds list available AVDs -sysdir <dir> search for system disk images in <dir> -system <file> read initial system image from <file> ... |
Volba “-list-avds” zobrazí dostupná Android zařízení, vytvořená přes správce AVD. Použijeme tento přepínač a zjistíme jména připravených zařízení k emulaci.
1 2 3 |
$ emulator -list-avds Nexus_5X_API_27_-_ProductionBuildWithGooglePlay Nexus_6P_API_27 |
Nastartujeme druhou konfiguraci s názvem “Nexus_6P_API_27”.
1 2 3 4 5 6 7 8 9 10 |
$ emulator @Nexus_6P_API_27 - Start Android Studio - Select menu "Tools > Android > SDK Manager" - Click "SDK Tools" tab - Check "Android Emulator" checkbox - Click "OK" emulator: INFO: boot completed .. objevi se graficke okno s emulovanym zarizenim |
Po startu emulátoru nám vyskočí grafické okno s emulovaným zařízením. Nyní se můžeme vrhnout na ADB.
ADB – Android Debug Bridge
Android Debug Bridge, zkráceně ADB, je nástroj, který slouží k základní komunikaci mezi vaší stanicí a Android zařízením. ADB zvládá připojení k více zařízením, bez ohledu na to, zda jsou fyzická nebo emulovaná. Připojení lze realizovat pomocí transportního protokolu TCP nebo přes USB kabel, v tomto případě musí mít Android zařízení zapnutou volbu “USB debugging”, kterou najdeme v systémovém nastavení v sekci “Developer options”.
Architektura
Architektura ADB se skládá z:
- adb serveru, který běží na pozadí na vašem hostitelském počítači.
- adb démonu (adbd) – proces běžící na pozadí Android zařízení, který vykonává příkazy adb klienta.
- adb klient – klientský proces přes který uživatel spouští příkazy. Zadané příkazy se pomocí adb serveru přepošlou na cílové mobilní zařízení, kde jej adb démon vykoná.
Toužíte-li znát další detaily o této architektuře, doporučuji prezentaci ADB (Android Debug Bridge): How it works od japonského vývojáře T.Kobayashiho.
Síťové spojení
V následujících příkladech se na linuxu připojujeme k emulovanému zařízení, kde jde vše jak po másle. Pokud byste se chtěli připojit k fyzickému Android zařízení, máte dvě možnosti jak na to:
- USB kabelem – v linuxu jen připojíte. V prostředí Windows potřebujete doinstalovat univerzální USB ovladač od Googlu.
- po síti pomocí TCP spojení a WiFi – instrukce k nastavení naleznete v dokumentaci k příkazu adb.
Nyní přejdeme k samotným ukázkám s ADB klientem.
ADB klient
ADB klienta (adb) spustíme stejnojmenným příkazem. Bez dalších parametrů dostaneme stručnou nápovědu. V dokumentaci k adb klientu, se můžeme dočíst o významu jednotlivých voleb. Pojďme si projít základní použití tohoto nástroje.
adb devices – seznam připojených zařízení
Seznam připojených zařízení, se kterými můžeme komunikovat, zjistíme přes parameter “devices”. Touto volbou ověříme, že ADB server vidí naše zařízení.
1 2 3 4 |
$ adb devices List of devices attached emulator-5554 device |
abd shell – vzdálený terminál
Připojit se vzdáleně k Androidu přes terminál pomocí volby “shell”, je jedna z nejzajímavějších funkcí.
1 2 3 |
$ adb shell generic_x86:/ $ id uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid) context=u:r:shell:s0 |
Po připojení jsme zadali linuxový příkaz id, který vypíše identitu uživatele, pod kterou vystupujeme na Android zařízení. Pro hacking experimenty potřebujeme práva uživatele root. Ukončíme relaci příkazem exit nebo pomocí zkratky CTRL+D a zkusíme restartovat adb démona s vyšším oprávněním.
adb root – vyšší oprávnění pro adb démona
Pokud jsme při vytváření virtuálního zařízení použili neprodukční build, je naše virtuální zařízení přístupné pod root účtem a můžeme restartovat adb démona s vyšším oprávněním pomocí volby “root”.
1 2 3 4 5 6 7 |
$ adb root restarting adbd as root $ adb shell generic_x86:/ # id uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid) context=u:r:su:s0 generic_x86:/ # |
Poznámka: Rootování fyzických zařízení je mimo možnosti tohoto článku. Pokud vás tato oblast zajímá, prozkoumejte fórum https://www.xda-developers.com/root. Rootování telefonu vede ke ztrátě záruky a vyřazuje jeho bezpečnostní mechanizmy.
adb install – instalace nové aplikace
Pro demonstraci si stáhneme úmyslně zranitelnou aplikaci DIVA, její APK balíček se nachází uvnitř tar archivu, který musíte nejdříve rozbalit. Pomocí příkazu adb install aplikaci nainstalujeme.
1 |
$ adb install ./diva-beta.apk |
Rychlím průzkumem Android zařízení zjistíme, že mezi dostupnými aplikacemi najdeme ikonu zeleného Androida s popiskem DIVA. Spustíme aplikaci, abychom se přesvědčili, že instalace proběhla úspěšně. Jak ukazuje následující obrázek, podařilo se.
adb shell pm list packages – seznam instalovaných aplikací
Následujícím příkazem si vypíšeme seznam existujících aplikací (balíčků).
1 2 3 4 5 6 7 |
$ adb shell pm list packages package:com.android.cts.priv.ctsshim package:com.google.android.youtube package:com.google.android.ext.services package:com.android.providers.telephony package:com.google.android.googlequicksearchbox ... |
Ze syntaxe vidíme, že se nejdříve zavolá adb shell a uvnitř příkazové příkaz “pm list packages”. Zkusíme si spustit adb shell a tento příkaz zavolat znovu.
1 2 3 4 5 6 7 |
$ adb shell generic_x86:/ # pm list packages package:com.android.cts.priv.ctsshim package:com.google.android.youtube package:com.google.android.ext.services package:com.android.providers.telephony ... |
Tímto jsme se dozvěděli, že jakýkoliv platný příkaz v systému Android můžeme volat přímo z konzole adb klienta ve formě “adb shell příkaz”.
Poznámka: “pm” je zkratka pro správce balíčků v Androidu, který eviduje všechny instalované aplikace, umožňuje instalaci APK balíčků včetně deinstalace.
Protože je seznam existujících aplikací dlouhý, pomůžeme si v linuxu zřetězením příkazů pomocí roury a vyfiltrujeme si balíčky, které obsahují slovo “diva”.
1 2 |
$ adb shell "pm list packages" | grep diva package:jakhar.aseem.diva |
Správce balíčků s filtrem “grep diva” nám našel jeden záznam a to aplikaci “jakhar.aseem.diva” (DIVA).
adb uninstall – deinstalace aplikace
Chceme-li z Androidu odinstalovat aplikaci a známe název jejího balíčku, zavoláme příkaz adb a specifikujeme název balíčku.
1 2 |
$ adb uninstall jakhar.aseem.diva Success |
adb logcat – přístup k systémovému logu
Android je postaven na jádře linuxu, a tak i zde najdeme analogii systémového logu. Pomocí příkazu logcat, který si můžeme zavolat i v shellu Androida, spustíme interaktivní výpis systémových zpráv. Kromě zpráv operačního systému zde najdeme i zprávy aplikací, které zde úmyslně logují.
1 2 3 4 5 6 7 8 9 10 |
$ adb logcat --------- beginning of system 05-08 19:17:41.109 1345 1345 I vold : Vold 3.0 (the awakening) firing up 05-08 19:17:41.109 1345 1345 V vold : Detected support for: ext4 vfat 05-08 19:17:41.119 1345 1353 D vold : Recognized experimental block major ID 253 as virtio-blk (emulator's virtual SD card device) 05-08 19:17:41.119 1345 1353 V vold : /system/bin/sgdisk 05-08 19:17:41.119 1345 1353 V vold : --android-dump 05-08 19:17:41.119 1345 1353 V vold : /dev/block/vold/disk:253,80 05-08 19:17:41.119 1345 1355 D vold : e4crypt_init_user0 .. |
adb push – přenos souboru do zařízení
Následující funkcionalita nám pomůže nakopírovat do Android zařízení libovolný soubor. Kromě souboru, který chceme kopírovat, musíme specifikovat existující cílovou cestu.
1 2 |
$adb push ./soubor.txt /data ./soubor.txt: 1 file pushed. 0.0 MB/s (10 bytes in 0.015s) |
Můžeme si přes adb shell ověřit, že se soubor skutečně uložil.
1 2 3 4 5 6 |
$ adb shell generic_x86:/ # cd /data generic_x86:/data # ls -al | grep soubor -rw-rw-rw- 1 root root 10 2018-05-08 20:31 soubor.txt generic_x86:/data # cat soubor.txt hackerlab |
adb pull – přenos souboru ze zařízení
Pokud bychom naopak chtěli zkopírovat soubor z Android zařízení do našeho počítače, použijeme volbu “pull” a cestu k souboru na zařízení, odkud se má zkopírovat.
1 2 3 4 5 6 7 |
$ adb pull /data/soubor.txt /data/soubor.txt: 1 file pulled. 0.0 MB/s (10 bytes in 0.040s) $ ls -ltr total 1484 -rw-r--r-- 1 user user 1502294 led 2 2016 diva-beta.apk .. -rw-r--r-- 1 user user 10 kvě 8 20:37 soubor.txt |
ADB klient podporuje řadu dalších zajímavých příkazů, ale pro základní použití a správný rozjezd je tato zásoba postačující. Tímto se blížíme k samotnému závěru příspěvku.
Závěr
V tomto díle jsme se zaměřili na ADB nástroj, který umožňuje komunikaic s Android zařízeními několika způsoby. Seznámili jsme se s jeho architekturou a základním použití pomocí příkazů adb klienta.
Pokud se vám článek líbil a máte komentáře a další tipy k tomuto tématu, zapojte se do diskuze k článku, kterou najdete na našem facebooku.