Wednesday 28 January 2015

[PL] Analiza aplikacji atticlab.bodyscanner.apk



W tym krótkim poście wyjaśnię sposób w jaki sprawdzałem co robi aplikacja atticlab.bodyscanner.apk. Plik znalazłem przeglądając stronę http://contagiodump.blogspot.com/ [1] - dzięki za próbki!


  
Spis treści:


    1.  Zaczynamy – “znalazłem aplikację”
    2.  Co robi aplikacja
    3.  Prawdziwe działanie
    4.  A pomagało mi…





  1.  Zaczynamy – “znalazłem aplikację”


  Przeglądając rózne strony w internecie szukałem aplikacji, na których mógłbym poćwiczyć analizę programów dla Android’a. Takim sposobem, znalazłem mały program - „Body Scanner Free Prank”.



Uznałem, że to bardzo dobry przykład na start i zacząłem poznawać działanie aplikacji.



    2.  Co robi aplikacja

Według opisu – świetna zabawa, można zrobić kawał znajomym na imprezie. Mnie interesowało dodatkowo, co jeszcze aplikacja ta robi po zainstalowaniu jej na telefonie.

Powinienem być może dodać na wstępie, że analizę tego pliku przeprowadzałem na dwóch systemach operacyjnych: Windows 7 oraz Debian 7.
Narzędzia, z których głównie korzystałem to jd-gui[2] oraz apktool[3] (dla Linuxa i Windowsa, będą wymienione również później). 

Zaczniemy wobec tego w momencie, w którym mamy już plik na dysku naszego Linux’a. Sprawdźmy, czy możemy dostać się do źródeł pliku. Pomoże nam w tym program apktool

Idąc za dokumentacją (https://code.google.com/p/android-apktool/): „It is a tool for reverse engineering 3rd party, closed, binary Android apps.
Aby zacząć sprawdzać kod aplikacji, skorzystajmy na początek z tego narzędzia. Opis działania programu poznamy po wydaniu polecenia:
 


$ java –jar apktool.jar
W ten sposób, program przedstawi nam dostępne do użycia opcje:
 


Wybierzmy zatem opcję „d”, aby dekodować plik APK:



root@tadam:~/tools/android/apki/MALWARE# java -jar apktool_1.5.2.jar d atticlab.bodyscanner.apk

I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /root/apktool/framework/1.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...

root@tadam:~/tools/android/apki/MALWARE#
 



Ok. Teraz w katalogu apktool’a powinniśmy znaleźć folder z plikami smali[4].




    3.  Prawdziwe działanie

   Chcąc poznać prawdziwe działanie tej aplikacji, sprawdźmy co faktycznie ukryte jest w jej kodzie źródłowym.   
   
   Sprawdźmy najpierw co znajdziemy w pliku AndroidManifest.xml. To czego będziemy teraz szukać to uprawnienia jakich wymaga ta aplikacja do poprawnego działania.
 




Widzimy zatem, jakie uprawnienia w telefonie chce uzyskać program:
  • READ_PHONE_STATE
  •  ACCESS_NETWORK_STATE
  • SEND_SMS
  • INTERNET 
  • WRITE_EXTERNAL_STORAGE
  • INSTALL_PACKAGES
  • DELETE_PACKAGES 


W związku z tym, wiemy już, że instalując tą aplikację na swoim urządzeniu z Android’em, umożliwimy jej:
  • Dostęp do informacji o stanie telefonu
  • Dostęp do informacji na temat dostępnych sieci
  • Wysyłanie wiadomości SMS
  • Tworzenie gniazd sieciowych
  • Dostęp do plików na zewnętrznych nośnikach (np. karty SD)
  • Instalację pakietów
  • Kasowanie pakietów


Po szczegółowe opisy informacji, które możemy znaleźć w pliku manifestu, zapraszam na stronę dokumentacji wymienioną w ostatnim akapicie jako [5].

Przeglądając kod źródłowy aplikacji (np. korzystając z jd-gui[2]), możemy znaleźć klasy „opisujące” działanie aplikacji atticlab.bodyscanner.apk.

Na poniższym zrzucie ekranu przedstawione są wspomniane wyżej klasy z punktu widzenia dekompilatora:




Główne zadania poszczególnych klas to: 
        Ø  AutorunBroadcastReceiver:
§  przygotowuje funkcję onReceive()
        Ø  Downloader:
§  tworzy katalog "/download/", w którym przechowywane będą pliki
        Ø  NotificationActivity:
§  przygotowuje wygląd powiadomień
§  wlacza obsługę JavaScript
        Ø  NotificationApplication:
§  przygotowuje ustawienia
§  zbiera informacje na temat SMS’ów
§  zbiera listę operatorow sieci
§  ustawia alarm
        Ø  NotificationService
§  przygotowuje uruchomienie usługi
        Ø  OperaUpdaterActivity
§  przygotowuje klasę Downloader’a
§  dodaje logo
§  obsługuje wysłane SMS’y
§  tworzy layout
§  zapisuje zmiany w konfiguracji
§  ustawia ekran koncowy oraz ekran główny aplikacji
        Ø  RepeatingAlarmService
§  włącza powtarzanie usługi alarmu
        Ø  Restriction
§  funkcja send() do obsługi SMS’ów
        Ø  ScreenItem
§  przygotowuje wygląd
        Ø  Settings
§  ustawienia aplikacji, zmienne, stałe, etc...
§  zbiera informacje o telefonie
§  przygotowuje obsługę wybranego algorytmu (md5)
§  zapisuje ustawienia
        Ø  SettingsSet
§  serializacja treści SMS’ów
        Ø  SmsItem
§  zbiera SMS’y do wysłania
        Ø  SmsOperator
§  przygotowuje obiekty do obsługi operatora
        Ø  StringDecoder
§  na podstawie Hashtable koduje stringi w kodzie malware'u
§  (... i na tej podstawie odszyfrujemy co one znacza ;] )
        Ø  ThreadOperation
