Reverzní inženýrství aplikací pro Android 101

  1. Úvod
  2. Základy aplikací pro Android
  3. Začínáme s reverzním inženýrstvím aplikací pro Android
    • Cvičení 1
  4. Reverzní inženýrství aplikací pro Android – jak na to? DEX Bytecode
    • Cvičení 2
    • Cvičení 3
    • Cvičení 4
  5. Reverzní inženýrství aplikací pro Android -. Nativní knihovny
    • Cvičení 5
    • Cvičení 6
  6. Reverzní inženýrství aplikací pro Android -. Obfuskace
    • Cvičení 7
  7. Závěr

Sestavte aplikaci

Jedna z mých největších rad pro lidi, kteří chtějí reverzně inženýrovat, ať už se jedná o cokoli, je zkusit si sestavit to, co chcete reverzovat. V případě systému Android máte štěstí, protože je k dispozici spousta bezplatných zdrojů, ze kterých můžete sestavit svou první aplikaci. Pokud jste ještě nikdy žádnou aplikaci pro Android nesestavovali, doporučuji vám začít právě tam. Vyberte si některý z dostupných výukových programů a videí, které vás zaujmou, a pusťte se do budování. Když pochopíte, jak vývojář něco sestavuje, bude pro vás mnohem snazší pochopit, jak to zpětně upravit.

Přehled základů

Skvělé! Vytvořili jste aplikaci nebo jste se naučili základní principy vývoje aplikací pro systém Android. Zde je přehled některých důležitých bodů. Skvělým přehledem je tato stránka „Základy aplikace“ v dokumentech pro vývojáře systému Android.

  • Aplikace pro Android jsou ve formátu APK. APK je v podstatě soubor ZIP. (Příponu souboru můžete přejmenovat na .zip a pomocí příkazu unzip otevřít a zobrazit jeho obsah)
  • Obsah APK (není vyčerpávající)
    • AndroidManifest.xml
    • META-INF/
      • Certifikát žije zde!“
    • classes.dex
      • Bajtkód Dalvik pro aplikaci ve formátu DEX. Toto je kód jazyka Java (nebo Kotlin), který bude aplikace ve výchozím nastavení spouštět.
    • lib/
      • Nativní knihovny pro aplikaci se ve výchozím nastavení nacházejí zde! Pod adresářem lib/ se nacházejí adresáře specifické pro jednotlivé procesory. Například: armeabi, mips,
    • assets/
      • Jakékoli další soubory, které může aplikace potřebovat.
      • Další nativní knihovny nebo soubory DEX mohou být zahrnuty zde. To se může stát zejména tehdy, když se autoři malwaru chtějí pokusit „skrýt“ další kód, nativní nebo Dalvik, tím, že ho nezařadí do výchozích umístění.

Dalvik &Smali

Většina aplikací pro Android je napsána v jazyce Java. Kotlin je rovněž podporován a je s Javou interoperabilní. Pro zjednodušení můžete po zbytek tohoto semináře předpokládat, že když budu mluvit o „Javě“, budu tím myslet „Javu nebo Kotlin“. Namísto toho, aby se kód v jazyce Java spouštěl ve virtuálním stroji Java (JVM), jako je tomu u desktopových aplikací, je v systému Android Java kompilována do formátu bytekódu Dalvik Executable (DEX). U dřívějších verzí systému Android byl bajtový kód překládán virtuálním strojem Dalvik. U novějších verzí systému Android se používá prostředí Android Runtime (ART).
Pokud vývojáři, píší v jazyce Java a kód je zkompilován do bajtkódu DEX, pro zpětné inženýrství pracujeme opačným směrem.

Smali je lidsky čitelná verze bajtkódu Dalvik. Technicky vzato jsou Smali a baksmali názvy nástrojů (assembler, respektive disassembler), ale v systému Android často používáme termín „Smali“ pro označení instrukcí. Pokud jste prováděli reverzní inženýrství nebo počítačovou architekturu na zkompilovaném kódu C/C++. SMALI je jako jazyk assembleru: mezi zdrojovým kódem vyšší úrovně a bytekódem.

