Android App Reverse Engineering 101

    1. Indledning
    2. Grundlæggende om Android-applikationer
    3. Kom godt i gang med at reverse Android-apps
      • Øvelse 1
    4. Reverse Engineering af Android-apps – DEX Bytecode
      • Øvelse 2
      • Øvelse 3
      • Øvelse 4
    5. Reverse Engineering af Android-apps – Native biblioteker
      • Øvelse 5
      • Øvelse 6
    6. Reverse Engineering af Android-apps – Obfuscation
      • Øvelse 7
    7. Konklusion

    Byg en app

    Et af mine største forslag til folk, der ønsker at reverse engineer ting, uanset hvad de måtte være, er at forsøge at bygge det, du vil omvende. I tilfælde af Android er du heldig, fordi der er så mange gratis ressourcer til rådighed til at bygge din første applikation. Hvis du aldrig har bygget en Android-applikation før, foreslår jeg, at du starter der. Vælg en af de tilgængelige tutorials og videoer, der vækker din interesse, og gå i gang med at bygge. Når du forstår, hvordan en udvikler bygger noget, gør det det meget nemmere at forstå, hvordan du kan reverse engineer det.

    Fundamentals Review

    Great! Du har bygget en app eller lært grundlæggende principper for udvikling af Android-apps. Her er en gennemgang af nogle af de vigtige punkter. Denne side “Application Fundamentals” på siden “Application Fundamentals” i Android-udviklernes dokumenter er en god gennemgang.

  • Android-programmer er i APK-filformatet. APK er grundlæggende en ZIP-fil. (Du kan omdøbe filendelsen til .zip og bruge unzip til at åbne og se dens indhold.)
  • APK Indhold (ikke udtømmende)
    • AndroidManifest.xml
    • META-INF/
      • Certificate lives here!
  • classes.dex
    • Dalvik bytecode til programmet i DEX-filformatet. Dette er den Java- (eller Kotlin-) kode, som programmet vil køre som standard.
  • lib/
    • Native biblioteker til programmet findes som standard her! Under lib/-mappen er der de cpu-specifikke mapper. Fx: armeabi, mips,
  • assets/
    • Alle andre filer, der kan være nødvendige for applikationen.
    • Der kan medtages yderligere native biblioteker eller DEX-filer her. Dette kan især ske, når malwareforfattere ønsker at forsøge at “skjule” yderligere kode, native eller Dalvik, ved ikke at inkludere den i standardplaceringerne.

Dalvik & Smali

De fleste Android-programmer er skrevet i Java. Kotlin understøttes også og er interoperabel med Java. For nemheds skyld kan du i resten af denne workshop, når jeg henviser til “Java”, gå ud fra, at jeg mener “Java eller Kotlin”. I stedet for at Java-koden køres i Java Virtual Machine (JVM) som i desktop-applikationer, kompileres Java i Android til bytecode-formatet Dalvik Executable (DEX). I tidligere versioner af Android blev bytekoden oversat af den virtuelle Dalvik-maskine. I nyere versioner af Android anvendes Android Runtime (ART).
Hvis udviklere skriver i Java, og koden er kompileret til DEX-bytecode, arbejder vi i den modsatte retning for at reverse engineer.

Smali er den menneskeligt læsbare version af Dalvik-bytecode. Teknisk set er Smali og baksmali navnet på værktøjerne (henholdsvis assembler og disassembler), men i Android bruger vi ofte udtrykket “Smali” til at henvise til instruktioner. Hvis du har lavet reverse engineering eller computerarkitektur på kompileret C/C++-kode. SMALI er som assemblagesproget: mellem kildekoden på højere niveau og bytekoden.

For følgende Hello World Java-kode:

public static void printHelloWorld() {System.out.println("Hello World")}

Smali-koden ville være:

.method public static printHelloWorld()V.registers 2sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;const-string v1, "Hello World"invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)Vreturn-void.end method

