Android-sovellusten käänteistekniikka 101

  1. Esittely
  2. Android-sovellusten perusteet
  3. Aloitus Android-sovellusten käänteistekniikassa
    • Harjoitus 1
  4. Android-sovellusten käänteistekniikka – DEX Bytecode
    • Harjoitus 2
    • Harjoitus 3
    • Harjoitus 4
  5. Reverse Engineering Android Apps – Natiivikirjastot
    • Harjoitus 5
    • Harjoitus 6
  6. Reverse Engineering Android Apps – Obfuscation
    • Harjoitus 7
  7. Conclusion

Build an App

Yksi suurimmista ehdotuksistani ihmisille, jotka etsivät käänteistä suunnittelua, olivatpa ne mitä tahansa, on yrittää rakentaa se, mitä haluaa kääntää. Androidin tapauksessa olet onnekas, koska tarjolla on niin paljon ilmaisia resursseja ensimmäisen sovelluksen rakentamiseen. Jos et ole koskaan aiemmin rakentanut Android-sovellusta, suosittelen aloittamaan siitä. Valitse jokin saatavilla olevista opetusohjelmista ja videoista, jotka herättävät kiinnostuksesi, ja aloita rakentaminen. Kun ymmärrät, miten kehittäjä rakentaa jotakin, on paljon helpompi ymmärtää, miten se käännetään.

Fundamentals Review

Hyvä! Olet rakentanut sovelluksen tai oppinut Android-sovelluskehityksen perusperiaatteet. Tässä on katsaus joihinkin tärkeisiin kohtiin. Tämä ”Sovelluksen perusteet” -sivu Android-kehittäjien asiakirjoissa on hyvä katsaus.

  • Android-sovellukset ovat APK-tiedostomuodossa. APK on periaatteessa ZIP-tiedosto. (Voit nimetä tiedostopäätteen uudelleen muotoon .zip ja käyttää unzip-ohjelmaa avataksesi ja nähdäksesi sen sisällön.)
  • APK:n sisältö (Ei tyhjentävä)
    • AndroidManifest.xml
    • META-INF/
      • Sertifikaatti asuu täällä!
    • classes.dex
      • Dalvik bytecode sovellukselle DEX-tiedostomuodossa. Tämä on Java- (tai Kotlin-) koodi, jota sovellus ajaa oletusarvoisesti.
    • lib/
      • Natiivit kirjastot sovellukselle, oletusarvoisesti, asuvat täällä! Lib/-hakemiston alla ovat cpu-kohtaiset hakemistot. Esim: armeabi, mips,
    • assets/
      • Mahdolliset muut tiedostot, joita sovellus saattaa tarvita.
      • Lisäisiä natiivikirjastoja tai DEX-tiedostoja voidaan sisällyttää tähän. Näin voi tapahtua erityisesti silloin, kun haittaohjelmien tekijät haluavat yrittää ”piilottaa” lisäkoodin, natiivin tai Dalvikin, jättämällä sen sisällyttämättä oletussijainteihin.

Dalvik & Smali

Useimmat Android-sovellukset on kirjoitettu Javalla. Kotlin on myös tuettu ja yhteentoimiva Javan kanssa. Yksinkertaisuuden vuoksi voit olettaa, että loppupuolella tätä työpajaa, kun viittaan ”Javaan”, tarkoitan ”Javaa tai Kotlinia”. Sen sijaan, että Java-koodi ajettaisiin JVM:ssä (Java Virtual Machine), kuten työpöytäsovellukset, Androidissa Java käännetään Dalvik Executable (DEX) bytecode -muotoon. Androidin aiemmissa versioissa tavukoodi käännettiin Dalvik-virtuaalikoneella. Uudemmissa Android-versioissa käytetään Android Runtimea (ART).
Jos kehittäjät, kirjoittavat Javalla ja koodi käännetään DEX-tekstikoodiksi, käänteismallinnuksessa toimitaan päinvastaiseen suuntaan.

Smali on ihmisen luettavissa oleva versio Dalvik-bytekoodista. Teknisesti Smali ja baksmali ovat työkalujen (assemblerin ja disassemblerin) nimiä, mutta Androidissa käytämme usein termiä ”Smali” viittaamaan ohjeisiin. Jos olet tehnyt käänteissuunnittelua tai tietokonearkkitehtuuria käännettyyn C/C++-koodiin. SMALI on kuin kokoonpanokieli: korkeamman tason lähdekoodin ja tavukoodin välissä.

Tässä Hello World Java-koodissa:

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

Smali-koodi olisi:

.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-käskykokonaisuus on saatavissa täältä.

