Hoe een Android-applicatie te ontleden

Het is algemeen bekend dat Android-apps worden gedistribueerd in de vorm van Android-applicatiepakket bestanden of APK-bestanden in het kort. De meeste mensen kijken echter naar een APK als een zwarte doos en hebben geen idee hoe deze is gemaakt of wat erin zit. Zelfs de meeste app-ontwikkelaars hebben slechts een oppervlakkig begrip van de anatomie van een APK. In geïntegreerde ontwikkelomgevingen, zoals Android Studio, volstaat een enkele klik om een ​​Android-project om te zetten in een APK.

In deze zelfstudie gaan we een Android-app ontleden. Met andere woorden, we gaan zijn APK openen en de inhoud bekijken. Omdat een APK een binair bestand is dat alleen bedoeld is om door machines te worden gelezen, introduceer ik u bovendien enkele hulpmiddelen die u kunt gebruiken om de inhoud te vertalen naar een meer menselijk leesbare vorm.

voorwaarden

Om mee te gaan, hebt u nodig:

  • de nieuwste versie van de Android SDK
  • een Android-apparaat of -emulator met Android 4.4 of hoger

1. Waarom in een APK kijken?

Veel mensen doen het uit pure nieuwsgierigheid. Anderen genieten van de mogelijkheid om rechtstreeks toegang te krijgen tot de afbeeldingen, geluiden en andere elementen van hun favoriete games of apps. Er zijn echter meer belangrijke redenen waarom je in een APK zou willen kijken.

Aan het leren

Als u net begonnen bent met het leren ontwikkelen van Android-apps, kunt u veel leren door in APK-bestanden te kijken van populaire apps of apps die zijn gemaakt door professionals. Als u bijvoorbeeld kijkt naar de XML-lay-outbestanden van een app die er op meerdere schermformaten goed uitziet, kunt u uw eigen vaardigheden voor het maken van lay-outs verbeteren.

Veiligheid

Apps gedownload van niet-vertrouwde bronnen bevatten mogelijk schadelijke code. Als je al een ervaren app-ontwikkelaar bent door dergelijke apps te demonteren, kun je naar hun code kijken om meer inzicht te krijgen in wat ze echt doen onder de motorkap.

2. Hoe is een APK gemaakt?

Je kunt niet veel leren van een APK zonder een basiskennis te hebben van hoe deze is gemaakt. In feite zijn de belangrijkste hulpmiddelen die worden gebruikt om een ​​APK te ontleden ook de hulpmiddelen die worden gebruikt om er een te maken.

Android-projecten bestaan ​​voornamelijk uit Java-broncode, XML-lay-outs, XML-metadata en items, zoals afbeeldingen, video's en geluiden. Voordat het Android-besturingssysteem al deze bestanden kan gebruiken, moeten deze worden geconverteerd naar een vorm die het begrijpt. Deze conversie omvat veel tussentijdse taken, die meestal het Android-buildproces worden genoemd. De uiteindelijke uitvoer van het bouwproces is een APK of Android-applicatiepakket.

In Android Studio-projecten verwerkt de Android-plug-in voor Gradle alle intermediaire taken van het bouwproces.

Een van de eerste belangrijke taken is het genereren van een bestand met de naam R.java. Dit is het bestand waarmee ontwikkelaars eenvoudig toegang kunnen krijgen tot de lay-out en tekenbare bronnen van het project in hun Java-code met behulp van numerieke constanten. Om het bestand te genereren, een tool genaamd aapt, wat een tekort is Android Asset Packaging Tool, is gebruikt. De tool converteert ook alle XML-bronnen samen met het manifestbestand van het project naar een binair formaat.

Alle Java-bestanden, inclusief R.java, worden vervolgens geconverteerd naar klassebestanden met behulp van de Java-compiler. Zoals u wellicht al weet, bestaan ​​klassenbestanden uit bytecode, die kunnen worden geïnterpreteerd door een Java runtime-engine. Android gebruikt echter een speciaal type runtime, Android-runtime (ART), dat is geoptimaliseerd voor mobiele apparaten. Daarom, als alle klassenbestanden zijn gegenereerd, wordt een tool genoemd dx wordt gebruikt om de bytecode te vertalen naar Dalvik bytecode, een formaat dat ART begrijpt.

Nadat de bronnen en Java-bestanden zijn verwerkt, worden ze in een archiefbestand geplaatst dat sterk lijkt op een JAR-bestand. Het archiefbestand wordt vervolgens ondertekend met een privésleutel die bij de app-ontwikkelaar hoort. Deze twee bewerkingen worden uitgevoerd door de Gradle-plug-in zonder externe hulpmiddelen te gebruiken. De sleutel van de ontwikkelaar wordt echter verkregen uit een sleutelarchief dat wordt beheerd door keytool.

Ten slotte worden een paar optimalisaties doorgevoerd in het archiefbestand met behulp van de zipalign tool om ervoor te zorgen dat het geheugen dat de app verbruikt tijdens het hardlopen tot een minimum wordt beperkt. Op dit punt is het archiefbestand een geldige APK, die kan worden gebruikt door het Android-besturingssysteem.

3. Analyse van de inhoud van een APK

Nu u begrijpt hoe APK-bestanden worden gemaakt en gebruikt, laten we er een openen en de inhoud ervan bekijken. In deze zelfstudie gebruiken we de APK van een app genaamd Voorbeeld van een zacht toetsenbord, die vooraf is geïnstalleerd op de Android-emulator. Als u echter liever een fysiek apparaat gebruikt, kunt u net zo gemakkelijk de APK gebruiken van elke app die u erop hebt geïnstalleerd.

