Så här Dissecter du en Android-applikation

Det är allmänt känt att Android-appar distribueras i form av Android Application Package filer eller APK-filer för korta. Men de flesta tittar på en APK som en svart låda och har ingen aning om hur den är skapad eller vad som är inne i den. Även de flesta apputvecklare har bara en ytlig förståelse för en APKs anatomi. I integrerade utvecklingsmiljöer, till exempel Android Studio, krävs bara ett enda klick för att omvandla ett Android-projekt till en APK.

I denna handledning kommer vi att dissekera en Android-app. Med andra ord ska vi öppna APK och ta en titt på innehållet. Dessutom, för att en APK är en binär fil som endast är avsedd att läsas av maskiner, kommer jag också att presentera dig för några verktyg du kan använda för att översätta innehållet till en mer läsbar form.

förutsättningar

För att följa med, behöver du:

  • den senaste versionen av Android SDK
  • en Android-enhet eller emulator som kör Android 4.4 eller senare

1. Varför titta inuti en APK?

Många människor gör det av ren nyfikenhet. Andra har möjlighet att direkt komma åt bilder, ljud och andra tillgångar i deras favoritspel eller appar. Det finns dock fler viktiga skäl till varför du vill se inuti en APK.

Inlärning

Om du just har börjat lära sig Android apputveckling finns det mycket du kan lära dig genom att titta in i APK-filer av populära appar eller appar som skapats av proffs. Om du till exempel tittar på XML-layoutfilerna i en app som ser bra ut på flera skärmstorlekar, kan du förbättra dina egna layoutkompetens.

säkerhet

Apps som laddas ner från otillförlitliga källor kan innehålla skadlig kod. Om du redan är en skicklig apputvecklare, genom att demontera sådana appar, kan du titta på deras kod för att få en bättre förståelse för vad de verkligen gör under huven.

2. Hur skapas en APK?

Det finns inte mycket du kan lära av en APK utan en grundläggande förståelse för hur den skapas. Faktum är att de viktigaste verktygen som används för att dissekera en APK är de verktyg som används för att skapa en.

Android-projekt består i första hand av Java-källkod, XML-layouter, XML-metadata och tillgångar, till exempel bilder, videoklipp och ljud. Innan Android-operativsystemet kan använda alla dessa filer måste de konverteras till ett formulär som det förstår. Denna omvandling innebär många mellanliggande uppgifter, som vanligtvis kallas Android-byggprocessen. Den slutliga utmatningen av byggprocessen är en APK eller Android Application Package.

I Android Studio-projekt hanterar Android Plugin for Gradle alla mellanliggande uppgifter i byggprocessen.

En av de första viktiga uppgifterna är att generera en fil som heter R.java. Det här är filen som låter utvecklare enkelt komma åt projektets layout och dragbara resurser i deras Java-kod med hjälp av numeriska konstanter. För att generera filen kallas ett verktyg aapt, vilket är förkortat Android-förpackningsverktyg, är använd. Verktyget konverterar också alla XML-resurser, tillsammans med projektets manifestfil, till ett binärt format.

Alla Java-filer, inklusive R.java, konverteras sedan till klassfiler med hjälp av Java-kompilatorn. Som du kanske redan vet består klassfiler av bytecode, vilket kan tolkas av en Java runtime-motor. Men Android använder en speciell typ av runtime som heter Android runtime (ART), som är optimerad för mobila enheter. Därför, när alla klassfiler har genererats, kallas ett verktyg dx används för att översätta bytekoden till Dalvik bytecode, ett format som ART förstår.

När resurser och Java-filer har bearbetats placeras de i en arkivfil som mycket liknar en JAR-fil. Arkivfilen skrivs sedan under, med en privat nyckel som tillhör apputvecklaren. Dessa två operationer utförs av Gradle-plugin utan att använda några externa verktyg. Utvecklarens nyckel uppnås emellertid från en nyckelbutik som hanteras av keytool.

Slutligen görs några optimeringar till arkivfilen med hjälp av zipalign verktyg för att se till att minnet som appen förbrukar under körning hålls till ett minimum. Vid denna tidpunkt är arkivfilen en giltig APK, som kan användas av Android-operativsystemet.

3. Analysera innehållet i en APK

Nu när du förstår hur APK-filer skapas och används, låt oss öppna en och titta på innehållet. I den här handledningen använder vi APK för en app som heter Prov Soft Keyboard, som kommer förinstalleras på Android-emulatorn. Om du föredrar att använda en fysisk enhet kan du dock lika enkelt använda APK för alla appar som du har installerat på den.

Steg 1: Överföring av APK till en dator

För att undersöka innehållet i APK måste du först överföra det från emulatorn till din dator. Innan du gör det måste du veta APK: s paketnamn och den absoluta vägen. Använda sig av aDB att öppna en skalsession på din emulator.

adb skal

