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/
3) Apktool - https://code.google.com/p/android-apktool/
4) smali files - https://code.google.com/p/smali/w/list
5) AndroidManifest.xml - http://developer.android.com/reference/android/Manifest.permission.html
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...?