Useimmiten Android-sovelluksia käänteissuunniteltaessa ei tarvitse työskennellä Smalissa. Useimmat sovellukset voidaan nostaa vielä korkeammalle tasolle, dekompiloituun Javaan. Kuten kaikissa työkaluissa, myös Javan dekompilaattoreissa voi olla bugeja. Ehdotukseni sinulle on, että aina kun dekompiloitu Java-tuloste näyttää kyseenalaiselta, katso Smali-tulostetta. Työskentele rivi riviltä käskyviittauksen avulla selvittääksesi, mitä koodi tekee.

Smalin saamiseksi DEX:stä voit käyttää baksmali-työkalua (disassembler), joka on saatavilla osoitteessa https://github.com/JesusFreke/smali/wiki. Smali-työkalun avulla voit koota smalin takaisin DEX:iin.

Sovelluksen sisääntulopisteet

Yksi tärkeimmistä kohdista käänteisessä insinöörityössä on se, että tiedät, mistä aloitat analyysisi, ja koodin suorituksen sisääntulopisteet ovat tärkeä osa tätä.

Launcher-aktiviteetti

Launcher-aktiviteetti on se, mitä useimmat ajattelevat sisäänmenoajankohtana Android-applikaatioon. Launcher-aktiviteetti on aktiviteetti, joka käynnistyy, kun käyttäjä napsauttaa sovelluksen kuvaketta. Voit määrittää launcher-aktiviteetin tarkastelemalla sovelluksen manifestia. Launcher-aktiviteetissa on lueteltu seuraavat MAIN- ja LAUNCHER-intentit.

Kannattaa muistaa, että kaikissa sovelluksissa ei ole launcher-aktiviteettia, varsinkaan sovelluksissa, joissa ei ole käyttöliittymää. Esimerkkejä sovelluksista, joilla ei ole käyttöliittymää (ja siten launcher-aktiviteettia), ovat esiasennetut sovellukset, jotka suorittavat palveluja taustalla, kuten vastaaja.

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

Palvelut

Palvelut suoritetaan taustalla ilman käyttöliittymää. Ne voidaan käynnistää lukemattomilla eri tavoilla, joten ne ovat sovellusten sisäänkäyntipiste. Oletusarvoinen tapa, jolla palvelu voidaan käynnistää sovelluksen tulopisteenä, on Intentsin kautta.

Kun startService API:ta kutsutaan käynnistämään palvelu, suoritetaan palvelussa oleva onStart-metodi.

Lähetysvastaanottimet

Lähetysvastaanottimet voidaan ajatella viestijärjestelmänä ja lähetysvastaanottimet ovat kuuntelijoita. Jos sovellus on rekisteröinyt vastaanottimen tiettyä lähetystä varten, kyseisessä vastaanottimessa oleva koodi suoritetaan, kun järjestelmä lähettää lähetyksen. Sovellus voi rekisteröidä vastaanottimen kahdella tavalla: sovelluksen manifestissa tai dynaamisesti rekisteröitynä sovelluksen koodissa käyttäen registerReceiver() API-kutsua.

Kummassakin tapauksessa vastaanottimen rekisteröimiseksi asetetaan vastaanottimen intent-suodattimet. Nämä intent-suodattimet ovat ne lähetykset, joiden pitäisi laukaista vastaanotin.

Kun lähetetään tietyt lähetykset, joita varten vastaanotin on rekisteröity, suoritetaan BroadcastReceiver-luokan onReceive.

Viedyt komponentit (Palvelut & Aktiviteetit)

Palveluja ja aktiviteetteja voidaan myös ”viedä”, mikä mahdollistaa sen, että muut prosessit laitteessa voivat käynnistää palvelun tai käynnistää aktiviteetin. Komponentit viedään asettamalla elementti manifestiin alla olevan kaltaisesti. Oletusarvoisesti android:exported="false" ellei tätä elementtiä ole manifestissa asetettu true-arvoon tai aktiviteetille tai palvelulle ole määritelty intent-filttereitä.

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

Application Subclass

Android-sovellukset voivat määritellä Applicationin alaluokan. Sovellukset voivat, mutta niiden ei tarvitse määritellä Applicationin mukautettua aliluokkaa. Jos Android-sovellus määrittelee Application-aliluokan, tämä luokka instantioidaan ennen sovelluksen muita luokkia.

Jos Application-aliluokassa on määritelty attachBaseContext-metodi, sitä kutsutaan ensin ennen onCreate-metodia.

NEXT > 3. Android-sovellusten kääntämisen aloittaminen

.

Vastaa

Sähköpostiosoitettasi ei julkaista.