När du väl ser shellprompten använder du pm lista kommandot för att lista paketnamnen på alla installerade appar.

pm listpaket

Paketnamnet på den app som vi är intresserade av är com.example.android.softkeyboard. Du borde kunna se den i listan. Genom att skicka paketets namn till pm-banan kommando kan du bestämma APK: s absoluta sökväg.

pm-sökväg com.example.android.softkeyboard

Utsignalen från ovanstående kommando ser så här ut:

paket: /data/app/SoftKeyboard/SoftKeyboard.apk

Nu när du vet sin väg kan du lämna skalet och överföra APK till din dator med hjälp av adb dra kommando. Kommandot nedan överför det till datorns / tmp katalogen:

adb dra /data/app/SoftKeyboard/SoftKeyboard.apk / tmp

Steg 2: Utdragning av innehållet i APK

Tidigare i denna handledning lärde du dig att en APK är ingenting annat än en komprimerad arkivfil. Det innebär att du kan använda operativsystemets standardarkivhanterare för att extrahera innehållet. Om du använder Windows kanske du först måste ändra filens förlängning från .APK till .blixtlås. Efter att ha extrakt innehållet i APK bör du kunna se filerna i APK.

Om du är en apputvecklare, borde många filer i APK kännas bekanta. Men förutom bilderna i res mappen är filerna i ett format som du inte kan arbeta med utan hjälp av några verktyg.

Steg 3: Dekryptering av binära XML-filer

Android SDK innehåller alla verktyg du behöver för att analysera innehållet i en APK. Du lärde dig det tidigare aapt används för att paketera XML-resurser under byggprocessen. Det kan också användas för att läsa mycket information från en APK.

Till exempel kan du använda dess dump xmltree möjlighet att läsa innehållet i en binär XML-fil i APK. Så här kan du läsa en layoutfil som heter res / layout / input.xml:

aapt dump xmltree /tmp/SoftKeyboard.apk res / layout / input.xml

Utgången ska se ut så här:

N: android = http: //schemas.android.com/apk/res/android E: com.example.android.softkeyboard.LatinKeyboardView (linje = 21) A: android: id (0x010100d0) = @ 0x7f080000 A: android: layout_width (0x010100f4) = (typ 0x10) 0xffffffff A: android: layout_height (0x010100f5) = (typ 0x10) 0xfffffffe A: android: layout_alignParentBottom (0x0101018e) = (typ 0x12) 0xffffffff

Det är inte XML, men tack vare indryck och etiketter som N för namespace, E för element, och en För attribut ska du kunna läsa den.

Steg 4: Dekryptera strängar

I föregående steg såg du att den dechiffrerade XML har hexadecimala tal istället för strängar. Dessa nummer är hänvisningar till strängar i en fil som heter resources.arsc, som representerar resurs tabellen för appen.

Du kan använda dump resurser möjlighet till aapt för att visa resurs tabellen. Här är hur:

aapt dump - värderar resurser /tmp/SoftKeyboard.apk

Från utgången av kommandot kan du bestämma de exakta värdena för strängarna som används i appen. Här är posten för ett av de hexadecimala talen i XML:

resurs 0x7f080000 com.example.android.softkeyboard: id / tangentbord: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)

Steg 5: Demontering av Dalvik Bytecode

Den viktigaste filen i APK är classes.dex. Det här är filen som används av Android runtime medan appen körs. Den innehåller Dalvik bytecode genererad under byggprocessen.

Genom att demontera den här filen kan du få information om de Java-klasser som används i appen. För att göra det kan du använda ett verktyg som heter dexdump. Med följande kommando kan du omdirigera produktionen av dexdump till en fil som kan öppnas av någon textredigerare.

dexdump -d /tmp/classes.dex> /tmp/classes.dasm

Om du öppnar classes.dasm, du kommer att se att det har hundratals linjer med lågnivåkod som ser ut så här:

Det är självklart att förstå det är väldigt svårt. Tack och lov kan du ändra utmatningsformat för dexdump till XML med hjälp av -l alternativ. Med följande kommando kan du omdirigera dess utdata till en fil som du kan öppna i en webbläsare.

dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml

Mängden information som finns i XML-formatet är mindre, men det ger dig en rättvisande bild om de Java-klasser, metoder och fält som finns i appen.

Slutsats

I denna handledning lärde du dig hur en APK skapas och vad den innehåller. Du lärde dig också använda verktygen i Android SDK för att dechiffrera innehållet i APK-filer. Det finns inte mycket dokumentation om dessa verktyg, men eftersom de är öppna källor kan du försöka läsa deras omfattande kommenterade källkod för att lära sig mer om dem.

Om du letar efter något lättare att arbeta med kan du försöka använda populära verktyg från tredje part som dex2jar, vilket genererar mer läsbar demonterad kod, eller JADX, en dekompiler som kan generera Java-kod.