Smali-instruktionssættet er tilgængeligt her.

Det er oftest ikke nødvendigt at arbejde i Smali, når du laver reverse engineering af Android-applikationer. De fleste applikationer kan løftes til et endnu højere niveau, dekompileret Java. Som alle værktøjer kan Java-dekompilere have fejl. Mit forslag til dig er, at når det dekompilerede Java-output ser tvivlsomt ud, skal du kigge på Smali-output. Arbejd linje for linje med instruktionsreferencen for at finde ud af, hvad koden gør.

For at få Smali fra DEX kan du bruge baksmali-værktøjet (disassembler), som findes på https://github.com/JesusFreke/smali/wiki. Med smali-værktøjet kan du samle smali tilbage til DEX.

Applikationens indgangspunkter

Et af de vigtigste punkter i reverse engineering er at vide, hvor du skal begynde din analyse, og indgangspunkter for udførelse af kode er en vigtig del af det.

Launcher-aktivitet

Launcher-aktiviteten er det, de fleste tænker på som indgangspunktet til en Android-applikation. Lanceraktiviteten er den aktivitet, der startes, når en bruger klikker på ikonet for et program. Du kan bestemme launcheraktiviteten ved at se på programmets manifest. Lanceringaktiviteten vil have følgende MAIN- og LAUNCHER-intents opført.

Husk, at ikke alle programmer vil have en lanceringaktivitet, især ikke programmer uden brugergrænseflade. Eksempler på programmer uden en brugergrænseflade (og dermed en launcher-aktivitet) er præinstallerede programmer, der udfører tjenester i baggrunden, f.eks. voicemail.

<activity android:name=".LauncherActivity"><intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>

Tjenester

Tjenester kører i baggrunden uden en brugergrænseflade. Der er et utal af måder, hvorpå de kan startes, og de er således et indgangspunkt for programmer. Standardmåden, hvorpå en tjeneste kan startes som et indgangspunkt til et program, er gennem Intents.

Når startService API’et kaldes for at starte en tjeneste, udføres onStart-metoden i tjenesten.

Broadcast-modtagere

Broadcasts kan betragtes som et meddelelsessystem, og broadcast-modtagere er lytterne. Hvis et program har registreret en modtager for en bestemt broadcast, udføres koden i denne modtager, når systemet sender broadcasten. Der er 2 måder, hvorpå en app kan registrere en modtager: i appens manifest eller dynamisk registreret i appens kode ved hjælp af registerReceiver() API-kaldet.

I begge tilfælde indstilles intentfiltrene for modtageren for at registrere modtageren. Disse intent-filtre er de udsendelser, der skal udløse modtageren.

Når de specifikke udsendelser, som modtageren er registreret for, sendes, udføres onReceive i BroadcastReceiver-klassen.

Eksporterede komponenter (Tjenester & Aktiviteter)

Tjenester og aktiviteter kan også “eksporteres”, hvilket gør det muligt for andre processer på enheden at starte tjenesten eller starte aktiviteten. Komponenterne eksporteres ved at indstille et element i manifestet som nedenfor. Som standard er android:exported="false" medmindre dette element er indstillet til sandt i manifestet, eller der er defineret intent-filtre for aktiviteten eller tjenesten.

<service android:name=".ExampleExportedService" android:exported="true"/><activity android:name=".ExampleExportedActivity" android:exported="true"/>

Application Subclass

Android-programmer kan definere en underklasse af Application. Applikationer kan, men behøver ikke at definere en brugerdefineret underklasse af Application, men behøver ikke at definere en brugerdefineret underklasse af Application. Hvis en Android-app definerer en Application-underklasse, instantieres denne klasse før alle andre klasser i applikationen.

Hvis attachBaseContext-metoden er defineret i Application-underklassen, kaldes den først, før onCreate-metoden.

NEXT > 3. Kom godt i gang med at vende Android-apps

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.