Jako, że kolejny post z cyklu „Algorytmy (de)szyfrowania wykorzystywane przez twórców trojanów bankowych” , który mam w planach napisać, będzie o algorytmach szyfrowania wykorzystanych w trojanach napisanych w Delphi 😀 (tak tak, poczekajcie jeszcze pare lat i będzie wysyp trojanów pisanych w .NET… using System.malwares.bankers; i go go go !!! :D) , to postanowiłem wcześniej napisać co nie co o moim ogólnym podejściu do trojanów pisanych w tym właśnie języku oraz narzędzi ułatwiających ich analizę.
Nasz dzisiejszy „bohater” przedstawia się następująco:
[=]Dane[=]
Antywirus Wersja Ostatnia aktualizacja Wynik a-squared 4.5.0.24 2009.08.02 Trojan-Banker.Win32.Banker!IK AhnLab-V3 5.0.0.2 2009.08.01 Win-Trojan/Banker.7315456.D AntiVir 7.9.0.238 2009.08.02 TR/Agent.GGO.1 Antiy-AVL 2.0.3.7 2009.07.31 - Authentium 5.1.2.4 2009.08.02 W32/Trojan.BZCX Avast 4.8.1335.0 2009.08.01 Win32:Banker-CXH AVG 8.5.0.406 2009.08.02 PSW.Banker4.AJJ BitDefender 7.2 2009.08.02 Generic.Spy.Bank.ZWQ.720719B9 CAT-QuickHeal 10.00 2009.07.30 - ClamAV 0.94.1 2009.08.02 - Comodo 1840 2009.08.02 TrojWare.Win32.Spy.Banker.OHT DrWeb 5.0.0.12182 2009.08.02 Trojan.PWS.Banker.12795 eSafe 7.0.17.0 2009.07.30 Win32.Banker.cwo eTrust-Vet 31.6.6650 2009.08.01 - F-Prot 4.4.4.56 2009.08.02 W32/Trojan.BZCX F-Secure 8.0.14470.0 2009.08.01 Trojan-Banker.Win32.Banker.fgw Fortinet 3.120.0.0 2009.08.02 Spy/Banker GData 19 2009.08.02 Generic.Spy.Bank.ZWQ.720719B9 Ikarus T3.1.1.64.0 2009.08.02 Trojan-Banker.Win32.Banker Jiangmin 11.0.800 2009.08.02 - K7AntiVirus 7.10.808 2009.08.01 - Kaspersky 7.0.0.125 2009.08.02 Trojan-Banker.Win32.Banker.fgw McAfee 5695 2009.08.01 PWS-Banker.gen.cb McAfee+Artemis 5695 2009.08.01 PWS-Banker.gen.cb McAfee-GW-Edition 6.8.5 2009.08.02 Heuristic.BehavesLike.Win32.Spyware.K Microsoft 1.4903 2009.08.02 TrojanSpy:Win32/Banker.USW NOD32 4299 2009.08.02 Win32/Spy.Banker.OHJ Norman 6.01.09 2009.07.31 W32/Banker.BQZT nProtect 2009.1.8.0 2009.08.02 - Panda 10.0.0.14 2009.08.02 Trj/Banker.gen PCTools 4.4.2.0 2009.08.02 TrojanSpy.Banker.ARXE Rising 21.40.62.00 2009.08.02 Trojan.Spy.Win32.Banker.c Sophos 4.44.0 2009.08.02 Mal/DelpBanc-A Sunbelt 3.2.1858.2 2009.08.02 Bulk Trojan Symantec 1.4.4.12 2009.08.02 Infostealer.Bancos TheHacker 6.3.4.3.375 2009.08.01 Trojan/Spy.Banker.cwo TrendMicro 8.950.0.1094 2009.07.31 - VBA32 3.12.10.9 2009.08.02 Trojan-Spy.Win32.Banker.cwo ViRobot 2009.7.31.1863 2009.07.31 - VirusBuster 4.6.5.0 2009.08.02 TrojanSpy.Banker.ARXE Dodatkowe informacje File size: 7319552 bytes MD5 : d9e6a8e34c8c6f33919c33889c23811c SHA1 : 38bb2fbb82e419d044a2a9e9199eb948eb891679 SHA256: 9fe271dbe89dd60d072789f49197d217edf75d9ed5a46fc5e94e28c7522341d8 TrID : File type identification
65.9% (.EXE) InstallShield setup (43065/22/16)
13.0% (.EXE) Win32 Executable Generic (8527/13/3)
11.6% (.DLL) Win32 Dynamic Link Library (generic) (7583/30/2)
3.1% (.EXE) Win16/32 Executable Delphi generic (2072/23) 3.0% (.EXE) Generic Win/DOS Executable (2002/3) ssdeep: 98304:aVwdUDdAVtUSlUTE2PIEH4B4Yo1qIZtDxHw7SbrKD:anAUkQPIYA49m PEiD : - RDS : NSRL Reference Data Set
Ja kto przeważnie bywa sygnaturki, są bardzo ooooooogggggólne. Jeżeli nawet, któraś z nich wskazuje na jakiś bardziej konkretny typ trojana to analiza techniczna bardzoooooo mija się z rzeczywistością, weźmy chociażby :
Symantec – Infostealer.Bancos
Morał jest taki, że ludki pracujące nad tego typu malware’em, a m.in. są to osoby z brazylijskich slumsów oraz innych biednych krajów A.Pd, (polecam tutaj wystąpienie
Mikko Hypponen : Online Crime and Crime Online
) nie robią sobie urlopów :D.
[=]Prolog[=]
Jeżeli kiedykolwiek zdarzyło Ci się pisać w BCB/Delphi aplikację z GUI (bo na takich będziemy się skupiać) to możesz podejrzewać, a jeżeli już je reversowałeś to jesteś świadom, że narzut kodu wygenerowanego przez kompilator, który nie specjalnie nas interesuje jest dość spory. Dodatkowo mamy tu do czynienia z budową silnie obiektową (masa metod wirtualnych, delegaty [tak tak, borland dostarcza do tego celu specyfikatora „__closure”],wielodziedziczenie,itp.) przez co nasza analiza jest nieco „utrudniona”(interpretuj. utrudniać: wydłużać czas zabawy :D). Dlatego też, pokarze parę narzędzi oraz plugin’ów do nich, które przyspieszą samą analizę kodu jak i pomogą nam na znalezienie tych fragmentów, które zastały napisane przez autora trojana.
[=]Analiza[=]
Na początku naszej analizy zastanówmy się jakie akcje są przeważnie wykonywane podczas początkowego uruchomienia trojana. Z mojego doświadczenia wynika, że są to przeważnie następujące działania :
– kopiowanie własnej instancji do katalogu systemowego
– dodanie wpisu w rejestrze pozwalającego na auto uruchomienie trojana po reboot’e systemu
– rejestracja zainfekowanej maszyny
Ok, na początek tyle ustaleń nam wystarczy teraz pojawia się kwestia jak zlokalizować ten kod?
Oczywiście niektórzy z was mogli pomyśle, od razu o rozwiązaniu w stylu ustawianiu BP na api, które w jakiś sposób są powiązane z wyżej wymienionymi akcjami. Jest to na pewno jakiś sposób, ale w przypadku aplikacji Borlandowskich warto użyć paru dodatkowych narzędzi poza disassambler’em i debugger’em żeby osiągnąć naprawdę interesujące rezultaty, ale o tym za chwilę. Obejrzyjmy wstępnie kod trojana:
Na chwilę obecną powyższy kod nie daje nam zbyt wiele informacji, widać „rzetelne sprawdzanie błędów” 😀, tworzenie mutex’a i wywołanie paru metod na globalnym obiekcie off_500864.Pierwszą rzeczą, która z pewnością ułatwi nam dalsze analizowanie kodu są FLIRT’y(więcej informacji TU), które dostarcza nam IDA Pro w wersji komercyjnej. Trudno mi powiedzieć jak wygląda kwestia z wersją Free, niestety nie testowałem, także jeżeli ktoś z was będzie testował lub już to zrobił to dajcie znać ;). Załadujmy odpowiednie FLIRT’y i rzućmy okiem na kod po tym zabiegu:
Ahhh….na mój gust kod wygląda już znacznie lepiej ;).
Jak widać IDA zastąpiła większość wywołań VCL’owych metod sygnaturami przez co kod jest znacznie czytelniejszy. Warto jeszcze tutaj zastosować tryb:
Options->Demangled names
I przy wyborze „Show demangled C++ names as” zaznaczyć radio box „Names” czego rezultatem będzie poniższy wynik:
Wracając do kodu, osoby, które miały styczność czy to z BCB czy Delphi już na pewno rozpoznają ten fragment.Tak tak jest to standardowy kod, którego główny cel możemy określić na:
– automatyczne tworzenie form używanych w projekcie
oraz obsługę komunikatów do nich napływających.
Porównamy teraz kod z pod IDA’y z kodem jednej z moich aplikacji pisanych w RAD Studio 2007( dawne wersje nazywane były Borland C++ Builder):
Tak jak widać kod jest uderzająco podobny, z czego morał taki, że dzięki IDA’e i sygnaturką zaoszczędziliśmy czas na analizowaniu standardowych VCL’owych metod.
Ok, wszystko fajnie, ale dalej nie mamy żadnych szczegółów związanych z naszymi wcześniejszymi ustaleniami. Po listingu z IDA’y możemy stwierdzić, że przy uruchomieniu trojana tworzone są automatycznie 3 formy, co wiąże się z wywołaniem pewnych zdarzeń. Zanim jednak omówimy sobie te zdarzenia przyjrzyjmy się wszystkim formą. Do tego celu oczywiście posłużymy się resource editor’em. Wyróżnie tutaj dwa:
Komercyjny:
PE Explorer: genialny edytor zasobów i nie tylko. Umożliwia podgląd form znajdujących się w zasobach, komponentów znajdujących się na nich (Timerów,Buttonów,Obrazów,…) oraz ich właściwości.
Darmowy:
DFM Editor: autorstwa MiTeC’ka jest darmowym prawie że odpowiednikiem PE Explorer’a, jeżeli chodzi o samo edytowanie zasobów. Jedynym mankamentem tego narzędzia jest brak możliwości podglądu obrazków znajdujących się na formach co w przypadku identyfikacji przeznaczenia formy(np. dzięki umieszczonym bannerą czy imitacją form przeznaczonych do logowania, możemy określić jakich banków klienci są narażeni na atak przez danego trojana już po samym analizowaniu zasobów) jest bardzo użyteczne.
W naszych badaniach identyfikacja przeznaczania danej formy pod kątem konkretnego banku jest zbyteczna ( a nawet z paru względów zabroniona :P). Rzućmy okiem do zasobów:
(Niektóre nazwy form były zbyt oczywistymi skrótami nazw banków przez co musiałem je troszeczkę ocenzurować.)
Jak widzimy trojan ten posiada sporą dawkę fałszywych form imitujących panel’e do logowania, wirtualne klawiatury, a skończywszy na oknach prezentujących imitacje crash’u IE czy nawet BSOD’a :D.
Jest jednak parę form. :
TAup – Application update?
TCMD – Commands ?
TFUNC – Functions ?
które nie posiadają charakterystycznych Bitmap, lecz np. komponenty takie jak :
TTimer
TIdSMTP
TIdMessage
i tym formą się przyjrzymy.
Przeglądając komponenty znajdujące się na wyżej wymienionych formach szybko dochodzimy do wniosku, że tak naprawdę tylko TCMD jest formą, która może nas zainteresować, ponieważ:
TAup – co prawda posiada komponent TTimer lecz nie ma on podczepionego event handler’a.
Czyżby autor trojana doznał chwilowego przebłysku oraz chęci dodania kolejnej funkcjonalności po czym, po krótkie chwili porzucił tą idee, oraz wszelkie elementy z nią związane? Tego się nigdy nie dowiemy.
TFUNC – ta forma jest kompletnie pusta.
Nie mogę tego inaczej skomentować niż jako wyjątkowego przejawu nonszalancji :D.
TCMD
Rzućmy okiem na najbardziej interesujące nas komponenty oraz ich własności:
object CMD: TCMD OnActivate = FormActivate OnCreate = FormCreate object TPrincipal: TTimer OnTimer = TPrincipalTimer Left = 8 end object Tcook: TTimer Interval = 100 OnTimer = TcookTimer Left = 40 end object Tsite: TTimer Enabled = False Interval = 50 OnTimer = TsiteTimer Left = 72 end object Tjanela: TTimer ; nie wierzcie, że event handler jest ustawiany dynamicznie:P To raczej kolejny przejaw wrodzonej rozrzutności autora malware’u. Left = 104 end object Taup: TTimer Enabled = False Interval = 720000 OnTimer = TaupTimer Left = 136 end end
Jak widać forma ta posiada obsłużone dwa zdarzenia:
OnActivate = FormActivate OnCreate = FormCreate
Oba, są idealne do tego żeby podpiąć w ich obsłudze wszystkie 3 wymienione przeze mnie początkowe działania wykonywane przez większość trojanów.
W pozostałych event handler’ach:
TaupTimer TsiteTimer TcookTimer TPrincipalTimer
związanych z eventem OnTimer:
można się raczej spodziewać akcji takich jak:
– aktualizacji trojana
– wysyłania skradzionych danych do twórcy malware’u
– monitorowania aktualnych procesów w systemie (i cykliczne ubijanie np. firewall’a)
czy monitorowania odwiedzanych stron.
Ok., mamy więc ustalone parę procek, których kod chcielibyśmy prześledzić. Nasuwa się pytanie:
W jaki sposób uzyskać ich VirtualAddress?
Odpowiedzią jest:
DeDe
Wszystkie informacje o DeDe jak i sam tool znajdziecie tutaj RCE Tools.
Ładujemy naszego trojana w DeDe i po parunastu sekundach otrzymujemy taki o to rezultat:
Wspaniale! Jak możemy zaobserwować na powyższym screen’e DeDe dostarczyło nam informacji o zdeklarowanych przez użytkownika klasach (np. TCMD), Event handler’ach oraz miejscach ich lokalizacji!
Podsumowując uzyskane informacje mamy:
OnTime:
TaupTimer = 004FD5C8 TsiteTimer = 004FD0A0 TcookTimer = 004FC834 TPrincipalTimer = 004FACE4
oraz eventy związane bezpośrednio z formą:
OnActivate = FormActivate = 004F7C44 OnCreate = FormCreate = 004FAC44
Oczywiście teraz nasza analiza staje się o wiele wiele prostsza, ponieważ bezpośrednio możemy zająć się interesującymi nas fragmentami kodu bez przedzierania się przez standardowe procedury.
Dla potwierdzenia wcześniejszych założeń związanych z operacjami wykonywanymi na starcie przez trojana, rzućmy okien na kod wykonywany przy event’e OnCreate, czyli:
FormCreate @ 004FAC44:
Mhmm sporo call’i, których IDA nie rozpoznała jako standardowych wywołań, więc najprawdopodobniej, są to pomocnicze metody napisane przez „programistę”. Zanim jednak przejdziemy do ich przeglądania, skorzystamy ponownie z dobrodziejstwa informacji dostarczanych przez DeDe, a mowa tutaj dokładnie o pliku MAP.
Dzięki wyexportowaniu informacji takich jak:
- event handlers - control references
do pliku map
oraz załadowaniu go do IDA’y: (polecam plugin Fast IDB2Sig and LoadMap) disassemblowany przez nas kod staje się ponownie jeszcze bardziej czytelny:
To co najbardziej rzuca się w oczy to fakt zamiany nazwy call’a i jego komentarza z :
loc_4FACBD: mov dl, 1 mov eax, [ebx+318h] ; call unknown_libname_172 ; Delphi2006/BDS2006 Visual Component Librar
na
loc_4FACBD: mov dl, 1 mov eax, [ebx+318h] ; Taup:N.A. call SetEnabled ; ExtCtrls.TTimer.SetEnabled(TTimer;Boolean)
odrazu widać, że jest to fragment kodu aktywujący Timer : Taup.
Ok, przyjrzyjmy się którejś z metod, której sposób działania jest nam jeszcze nie znany. Sprawdźmy jako pierwszą :
sub_483BE8
Ahh jak widać metoda ta wykonuje operacje na rejestrze, a po głębszej analizie okazuje się, że dodaje ona do klucza :
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun
wartość : Windows32 zawierającą scieżkę do kopi trojana, czyli
sub_483BE8 możemy zaklasyfikować jako :
– dodanie wpisu w rejestrze pozwalającego na auto uruchomienie trojana po reboot’e systemu
Super!!! jedno z założeń odnalezione. Idźmy dalej:
sub_483D78:
Jak widać w najwyżej położonym bloku widocznym na screen’e, zostaje sprawdzona wersja systemu operacyjnego ( Windows XP/NT/98 itd.) i na tej podstawie podejmowane, są działanie takie jak:
deskrypcja stringu
pobranie parametru wywołania aplikacji
oraz wykonanie kopi pliku gdzie parametrami, są rezultaty operacji dwóch poprzednich funkcji…czy coś wam to mówi 😀 ?,,,,,a teraz
CopyFile(ParamStr(),Decrypt()) :D?
Tak jest! Oczywiście widać tutaj bloki instrukcji odpowiedzialnych za kopiowanie instancji trojana do charakterystycznych katalogów uzależnionych od wersji systemu Windows.
sub_483D78
– kopiowanie własnej instancji do katalogu systemowego
Na tym poprzestaniemy nasze dalsze dochodzenie, bo nie dokładna analiza techniczna była naszym celem, a jedynie przekonanie się o tym jaki potencjał niesie zastosowanie :
– sygnatur IDA’y
– informacji o adresach metod/obiektów uzyskanych dzięki DeDe
oraz pliku MAP
A co z naszym ulubionym Olkiem :D? Czyż nie było by miło prowadzić dynamicznej analizy kodu mając do dyspozycji możliwości Olka ,sygnaturki IDA’y i możliwość załadowania pliku MAP ? Oczywiście byłoby, a najlepsze w tym jest to, że da się to osiągnąć!
[=]Olly’s time[=]
Żeby osiągnąć powyższe możliwości wystarczy tak naprawdę jeden plugin:
GoDup
Żeby dostrzec różnice po zastosowaniu kolejnych zabiegów w wykonaniu tego pluginu, ustawmy się na kod handler’a TPricipalTimer @ 004FACE4:
po zastosowaniu sygnatur:
dorzućmy jeszcze informacje z pliku MAP:
Czyż kod nie wygląda piękniej? :D.