Pro následující kód Hello World v jazyce Java:

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

Kód Smali by byl:

.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

Sada instrukcí Smali je k dispozici zde.

Většinou při zpětném inženýrství aplikací pro Android nebudete potřebovat pracovat v jazyce Smali. Většinu aplikací lze pozvednout na ještě vyšší úroveň, dekompilaci Javy. Jako všechny nástroje mohou mít i dekompilátory Javy chyby. Doporučuji vám, abyste se vždy, když výstup dekompilace Javy vypadá pochybně, podívali na výstup Smali. Pracujte řádek po řádku s odkazem na instrukce, abyste zjistili, co kód dělá.

Pro získání Smali z DEXu můžete použít nástroj baksmali (disassembler), který je k dispozici na adrese https://github.com/JesusFreke/smali/wiki. Nástroj smali vám umožní sestavit smali zpět do DEXu.

Vstupní body aplikace

Jedním z nejdůležitějších bodů reverzního inženýrství je vědět, kde začít analýzu, a vstupní body pro spuštění kódu jsou její důležitou součástí.

Aktivita spouštěče

Aktivita spouštěče je to, co většina lidí považuje za vstupní bod aplikace Android. Aktivita spouštěče je aktivita, která se spustí, když uživatel klikne na ikonu aplikace. Aktivitu spouštěče můžete určit nahlédnutím do manifestu aplikace. Aktivita spouštěče bude mít uvedeny následující záměry MAIN a LAUNCHER.

Mějte na paměti, že ne každá aplikace bude mít aktivitu spouštěče, zejména aplikace bez uživatelského rozhraní. Příkladem aplikací bez uživatelského rozhraní (a tedy i aktivity spouštěče) jsou předinstalované aplikace, které provádějí služby na pozadí, například hlasová pošta.

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

Služby

Služby běží na pozadí bez uživatelského rozhraní. Existuje nespočet způsobů, jak je lze spustit, a jsou tak vstupním bodem pro aplikace. Výchozím způsobem, jak lze službu spustit jako vstupní bod do aplikace, jsou Intenty.

Při volání rozhraní API startService pro spuštění služby se provede metoda onStart ve službě.

Přijímače vysílání

Vysílání lze považovat za systém zpráv a přijímače vysílání jsou posluchači. Pokud aplikace zaregistrovala přijímač pro konkrétní vysílání, kód v tomto přijímači se provede, když systém vysílání odešle. Existují dva způsoby, jak může aplikace zaregistrovat přijímač: v manifestu aplikace nebo dynamicky zaregistrovaný v kódu aplikace pomocí volání registerReceiver() API.

V obou případech se pro registraci přijímače nastaví filtry záměrů pro přijímač. Tyto filtry záměrů představují vysílání, které má přijímač spustit.

Když jsou vyslána konkrétní vysílání, pro která je přijímač registrován, provede se onReceive ve třídě BroadcastReceiver.

Exportované komponenty (služby & aktivity)

Služby a aktivity lze také „exportovat“, což umožňuje jiným procesům v zařízení spustit službu nebo spustit aktivitu. Komponenty se exportují nastavením prvku v manifestu, jak je uvedeno níže. Ve výchozím nastavení android:exported="false"je-li tento prvek v manifestu nastaven na hodnotu true nebo nejsou-li pro aktivitu nebo službu definovány filtry záměrů.

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

Podtřída aplikace

Aplikace pro Android mohou definovat podtřídu aplikace. Aplikace mohou, ale nemusí definovat vlastní podtřídu Application. Pokud aplikace Android definuje podtřídu Aplikace, je tato třída instancována před jakoukoli jinou třídou v aplikaci.

Je-li v podtřídě Aplikace definována metoda attachBaseContext, je volána jako první, před metodou onCreate.

NEXT > 3. Začínáme s obracením aplikací Android

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.