§  obsługa wątków w aplikacji
        Ø  ThreadOperationListener
§  listener dla operacji/watków
        Ø  Utils
§  zebrane funkcjonalności programu




A teraz, poniżej kilka informacji na temat działania samej aplikacji. Informacje zebrano na podstawie dostępnego (jd-gui) kodu źródłowego.

Podczas sprawdzania ciągów znaków (strings) w aplikacji natknąłem się na „rosyjsko wyglądające” napisy:



Według Google Translator’a[6] oznaczają one:


Ciekawym elementem przeglądu tego kodu źródłowego, było znalezienie zakodowanych „jakimś tajnym sposobem” napisów:

lub:






Całą magię specjalnego kodowania znalazłem w pliku: ad/notify/StringDecoder.java. Widząc ten kod, zauwazyłem, że stringi kodowane są za pomocą decode(). Postanowiłem zatem użyć polecenia grep, żeby sprawdzić gdzie są wszystkie odwołania do decode() w kodzie źródłowym aplikacji. Oto wyniki:




W ten sposób zebrałem listę wierszy, które należy rozkodować. Zapisałem je w pliku „decodeit.txt”. Następnie napisałem bardzo prosty program w Pythonie, aby rozkodować zebrane wcześniej napisy. Kod programu poniżej:



#!/usr/bin/env python

f = open('decodeit.txt','r')

dikt = {'"':'"','p':'#','*':'4','`':'v','e':'n','S':'c','-':'L','/':'l','?':'a',
'.':'p','>':'d','m':'@','X':'B',',':'S','(':'1','B':'3','2':']',
'x':'V','a':':','j':'C','+':'A','s':'Y','u':'E',';':'{','E':'$',
'V':'*','_':'`','Q':'.','8':'|','Z':'O','n':'T','i':'P','H':'R',
'C':'u','y':'Q','#':'s','&':'z',']':'i','O':'_','M':'F','A':'Z',
'r':')','b':'~','~':'^',')':'}','$':'w','h':'/','T':'6','t':'N',
'|':';','W':'y','4':'e','%':'G','U':'U','L':'o','K':'j','!':'g',
':':'t','d':'X','w':'b','v':'W','J':'7','l':'r','9':'k','<':'f',
'o':'%','N':',','0':'>','{':'H','z':'8','3':'&','P':'+','I':'2',
'6':'5','1':'h','q':'[','G':'(','7':'9','D':'<','c':'0','R':'=',
'^':'m','5':'I','F':'?','}':'K','g':'M','f':'-','[':'x','k':'q',
'@':'!','Y':'J','=':'D','\n':'\n',' ':' '}

wynik = []
for line in f:
  for char in line:
    wynik.append(dikt[char])

print ''.join(wynik)

f.close()




Działanie programu jest bardzo proste: korzystając z tablicy „Hastable” z kodu źródłowego malware’u, tworzymy proste zamiany znaku X na znak Y (użyty jako zamiennik w Hashtable). W ten sposób otrzymujemy odkodowany tekst:


(Kod dekodera dostępny również na Pastebin: http://pastebin.com/dxPZmQFQ )


W ten sposób poznajemy kilka ukrytych informacji w kodzie programu, między innymi ciepłe przywitanie od autora „WHELCOMETOHELL” ;)


Kawałek hashtable, o którym mowa wyżej, prezentuje poniższy zrzut ekranu:







W pliku StringDecode.java znajdujemy również funkcję decode():





Analizując aplikacje na telefon, nawet tak pobieżnie, już na tym etapie prawdopodobnie będziemy mogli stwierdzić, że plik APK może źle wpływać na działanie naszego telefonu... ;)

Czasem z podpowiedzią może przyjść VirusTotal[7]:



    4.  A pomagało mi...

1)  Malware sample from http://contagiodump.blogspot.com/ - thanks!
2)  Jd-gui - http://jd.benow.ca/
6)  Google Translate – http://translate.google.com
7)  VirusTotal – https://www.virustotal.com




Komentarze / pytania ->  http://HauntIT.blogspot.com
lub @ hauntit.blog [at] gmail [.] com

No comments:

Post a Comment

What do You think...?