Stap 1: De APK overbrengen naar een computer

Als u de inhoud van de APK wilt bekijken, moet u deze eerst van de emulator naar uw computer overbrengen. Voordat u dit doet, moet u de pakketnaam en het absolute pad van de APK weten. Gebruik adb om een ​​shell-sessie op uw emulator te openen.

adb shell

Zodra u de shell-prompt ziet, gebruikt u de pm lijst commando om de pakketnamen van alle geïnstalleerde apps weer te geven.

pm lijstpakketten

De pakketnaam van de app waarin we geïnteresseerd zijn, is com.example.android.softkeyboard. Je zou het in de lijst moeten kunnen zien. Door de pakketnaam door te geven aan de pm pad opdracht, kunt u het absolute pad van de APK bepalen.

pm path com.example.android.softkeyboard

De uitvoer van de bovenstaande opdracht ziet er als volgt uit:

pakket: /data/app/SoftKeyboard/SoftKeyboard.apk

Nu u het pad kent, kunt u de shell verlaten en de APK naar uw computer overbrengen met behulp van de adb pull commando. De onderstaande opdracht draagt ​​het over naar uw computer / tmp directory:

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

Stap 2: De inhoud van de APK extraheren

Eerder in deze zelfstudie hoorde u dat een APK niets anders is dan een gecomprimeerd archiefbestand. Dit betekent dat u de standaardarchiefbeheerder van uw besturingssysteem kunt gebruiken om de inhoud ervan te extraheren. Als u Windows gebruikt, moet u mogelijk eerst de extensie van het bestand wijzigen .apk naar .ritssluiting. Nadat u de inhoud van de APK hebt uitgepakt, moet u de bestanden in de APK kunnen zien.

Als u een app-ontwikkelaar bent, moeten veel van de bestanden in de APK er bekend uitzien. Afgezien van de afbeeldingen in de res map, de bestanden zijn in een indeling waar u niet mee kunt werken zonder de hulp van een paar hulpmiddelen.

Stap 3: Binaire XML-bestanden decoderen

De Android SDK bevat alle hulpmiddelen die u nodig hebt om de inhoud van een APK te analyseren. Dat heb je eerder geleerd aapt wordt gebruikt om XML-bronnen te verpakken tijdens het bouwproces. Het kan ook worden gebruikt om veel informatie van een APK te lezen.

U kunt bijvoorbeeld de dump xmltree optie om de inhoud van elk binair XML-bestand in de APK te lezen. U kunt als volgt een lay-outbestand lezen res / lay-out / input.xml:

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

De uitvoer zou er ongeveer zo uit moeten zien:

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

Het is geen XML, maar dankzij de inspringing en labels zoals N voor naamruimte, E voor element, en EEN voor attribuut zou je het moeten kunnen lezen.

Stap 4: Strings ontcijferen

In de vorige stap zag je dat de ontcijferde XML hexadecimale getallen heeft in plaats van strings. Die getallen zijn verwijzingen naar tekenreeksen in een genoemd bestand resources.arsc, die de resourcetabel van de app vertegenwoordigt.

U kunt de bronnen dumpen optie van aapt om de resourcetabel te bekijken. Hier is hoe:

aapt dump - waarden resources /tmp/SoftKeyboard.apk

Uit de uitvoer van de opdracht kunt u de exacte waarden bepalen van de strings die in de app worden gebruikt. Hier is de invoer voor een van de hexadecimale getallen in de XML:

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

Stap 5: Dalvik Bytecode demonteren

Het belangrijkste bestand in de APK is classes.dex. Dit is het bestand dat wordt gebruikt door de Android-runtime tijdens het uitvoeren van de app. Het bevat de Dalvik bytecode gegenereerd tijdens het bouwproces.

Door dit bestand uit elkaar te halen, kunt u informatie krijgen over de Java-klassen die in de app worden gebruikt. Om dit te doen, kunt u een tool gebruiken genaamd dexdump. Met de volgende opdracht kunt u de uitvoer van omleiden dexdump naar een bestand dat kan worden geopend door een teksteditor.

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

Als je opent classes.dasm, je zult zien dat het honderden regels low-level code heeft die er zo uitziet:

Onnodig te zeggen dat het heel moeilijk is om het te begrijpen. Gelukkig kunt u het uitvoerformaat van wijzigen dexdump naar XML met behulp van de -l keuze. Met de volgende opdracht kunt u de uitvoer omleiden naar een bestand dat u in een browser kunt openen.

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

De hoeveelheid informatie die beschikbaar is in het XML-formaat is minder, maar het geeft u een goed idee van de Java-klassen, -methoden en -velden in de app.

Conclusie

In deze zelfstudie hebt u geleerd hoe een APK is gemaakt en wat deze bevat. Je hebt ook geleerd hoe je de tools die beschikbaar zijn in de Android SDK kunt gebruiken om de inhoud van APK-bestanden te ontcijferen. Er is niet veel documentatie over deze tools, maar omdat ze open source zijn, kun je hun uitgebreide broncode gebruiken om meer over ze te weten te komen.

Als u op zoek bent naar iets dat eenvoudiger is om mee te werken, kunt u proberen populaire third-party tools te gebruiken, zoals dex2jar, die meer leesbare gedemonteerde code genereert, of JADX, een decompiler die Java-code kan genereren.