1. Podstawowe techniki statyczne
Nasz przegląd analizy malware zaczniemy od analizy statycznej, która zwykle stanowi pierwszy krok w badaniu złośliwego oprogramowania. Analiza statyczna opisuje proces analizy kodu lub struktury programu w celu ustalenia jego celu. Sam program w tym momencie nie jest uruchomiony. Natomiast podczas przeprowadzania analizy dynamicznej analityk faktycznie uruchamia program, o czym dowiemy się w rozdziale 3.
W tym rozdziale omówimy wiele sposobów uzyskiwania przydatnych informacji z plików wykonywalnych. Omówimy następujące techniki:
- używanie narzędzi antywirusowych do potwierdzania szkodliwości;
- używanie skrótów (hash) do identyfikowania złośliwego oprogramowania;
- gromadzenie informacji z łańcuchów, funkcji i nagłówków znajdujących się w pliku.
Każda technika może dostarczyć różnych informacji, a te, których użyjemy, zależą od naszych celów. Zazwyczaj korzystamy z kilku technik, aby zebrać jak najwięcej informacji.
Skanowanie antywirusowe - przydatny pierwszy krok
Podczas pierwszego analizowania potencjalnego malware dobrym pierwszym krokiem jest sprawdzenie go za pomocą różnych programów antywirusowych, które mogą być w stanie go zidentyfikować. Ale narzędzia antywirusowe z pewnością nie są idealne. W celu identyfikacji podejrzanych plików opierają się głównie na bazie danych możliwych do zidentyfikowania fragmentów znanego podejrzanego kodu (sygnatury plików), a także na analizie behawioralnej i dopasowaniu wzorców (heurystyka). Jednym z problemów jest to, że twórcy złośliwego oprogramowania mogą łatwo modyfikować kod, zmieniając w ten sposób sygnaturę swojego programu i unikając skanerów antywirusowych. Ponadto oprogramowanie antywirusowe często nie wykrywa rzadko występującego malware, ponieważ po prostu nie ma go w bazie danych. Wreszcie heurystyki - choć często udaje im się zidentyfikować nieznany złośliwy kod, mogą pominąć nowe i unikalne złośliwe oprogramowanie.
Ponieważ różne programy antywirusowe używają różnych sygnatur i heurystyk, przydatne jest uruchomienie kilku różnych tego typu programów przeciwko temu samemu podejrzanemu złośliwemu oprogramowaniu. Strony internetowe, takie jak VirusTotal (http://www.virustotal.com/), umożliwiają przesłanie pliku do przeskanowania przez wiele silników antywirusowych. VirusTotal generuje raport, który podaje całkowitą liczbę silników, które oznaczyły plik jako złośliwy, nazwę złośliwego oprogramowania i, jeśli to możliwe, dodatkowe informacje na temat złośliwego oprogramowania.
Haszowanie - odcisk palca malware
Haszowanie jest powszechną metodą stosowaną do jednoznacznej identyfikacji złośliwego oprogramowania. Złośliwe oprogramowanie jest przetwarzane przez program mieszający, który wytwarza unikalny skrót (hash) identyfikuje to oprogramowanie (rodzaj odcisku palca). Do analizy złośliwego oprogramowania najczęściej jest wykorzystywana funkcja skrótu Message-Digest Algorithm 5 (MD5), chociaż popularny jest również algorytm Secure Hash Algorithm 1 (SHA-1).
Na przykład użycie darmowego programu md5deep do obliczenia skrótu programu Solitaire dostarczanego z systemem Windows wygeneruje następujące dane wyjściowe:
C:\>md5deep c:\WINDOWS\system32\sol.exe
373e7a863a1a345c60edb9e20ec3231 c:\WINDOWS\system32\sol.exe
Skrót to 373e7a863ala345c60edb9e20ec3231.
Kalkulator WinMD5 z graficznym interfejsem użytkownika, pokazany na rysunku 1.1, może obliczać i wyświetlać skróty dla kilku plików jednocześnie.
Po wyznaczeniu unikalnego skrótu dla złośliwego oprogramowania możemy go użyć w następujący sposób:
- użyć skrótu jako etykiety;
- udostępnić ten skrót innym analitykom, aby pomóc im w identyfikacji złośliwego oprogramowania;
- wyszukać ten skrót online, aby sprawdzić, czy plik został już zidentyfikowany.
Rysunek 1.1. Rezultat WinMD5
Znajdowanie łańcuchów
Łańcuch w programie to łańcuch znaków, takich jak "the". Program zawiera łańcuchy, jeśli wyświetla komunikaty, łączy się z adresem URL lub kopiuje plik do określonej lokalizacji.
Przeszukiwanie w celu znalezienia łańcuchów może być prostym sposobem na uzyskanie wskazówek na temat funkcjonalności programu. Jeśli na przykład program uzyskuje dostęp do adresu URL, to w programie zobaczymy ten adres URL zapisany jako łańcuch. Do wyszukania w pliku wykonywalnym łańcuchów znaków, które zwykle są przechowywane w formacie ASCII lub Unicode, możemy użyć programu Strings (http://bit.ly/ic4plL).
UwagaMicrosoft używa terminu najszerszy zestaw znaków, aby opisać swoją implementację łańcuchów Unicode, które różnią się nieznacznie od standardów Unicode. W tej książce, gdy będziemy mówić o Unicode, będziemy mieli na myśli implementację Microsoftu.
Zarówno format ASCII, jak i Unicode przechowują znaki w sekwencjach zakończonych znakiem zerowym (NULL terminator), aby wskazać, że łańcuch jest kompletny. Łańcuchy ASCII używają 1 bajta na znak, Unicode zaś używa 2 bajtów na znak.
Rysunek 1.2 pokazuje łańcuch BAD zapisany jako ASCII. Łańcuch ASCII jest przechowywany jako bajty 0x42, 0x41, 0x44 i 0x00, gdzie 0x42 jest reprezentacją ASCII wielkiej litery B, 0x41 reprezentuje literę A itd. 0x00 na końcu jest znakiem zerowym.
Rysunek 1.2. Reprezentacja ASCII łańcucha BAD
Rysunek 1.3 pokazuje napis BAD zapisany jako Unicode. Łańcuch Unicode jest przechowywany jako bajty 0x42, 0x00, 0x41 itd. Wielka litera B jest reprezentowana przez bajty 0x42 i 0x00, a znakiem zerowym są dwa bajty 0x00.
Rysunek 1.3. Reprezentacja Unicode łańcucha BAD
Gdy Strings przeszukuje plik wykonywalny w poszukiwaniu łańcuchów ASCII i Unicode, ignoruje on kontekst i formatowanie, dzięki czemu może analizować dowolny typ pliku i wykrywać łańcuchy w całym pliku (chociaż oznacza to również, że może identyfikować bajty znaków jako łańcuchy, mimo że w rzeczywistości one nimi nie są). Strings wyszukuje trzyliterowe lub dłuższe sekwencje znaków ASCII i Unicode, po których występuje znak zakończenia łańcucha.
Czasami łańcuchy wykryte przez program Strings nie są rzeczywistymi łańcuchami. Jeśli na przykład Strings znajdzie sekwencję bajtów 0x56, 0x50, 0x33, 0x00, zinterpretuje to jako łańcuch VP3. Ale te bajty mogą w rzeczywistości nie reprezentować tego łańcucha - może to być adres pamięci, instrukcja procesora lub dane używane przez program. Strings pozostawia użytkownikowi możliwość odfiltrowania nieprawidłowych łańcuchów.
Na szczęście większość nieprawidłowych łańcuchów jest oczywista, ponieważ nie reprezentują one rzeczywistego tekstu. Na przykład następujący fragment pokazuje wynik działania Strings na pliku bp6.ex_:
C:>strings bp6.ex_
VP3
VW3
t$@
D$4
99.124.22.1
e-@
GetLayout
GDI32.DLL
SetLayout
M}C
Mail system DLL is invalid.!Send Mail failed to send message.
W tym przykładzie pogrubione łańcuchy można zignorować. Zazwyczaj, jeśli łańcuch jest krótki i nie odpowiada słowom, to prawdopodobnie nie ma znaczenia.
Jednocześnie łańcuchy GetLayout w i SetLayout w są funkcjami Windows używanymi przez bibliotekę graficzną. Możemy je łatwo zidentyfikować jako prawdziwe łańcuchy, ponieważ nazwy funkcji systemu Windows zwykle zaczynają się od wielkiej litery, tak jak i kolejne słowa.
GDI32.DLL w również ma znaczenie, ponieważ jest to nazwa typowej biblioteki dołączanej dynamicznej (DLL) systemu Windows, używanej przez programy graficzne. (Pliki DLL zawierają kod wykonywalny, który jest współużytkowany przez wiele aplikacji).
Jak można sobie wyobrazić, wartość 99.124.22.1 w to adres IP - najprawdopodobniej taki, którego złośliwe oprogramowanie będzie w jakiś sposób używać.
Wreszcie, Mail system DLL is invalid.!Send Mail failed to send message. w jest komunikatem o błędzie. Często najbardziej przydatne informacje uzyskane podczas uruchamiania Strings znajdują się w komunikatach o błędach. Ta konkretna wiadomość ujawnia dwie rzeczy: temat wiadomości wysyłanej przez malware (prawdopodobnie za pośrednictwem poczty elektronicznej) oraz to, że zależy ono od biblioteki DLL systemu pocztowego. Informacje te sugerują, że być może warto sprawdzić dzienniki e-maili pod kątem podejrzanego ruchu oraz że inna biblioteka DLL (Mail system DLL) może być powiązana z tym konkretnym złośliwym oprogramowaniem. Zauważmy, że sama brakująca biblioteka DLL niekoniecznie musi być złośliwa; złośliwe oprogramowanie do realizacji swoich celów często wykorzystuje normalne biblioteki i pliki DLL.
Pakowanie i obfuskacja przez malware
Twórcy malware często wykorzystują pakowanie lub zaciemnianie (obfuskację), aby utrudnić wykrycie lub analizę ich plików. Programy z obfuskacją (zaciemnieniem) to takie, których wykonanie autor złośliwego oprogramowania próbował ukryć. Programy spakowane to podzbiór zaciemnionych programów, w których złośliwy program jest skompresowany i nie może być analizowany. Obie techniki poważnie ograniczają nasze próby statystycznej analizy złośliwego oprogramowania.
Nieszkodliwe programy prawie zawsze zawierają wiele łańcuchów. Malware, które jest spakowane lub zaciemnione, zawiera ich bardzo niewiele. Jeśli podczas przeszukiwania programu za pomocą Strings okaże się, że ma on tylko kilka łańcuchów, to prawdopodobnie jest on albo zaciemniony, albo spakowany, co sugeruje, że może być złośliwy. Aby przebadać go dokładniej, prawdopodobnie będziemy musieli zastosować na nim coś więcej niż tylko analizę statyczną.
UwagaKod spakowany i zaciemniony często zawiera co najmniej funkcje LoadLibrary i GetProcAddress, które służą do ładowania i uzyskiwania dostępu do dodatkowych funkcji.
Spakowane pliki
Jak pokazano na rysunku 1.4, po uruchomieniu spakowanego programu uruchamia się mały program opakowujący, którego zadaniem jest rozpakowanie spakowanego pliku, a następnie jego uruchomienie. Gdy spakowany program jest analizowany statycznie, szczegółowemu badaniu może zostać poddany tylko mały program opakowujący. (Bardziej szczegółowo pakowanie i rozpakowywanie omówiono w rozdz. 18).
Rysunek 1.4. Plik po lewej stronie jest oryginalnym plikiem wykonywalnym, z widocznymi wszystkimi łańcuchami, importami i innymi informacjami. Po prawej stronie znajduje się spakowany plik wykonywalny. Wszystkie łańcuchy spakowanego pliku, importy i inne informacje są skompresowane i niewidoczne dla większości narzędzi do analizy statycznej
Wykrywanie spakowanych programów za pomocą PEiD
Jednym ze sposobów wykrywania spakowanych plików jest użycie programu PEiD. Za pomocą tego narzędzia można wykryć typ pakera lub kompilatora zastosowanego do zbudowania aplikacji, co znacznie ułatwia analizę spakowanego pliku. Rysunek 1.5 pokazuje informacje o pliku orig_aj2.ex_ raportowane przez PEiD.
Rysunek 1.5. Program PEiD
UwagaRozwój i wsparcie dla PEiD zostało wstrzymane od kwietnia 2011 roku, ale nadal jest to najlepsze dostępne narzędzie do wykrywania pakera i kompilatora. W wielu przypadkach określi również, który pakiet został użyty do spakowania pliku.
Jak widać, PEiD zidentyfikował plik jako spakowany za pomocą UPX w wersji 0.89.6-1.02 lub 1.05-2.90. (Zignorujmy na razie inne pokazane tutaj informacje. Przeanalizujemy ten program bardziej szczegółowo w rozdz. 18).
Gdy program jest spakowany, to aby móc przeprowadzić dowolną analizę, należy go rozpakować. Proces rozpakowywania jest często złożony i został szczegółowo omówiony w rozdziale 18, natomiast program do pakowania UPX jest tak popularny i łatwy w użyciu do rozpakowywania, że zasługuje na szczególną uwagę w tym momencie. Na przykład, aby rozpakować złośliwe oprogramowanie za pomocą UPX, wystarczy pobrać UPX (http://upx.sourceforge.net/) i uruchomić go w następujący sposób, używając jako argumentu nazwy spakowanego programu:
upx -d PackedProgram.exe
UwagaWiele wtyczek PEiD-a bez ostrzeżenia uruchamia złośliwe oprogramowanie! (Zobacz rozdz. 2, aby dowiedzieć się, jak skonfigurować bezpieczne środowisko do uruchamiania złośliwego oprogramowania). Podobnie, jak wszystkie programy, zwłaszcza te wykorzystywane do analizy malware, PEiD też może zawierać słabe punkty. Na przykład w PEiD w wersji 0.92 występowało przepełnienie bufora, które umożliwiło atakującemu wykonanie dowolnego kodu. Pozwoliłoby to sprytnemu twórcy złośliwego oprogramowania napisać program wykorzystujący maszynę analityka malware. Pamiętajmy, aby używać najnowszej wersji PEiD.
Format plików Portable Executable
Do tej pory omawialiśmy narzędzia skanujące pliki wykonywalne bez względu na ich format. Jednak format pliku może ujawnić wiele informacji na temat funkcjonalności programu.
Format pliku Portable Executable (PE) jest używany przez pliki wykonywalne systemu Windows, kod obiektowy i biblioteki DLL. Format pliku PE to struktura danych, która zawiera informacje niezbędne dla modułu ładującego systemu operacyjnego Windows do zarządzania opakowanym kodem wykonywalnym. Prawie każdy plik z kodem wykonywalnym, który jest ładowany przez system Windows, ma format PE, chociaż w malware pojawiają się nieraz także pewne starsze formaty plików.
Pliki PE zaczynają się od nagłówka, który zawiera informacje o kodzie, typie aplikacji, wymaganych funkcjach z bibliotek i wymaganiach dotyczących przestrzeni. Informacje w nagłówku PE mają wielką wartość dla analityka malware.
Dołączane biblioteki i funkcje
Jedną z najbardziej przydatnych informacji, które możemy zebrać na temat pliku wykonywalnego, jest lista importowanych funkcji. Importy to funkcje używane przez dany program, które są faktycznie przechowywane w innym programie. Mogą być nimi biblioteki kodu zawierające funkcje wspólne dla wielu programów. Biblioteki kodu można wykorzystać w głównym pliku wykonywalnym poprzez dołączanie.
Programiści korzystają z importów w swoich programach, aby nie musieli ponownie implementować pewnych, tych samych funkcji w wielu aplikacjach. Biblioteki kodu można dołączać statycznie, w czasie wykonywania lub dynamicznie. Znajomość sposobu dołączania biblioteki kodu jest kluczowa dla naszego zrozumienia malware, ponieważ informacje, które możemy znaleźć w nagłówku pliku PE, zależą od sposobu dołączenia biblioteki kodu. W tym podrozdziale omówimy kilka narzędzi do przeglądania importowanych funkcji w pliku wykonywalnym.
Dołączanie statyczne, w czasie wykonywania i dynamiczne
Dołączanie statyczne jest najrzadziej stosowaną metodą łączenia bibliotek, chociaż jest powszechnie stosowana w programach dla Uniksa i Linuksa. Gdy biblioteka jest dołączana statycznie z plikiem wykonywalnym, cały kod z tej biblioteki jest kopiowany do pliku wykonywalnego, co powoduje zwiększenie jego rozmiaru. Analizując kod, trudno jest odróżnić kod dołączony statycznie od własnego kodu pliku wykonywalnego, ponieważ nic w nagłówku pliku PE nie wskazuje, że plik zawiera dołączony kod.
Chociaż niepopularne w nieszkodliwych programach, dołączanie w czasie wykonywania jest powszechnie stosowane w malware, zwłaszcza gdy jest spakowane lub zaciemnione. Pliki wykonywalne, które używają dołączania w czasie wykonywania, łączą się z bibliotekami tylko wtedy, gdy dana funkcja jest potrzebna, a nie na początku programu, jak w przypadku programów wykorzystujących dołączanie dynamiczne.
Kilka funkcji systemu Microsoft Windows pozwala programistom importować dołączane funkcje nie znajdujące się w nagłówku pliku programu. Spośród nich najczęściej są używane LoadLibrary i GetProcAddress. Wykorzystywane są także LdrGetProcAddress i LdrLoadDll. LoadLibrary i GetProcAddress umożliwiają programowi dostęp do dowolnej funkcji w dowolnej bibliotece w systemie, co oznacza, że gdy te funkcje są używane, nie można statycznie stwierdzić, z którymi funkcjami łączy się podejrzany program.
Ze wszystkich metod linkowania dołączanie dynamiczne jest najczęstszym i najbardziej interesującym dla analityków malware. Gdy biblioteki są dołączane dynamicznie, po załadowaniu programu system operacyjny hosta szuka niezbędnych bibliotek. Gdy program wywołuje funkcję z dołączonej biblioteki, funkcja ta jest wykonywana w tej bibliotece.
Nagłówek pliku PE przechowuje informacje o każdej bibliotece, która będzie załadowana, i o każdej funkcji, która będzie używana przez program. Użyte biblioteki i wywoływane funkcje są często najważniejszymi częściami programu, a ich identyfikacja jest szczególnie ważna, ponieważ pozwala odgadnąć, co robi program. Jeśli na przykład program importuje funkcję URLDownloadToFile, możemy przypuszczać, że łączy się on z internetem, aby pobrać zawartość, którą następnie zapisze w pliku lokalnym.
Eksplorowanie funkcji dołączanych dynamicznie za pomocą Dependency Walker
Program Dependency Walker (http://www.dependencywalker.com/), rozpowszechniany z niektórymi wersjami Microsoft Visual Studio i innymi pakietami programistycznymi Microsoftu, dla pliku wykonywalnego wyświetla tylko funkcje dołączane dynamicznie.
Rysunek 1.6 pokazuje analizę SERVICES.EX_ wykonaną przez Dependency Walker. Lewy panel w pokazuje program oraz importowane biblioteki DLL, a mianowicie KERNEL32.DLL i WS2_32.DLL.
Rysunek 1.6. Program Dependency Walker
Kliknięcie KERNEL32.DLL pokazuje w prawym górnym panelu jego zaimportowane funkcje. Widzimy kilka funkcji, ale najciekawszą jest CreateProcessA, która mówi nam, że program prawdopodobnie utworzy inny proces, i sugeruje, że podczas uruchamiania programu powinniśmy uważać na uruchomienie dodatkowych programów.
Środkowy prawy panel pokazuje wszystkie funkcje KERNEL32.DLL, które mogą być zaimportowane - informacje, które nie są dla nas szczególnie przydatne. Zwróćmy uwagę na kolumnę w panelach i oznaczoną jako Ordinal. Pliki wykonywalne mogą importować funkcje według wartości porządkowej zamiast po nazwie. Podczas importowania funkcji według wartości porządkowej nazwa funkcji nigdy nie pojawia się w oryginalnym pliku wykonywalnym i analitykowi może być trudniej się zorientować, która funkcja jest używana. Gdy malware importuje funkcję według wartości porządkowej, możemy się dowiedzieć, która funkcja jest importowana, patrząc na wartość porządkową w okienku .
Dwa dolne panele ( i ) zawierają dodatkowe informacje o wersjach bibliotek DLL, które zostałyby załadowane - odpowiednio - jeśli uruchomilibyśmy program i zostałyby zgłoszone błędy.
Biblioteki DLL programu mogą wiele powiedzieć o jego funkcjonalnościach. W tabeli 1.1 wymieniono typowe biblioteki DLL i to, co one mówią na temat aplikacji.
Tabela 1.1. Typowe DDL-e
DLL
Opis biblioteki
Kernel32.dll
bardzo powszechna biblioteka DLL; zawiera podstawowe funkcje, takie jak dostęp i manipulowanie pamięcią, plikami i sprzętem
Advapi32.dll
zapewnia dostęp do zaawansowanych i ważnych składników systemu Windows, takich jak Menedżer Usług i Rejestr
User32.dll
zawiera wszystkie komponenty interfejsu użytkownika, takie jak przyciski, paski przewijania i komponenty do kontrolowania działań użytkownika oraz reagowania na nie
Gdi32.dll
zawiera funkcje do wyświetlania i manipulowania grafiką
Ntdll.dll
jest interfejsem do jądra systemu Windows; pliki wykonywalne na ogół nie importują tego pliku bezpośrednio, chociaż zawsze jest on importowany pośrednio przez Kernel32.dll; jeśli plik wykonywalny importuje ten plik, oznacza to, że autor zamierzał użyć funkcji normalnie niedostępnych dla programów Windows; z tego interfejsu będą korzystać niektóre działania, takie jak ukrywanie funkcji lub manipulowanie procesami
WSock32.dll i Ws2_32.dll
sieciowe biblioteki DLL; program, który uzyskuje dostęp do jednej z nich, najprawdopodobniej łączy się z siecią lub wykonuje działania za jej pośrednictwem
Wininet.dll
zawiera funkcje sieciowe wyższego poziomu, które implementują protokoły, takie jak FTP, HTTP i NTP
Konwencje nazewnictwa funkcji
Podczas oceny nieznanych funkcji systemu Windows warto zwrócić uwagę na kilka konwencji nazewnictwa, ponieważ pojawiają się one często i mogą być mylące, jeśli ich nie rozpoznamy. Na przykład często występują nazwy funkcji z przyrostkiem Ex, takie jak CreateWindowEx. Gdy Microsoft aktualizuje funkcję, a nowa jest niezgodna ze starą, Microsoft nadal obsługuje starą funkcję. Nowa funkcja ma taką samą nazwę jak stara funkcja z dodanym przyrostkiem Ex. Funkcje, które zostały znacząco zaktualizowane dwukrotnie, mają w nazwie dwa przyrostki Ex.
Wiele funkcji, które jako parametry przyjmują łańcuchy, zawierają A lub W na końcu swoich nazw. Przykładem jest CreateDirectoryW. Ten znak nie pojawia się w dokumentacji funkcji - oznacza po prostu, że funkcja akceptuje parametr będący łańcuchem i że istnieją dwie różne wersje funkcji: jedna dla łańcuchów ASCII i druga dla łańcuchów z najszerszym zestawem znaków. Należy pamiętać o pominięciu końcowej litery A lub W podczas wyszukiwania funkcji w dokumentacji Microsoftu.
Importowane funkcje
Nagłówek pliku PE zawiera także informacje o specyficznych funkcjach używanych przez plik wykonywalny. Nazwy tych funkcji systemu Windows mogą dać nam dobre wyobrażenie o tym, co robi dany plik wykonywalny. Microsoft doskonale dokumentuje interfejs Windows API za pomocą biblioteki Microsoft Developer Network (MSDN). (W załączniku A znajduje się również lista funkcji często używanych przez złośliwe oprogramowanie).
Eksportowane funkcje
Podobnie jak w przypadku importowania, biblioteki DLL i pliki EXE eksportują funkcje w celu interakcji z innymi programami i kodem. Biblioteka DLL zazwyczaj implementuje jedną lub więcej funkcji i eksportuje je do wykorzystania przez plik wykonywalny, który może je następnie zaimportować i wykorzystać.
Plik PE zawiera informacje o tym, które funkcje eksportuje plik. Ponieważ biblioteki DLL są specjalnie tworzone w celu zaoferowania funkcjonalności wykorzystywanej przez pliki EXE, eksportowane funkcje są najczęściej spotykane w bibliotekach DLL. Pliki EXE nie są zaprojektowane w celu zapewnienia funkcjonalności dla innych plików EXE, a eksportowanie funkcji jest rzadkie. Jeśli w pliku wykonywalnym odkryjemy eksport, często może on nam dostarczyć użytecznych informacji.
W wielu przypadkach twórcy oprogramowania nazywają swoje eksportowane funkcje w sposób, który dostarcza użytecznych informacji. Jedną z powszechnych konwencji jest używanie nazw stosowanych w dokumentacji Microsoftu. Aby na przykład uruchomić program jako usługę, musimy najpierw zdefiniować funkcję ServiceMain. Obecność eksportowanej funkcji o nazwie ServiceMain informuje, że złośliwe oprogramowanie działa jako usługa.
Niestety, choć dokumentacja Microsoft nazywa tę funkcję ServiceMain, a programiści zazwyczaj nazywają ją tak samo, to taka funkcja może mieć dowolną nazwę. Dlatego nazwy eksportowanych funkcji mają w rzeczywistości ograniczone zastosowanie w przypadku wyrafinowanego złośliwego oprogramowania. Jeśli malware korzysta z eksportu, często albo całkowicie pomija nazwy, albo używa nazw niejasnych lub wprowadzających w błąd.
Możemy wyświetlić informacje o eksporcie za pomocą programu Dependency Walker omówionego w "Eksplorowaniu funkcji dołączanych dynamicznie za pomocą Dependency Walker" na stronie 16. Aby wyświetlić listę eksportowanych funkcji, należy kliknąć nazwę pliku, który chcemy zbadać. Na rysunku 1.6 okienko pokazuje wszystkie funkcje eksportowane w pliku.
Analiza statyczna w praktyce
Teraz, gdy poznaliśmy już podstawy analizy statycznej, przeanalizujmy prawdziwe malware. Przyjrzyjmy się potencjalnemu keyloggerowi, a następnie spakowanemu programowi.
PotentialKeylogger.exe - rozpakowany plik wykonywalny
Tabela 1.2 pokazuje skróconą listę funkcji importowanych przez PotentialKeylogger.exe, zebranych za pomocą Dependency Walker. Ponieważ widzimy tak wiele importów, od razu możemy stwierdzić, że ten plik nie jest spakowany.
Tabela 1.2. Skrócona lista bibliotek DLL i funkcji importowanych w PotentialKeylogger.exe
Kernel32.dll
User32.dll
User32.dll (kontynuacja)
CreateDirectoryW
BeginDeferWindowPos
ShowWindow
CreateFileW
CallNextHookEx
ToUnicodeEx
CreateThread
CreateDialogParamW
TrackPopupMenu
DeleteFileW
CreateWindowExW
TrackPopupMenuEx
ExitProcess
DefWindowProcW
TranslateMessage
FindClose
DialogBoxParamW
UnhookWindowsHookEx
FindFirstFileW
EndDialog
UnregisterClassW
FindNextFileW
GetMessageW
UnregisterHotKey
GetCommandLineW
GetSystemMetrics
GetCurrentProcess
GetWindowLongW
GDI32.dll
GetCurrentThread
GetWindowRect
GetStockObject
GetFileSize
GetWindowTextW
SetBkMode
GetModuleHandleW
InvalidateRect
SetTextColor
GetProcessHeap
IsDlgButtonChecked
GetShortPathNameW
IsWindowEnabled
Shell32.dll
HeapAlloc
LoadCursorW
CommandLineToArgvW
HeapFree
LoadIconW
SHChangeNotify
IsDebuggerPresent
LoadMenuW
SHGetFolderPathW
MapViewOfFile
MapVirtualKeyW
ShellExecuteExW
OpenProcess
MapWindowPoints
ShellExecuteW
ReadFile
MessageBoxW
SetFilePointer
RegisterClassExW
Advapi32.dll
WriteFile
RegisterHotKey
RegCloseKey
SendMessageA
RegDeleteValueW
SetClipboardData
RegOpenCurrentUser
SetDlgItemTextW
RegOpenKeyExW
SetWindowTextW
RegQueryValueExW
SetWindowsHookExW
RegSetValueExW
Podobnie jak większość programów średniej wielkości, ten plik wykonywalny zawiera bardzo dużo importowanych funkcji. Niestety, tylko niewielka część tych funkcji jest szczególnie interesująca w analizie malware. W tej książce zajmiemy się importami wykonywanymi przez malware, koncentrując się na najciekawszych funkcjach z punktu widzenia analizy złośliwego oprogramowania.
Jeśli nie mamy pewności, co robi dana funkcja, musimy ją sprawdzić. Aby pomóc w przeprowadzeniu analizy, załącznik A zawiera listę wielu funkcji najbardziej interesujących dla analityków złośliwego oprogramowania. Jeśli dana funkcja nie jest wymieniona w załączniku A, należy ją wyszukać w onlinowej witrynie MSDN.
Jako nowy analityk poświęcisz czas na wyszukiwanie wielu niezbyt interesujących funkcji, ale szybko zaczniesz się też uczyć, które funkcje mogą być ważne, a które nie. Na potrzeby tego przykładu pokażemy dużą liczbę importów, które nie mają wielkiego znaczenia, zaznajomimy się też zatem z patrzeniem na dużą ilość danych i skupianiem się na pewnych kluczowych perełkach informacji.
W normalnych warunkach nie wiedzielibyśmy, że to złośliwe oprogramowanie jest potencjalnym keyloggerem i musielibyśmy szukać funkcji, które dostarczą nam pewnych wskazówek. Dlatego będziemy się koncentrować tylko na funkcjach, które dostarczają informacji dotyczących funkcjonalności programu.
Import Kernel32.dll w tabeli 1.2 mówi nam, że to oprogramowanie może otwierać i manipulować procesami (za pomocą OpenProcess, GetCurrentProcess i GetProcessHeap) oraz plikami (za pomocą ReadFile, CreateFile i WriteFile). Funkcje FindFirstFile i FindNextFile są szczególnie interesujące i możemy ich użyć do przeszukiwania katalogów.
Jeszcze bardziej interesujący jest import z User32.dll. Duża liczba funkcji manipulacyjnych GUI (takich jak RegisterClassEx, SetWindowText i ShowWindow) wskazuje na wysokie prawdopodobieństwo, że ten program ma GUI (chociaż GUI niekoniecznie musi być wyświetlane użytkownikowi).
Funkcja SetWindowsHookEx jest powszechnie używana w programach szpiegujących i jest najpopularniejszym sposobem, w jaki keyloggery przechwytują dane z klawiatury. Ta funkcja ma również zasadne zastosowania, ale jeśli podejrzewamy, że mamy do czynienia z malware i widzimy tę funkcję, to prawdopodobnie patrzymy na funkcję keyloggera.
Interesująca jest również funkcja RegisterHotKey. Rejestruje klawisz skrótu (taki jak CTRL-SHIFT-P), dzięki czemu za każdym razem, gdy użytkownik naciśnie pewną kombinację klawiszy, aplikacja jest powiadamiana. Bez względu na to, która aplikacja jest aktualnie aktywna, klawisz skrótu przeniesie użytkownika do tej aplikacji.
Importy z GDI32.dll są związane z grafiką, co po prostu potwierdza, że program prawdopodobnie ma GUI. Importy z Shell32.dll informują nas, że ten program może uruchamiać inne programy - jest to cecha wspólna zarówno dla złośliwego oprogramowania, jak i normalnych programów.
Import z Advapi32.dll mówi nam, że ten program używa rejestru, z czego z kolei wynika, że powinniśmy szukać łańcuchów, które wyglądają jak klucze rejestru. Ścieżki rejestru przypominają katalogi. W tym przypadku znaleźliśmy łańcuch Software\Microsoft\Windows\CurrentVersion\Run, który jest kluczem rejestru (często używanym przez złośliwe oprogramowanie) kontrolującym, które programy są uruchamiane automatycznie podczas startu systemu Windows.
Ten plik wykonywalny zawiera również kilka eksportów: LowLevelKeyboardProc i LowLevelMouseProc. Dokumentacja Microsoftu mówi: "Procedura podpięcia LowLevelKeyboardProc jest funkcją wywołania zwrotnego zdefiniowaną na poziomie aplikacji lub biblioteki, używaną wraz z funkcją SetWindowsHookEx". Innymi słowy, funkcja ta jest używana wraz z SetWindowsHookEx w celu określenia, która funkcja będzie wywoływana, gdy wystąpi określone zdarzenie - w tym przypadku niskopoziomowe zdarzenie związane z klawiaturą. Dokumentacja SetWindowsHookEx wyjaśnia dalej, że ta funkcja zostanie wywołana, gdy wystąpią pewne niskopoziomowe zdarzenia związane z klawiaturą.
Dokumentacja Microsoft używa nazwy LowLevelKeyboardProc, a programista tej aplikacji w tym przypadku uczynił tak samo. Dzięki temu jesteśmy w stanie uzyskać cenne informacje, ponieważ programista nie zaciemnił nazwy eksportu.
Korzystając z informacji uzyskanych z analizy statycznej tych importów i eksportów, możemy wyciągnąć istotne wnioski oraz sformułować hipotezy dotyczące tego złośliwego oprogramowania. Po pierwsze, wydaje się prawdopodobne, że jest to lokalny keylogger, który używa SetWindowsHookEx do rejestrowania naciśnięć klawiszy. Możemy także przypuszczać, że ma GUI, które jest wyświetlane tylko dla konkretnego użytkownika, i że skrót klawiszowy zarejestrowany za pomocą RegisterHotKey określa skrót klawiszowy, którego używa atakujący, aby zobaczyć GUI keyloggera i uzyskać dostęp do zarejestrowanych naciśnięć klawiszy. Możemy dalej spekulować na podstawie działań dotyczących rejestru oraz istnienia Software\Microsoft\Windows\CurrentVersion\Run, że program modyfikuje go tak, aby był ładowany podczas uruchamiania systemu.
PackedProgram.exe - ślepy zaułek
Tabela 1.3 pokazuje pełną listę funkcji importowanych przez drugi przypadek nieznanego malware. Zwięzłość tej listy mówi, że ten program jest spakowany lub zaciemniony, co dodatkowo potwierdza fakt, że ten program nie zawiera czytelnych łańcuchów. Kompilator Windows nie utworzyłby programu, który importuje tak małą liczbę funkcji; nawet program Hello, World miałby ich więcej.
Tabela 1.3. DLL i funkcje importowane w PackedProgram.exe
Kernel32.dll
User32.dll
GetModuleHandleA
MessageBoxA
LoadLibraryA
GetProcAddress
ExitProcess
VirtualAlloc
VirtualFree
Fakt, że ten program jest spakowany, jest cenną informacją, ale jego spakowany charakter uniemożliwia nam również zdobycie wiedzy na temat programu za pomocą podstawowej analizy statycznej. Będziemy musieli użyć bardziej zaawansowanych technik analizy, takich jak analiza dynamiczna (opisana w rozdz. 3) lub rozpakowanie (opisane w rozdz. 18).
Nagłówki i sekcje plików PE
Nagłówki plików PE mogą zawierać znacznie więcej informacji niż tylko importy. Format pliku PE zawiera nagłówek, a po nim serię sekcji. Nagłówek zawiera metadane dotyczące samego pliku. Po nagłówku znajdują się rzeczywiste sekcje pliku, z których każda zawiera przydatne informacje. W miarę postępów będziemy w książce kolejno omawiać strategie przeglądania informacji w każdej z tych sekcji. Oto najczęstsze i najciekawsze sekcje w pliku PE:
.text - zawiera instrukcje wykonywane przez procesor; wszystkie pozostałe sekcje przechowują dane i informacje pomocnicze; zasadniczo jest to jedyna sekcja, którą można wykonać, i powinna być jedyną sekcją zawierającą kod;
.rdata - zazwyczaj zawiera informacje dotyczące importów i eksportów, które są tymi samymi informacjami dostępnymi dla narzędzi Dependency Walker i PEview; mogą się w niej również znajdować inne dane tylko do odczytu używane przez program; czasami plik będzie zawierać sekcje .idata oraz .edata przechowujące informacje o importach i eksportach (zobacz tab. 1.4);
.data - zawiera globalne dane programu, które są dostępne z dowolnego miejsca w programie; lokalne dane nie są przechowywane w tej sekcji ani nigdzie indziej w pliku PE (omówimy ten temat w rozdz. 6);
.rsrc - zawiera zasoby używane przez plik wykonywalny, które nie są uważane za jego części, takie jak ikony, obrazy, menu i łańcuchy; łańcuchy mogą być przechowywane w sekcji .rsrc lub w głównym programie, ale często są umieszczane właśnie tutaj w celu obsługi wielu języków.
Nazwy sekcji są często spójne w ramach tego samego kompilatora, ale mogą być różne w różnych kompilatorach. Na przykład Visual Studio dla kodu wykonywalnego używa .text, Borland Delphi zaś używa CODE. System Windows nie dba o rzeczywistą nazwę, ponieważ wykorzystuje bardziej szczegółowe informacje znajdujące się w nagłówku PE, aby określić sposób użycia sekcji. Co więcej, aby utrudnić analizę nazwy sekcji są czasami zaciemnione. Na szczęście najczęściej są używane nazwy domyślne. Tabela 1.4 zawiera listę tych najczęściej spotykanych.
Tabela 1.4. Sekcje pliku PE dla pliku wykonywalnego w systemie Windows
Sekcja pliku wykonywalnego
Opis
.text
zawiera kod wykonywalny
.rdata
przechowuje dane tylko do odczytu dostępne globalnie w programie
.data
przechowuje globalne dane dostępne w całym programie
.idata
występuje czasami i zawiera informacje o importowanych funkcjach; jeśli ta sekcja nie jest obecna, informacje o importowanych funkcjach będą się znajdować w sekcji .rdata
.edata
występuje czasami i zawiera informacje o eksportowanych funkcjach; jeśli ta sekcja nie jest obecna, informacje o eksportowanych funkcjach będą się znajdować w sekcji .rdata
.pdata
występuje tylko w 64-bitowych plikach wykonywalnych i przechowuje informacje dotyczące obsługi wyjątków
.rsrc
przechowuje zasoby potrzebne dla pliku wykonywalnego
.reloc
zawiera informacje dotyczące relokacji plików bibliotek
Badanie plików PE za pomocą PEview
Format pliku PE przechowuje ciekawe informacje w nagłówku. Jak pokazano na rysunku 1.7, do przeglądania tych informacji możemy użyć narzędzia PEview.
Na rysunku lewy panel wyświetla główne części nagłówka PE. Pozycja IMAGE_FILE_HEADER jest podświetlona, ponieważ jest aktualnie zaznaczona.
Pierwsze dwie części nagłówka PE - IMAGE_DOS_HEADER i MS-DOS Stub Program są historyczne i nie dostarczają nam żadnych informacji, które mogłyby nas szczególnie zainteresować.
Następna sekcja nagłówka PE, IMAGE_NT_HEADERS, pokazuje nagłówki NT. Sygnatura jest zawsze taka sama i można ją zignorować.
Wpis IMAGE_FILE_HEADER, podświetlony w prawym panelu , zawiera podstawowe informacje o pliku. Etykieta Time Date Stamp w informuje, kiedy ten plik wykonywalny został skompilowany, co może być bardzo przydatne w analizie złośliwego oprogramowania i reagowaniu na incydenty. Na przykład odległy czas kompilacji sugeruje, że jest to starszy atak, a programy antywirusowe mogą zawierać sygnatury dla tego złośliwego oprogramowania. Bliski czas kompilacji sugeruje odwrotność.
Rysunek 1.7. Podgląd IMAGE_FILE_HEADER w programie PEview
Czas kompilacji jest nieco problematyczny. Wszystkie programy Delphi jako czasu kompilacji używają 19 czerwca 1992 roku. Jeśli zobaczymy ten czas kompilacji, to prawdopodobnie będziemy mieli do czynienia z programem w Delphi i w rzeczywistości nie będziemy wiedzieć, kiedy został on faktycznie skompilowany. Ponadto, kompetentny twórca malware może łatwo sfałszować czas kompilacji. Jeśli zobaczymy czas kompilacji, który nie ma sensu, to prawdopodobnie został on sfałszowany.
Sekcja IMAGE_OPTIONAL_HEADER zawiera kilka ważnych informacji. Etykieta Subsystem wskazuje, czy jest to program działający z konsoli czy z GUI. Programy konsolowe mają wartość IMAGE_SUBSYSTEM_WINDOWS_CUI i działają w oknie poleceń. Programy z GUI mają wartość IMAGE_SUBSYSTEM_WINDOWS_GUI i działają w systemie Windows. Używane są również mniej popularne podsystemy, takie jak Native lub Xbox.
Najciekawsze informacje pochodzą z nagłówków sekcji znajdujących się w IMAGE_SECTION_HEADER, co pokazano na rysunku 1.8. Te nagłówki służą do opisania każdej sekcji pliku PE. To kompilator generalnie tworzy i nazywa sekcje pliku wykonywalnego, a użytkownik ma niewielką kontrolę nad tymi nazwami. W rezultacie sekcje są zwykle spójne między plikami wykonywalnymi (zobacz tab. 1.4), a wszelkie odchylenia mogą być podejrzane.
Na przykład (rys. 1.8) Virtual Size mówi nam, ile miejsca jest przydzielane sekcji podczas procesu ładowania. Size of Raw Data pokazuje, jak duża jest sekcja na dysku. Te dwie wartości powinny zwykle być równe, ponieważ dane powinny zajmować tyle samo miejsca na dysku co w pamięci. Małe różnice są normalne i wynikają z różnic między wyrównaniem w pamięci i na dysku.
Rozmiary sekcji mogą być przydatne w wykrywaniu spakowanych plików wykonywalnych. Jeśli na przykład Virtual Size jest znacznie większy niż Size of Raw Data, to wiemy, że sekcja zajmuje więcej miejsca w pamięci niż na dysku. Często wskazuje to na spakowany kod, szczególnie jeśli sekcja .text zajmuje więcej miejsca pamięci niż na dysku.
Rysunek 1.8. Podgląd IMAGE_SECTION_HEADER sekcji .text w programie PEview
Tabela 1.5 pokazuje sekcje z PotentialKeylogger.exe. Jak widać, każda z sekcji .text, .rdata i .rsrc ma Virtual Size i Size of Raw Data takiego samego rozmiaru. Sekcja .data może się wydawać podejrzana, ponieważ ma znacznie większy rozmiar sekcji po załadowaniu do pamięci niż rozmiar sekcji w pliku, ale jest to normalne w przypadku tej sekcji w programach Windows. Pamiętajmy jednak, że sama ta informacja nie mówi nam, że program nie jest złośliwy; pokazuje po prostu, że prawdopodobnie nie jest on spakowany i że nagłówek pliku PE został wygenerowany przez kompilator.
Tabela 1.5. Informacje o sekcjach PotentialKeylogger.exe
Sekcja
Rozmiar wirtualny
Rozmiar sekcji
.text
7AF5
7C00
.data
17A0
0200
.rdata
1AF5
1C00
.rsrc
72B8
7400
Tabela 1.6 pokazuje sekcje PackedProgram.exe. Sekcje w tym pliku mają wiele anomalii: nietypowe są sekcje o nazwach Dijfpds, .sdfuok i Kijijl, sekcje .text, .data i .rdata zaś są podejrzane. Sekcja .text ma wartość Size of Raw Data równą 0, co oznacza, że nie zajmuje ona miejsca na dysku, a jej VirtualSize to A000, co oznacza, że miejsce zostanie przydzielone dla segmentu .text. To mówi nam, że kod wykonywalny zostanie rozpakowany do zaalokowanej sekcji .text.
Tabela 1.6. Informacje o sekcjach PackedProgram.exe
Sekcja
Rozmiar wirtualny
Rozmiar sekcji
.text
A000
0000
.data
3000
0000
.rdata
4000
0000
.rsrc
19000
3400
Dijfpds
20000
0000
.sdfuok
34000
3313F
Kijijl
1000
0200
Podgląd sekcji zasobów za pomocą Resource Hackera
Teraz, gdy skończyliśmy przeglądać nagłówek pliku PE, możemy przyjrzeć się niektórym innym sekcjom. Jedyną sekcją, którą możemy zbadać bez dodatkowej wiedzy z późniejszych rozdziałów, jest sekcja dotycząca zasobów. Aby przejrzeć sekcję .rsrc, możemy skorzystać z bezpłatnego narzędzia Resource Hacker dostępnego na stronie http://www.angusj.com/. Klikając elementy Resource Hackera, będziemy mogli zobaczyć łańcuchy, ikony i menu. Wyświetlane menu są identyczne z tymi używanymi przez program. Rysunek 1.9 pokazuje ekran Resource Hackera dla windowsowego programu Kalkulator - calc.exe.
Rysunek 1.9. Wygląd okna Resource Hackera dla calc.exe
Panel po lewej stronie pokazuje wszystkie zasoby zawarte w tym pliku wykonywalnym. Każdy główny folder pokazany w lewym okienku reprezentuje inny typ zasobu. Istotne sekcje do analizy złośliwego oprogramowania zawierają:
- sekcja Icon zawiera listę obrazów wyświetlanych wtedy, gdy plik wykonywalny pojawia się na liście plików;
- sekcja Menu przechowuje wszystkie menu pojawiające się w różnych oknach, takich jak menu Plik, Edycja i Widok; zawiera nazwy wszystkich menu, a także tekst pokazywany dla każdego z nich; nazwy powinny dać nam dobry pogląd na ich funkcjonalności;
- sekcja Dialog zawiera menu dialogowe programu; okno dialogowe pokazuje, co zobaczy użytkownik po uruchomieniu calc.exe; gdybyśmy nie wiedzieli nic więcej o calc.exe, moglibyśmy zidentyfikować go jako program typu kalkulator, po prostu patrząc na to okno dialogowe;
- sekcja String Table przechowuje łańcuchy znaków;
- sekcja Version Info zawiera numer wersji oraz często nazwę firmy i oświadczenie o prawach autorskich.
Sekcja .rsrc pokazana na rysunku 1.9 jest typowa dla aplikacji Windows i może zawierać wszystko to, czego wymaga programista.
UwagaMalware, a czasami także i nieszkodliwe oprogramowanie, często przechowują tutaj zagnieżdżony program lub sterownik, a przed uruchomieniem programu wyodrębniają wbudowany plik wykonywalny lub sterownik. Resource Hacker pozwala wyodrębnić te pliki do indywidualnej analizy.
Korzystanie z innych narzędzi dla plików PE
Do przeglądania nagłówka PE dostępnych jest wiele innych narzędzi. Dwa najbardziej przydatne narzędzia to PEBrowse Professional i PE Explorer.
PEBrowse Professional (http://www.smidgeonsoft.prohosting.com/pebrowsepro-file-viewer.html) jest podobny do PEview. Pozwala na podgląd bajtów z każdej sekcji oraz pokazuje przeanalizowane dane. PEBrowse Professional najlepiej radzi sobie z prezentowaniem informacji z sekcji dotyczącej zasobów (.rsrc).
PE Explorer (http://www.heaventools.com/) ma bogaty interfejs graficzny, który pozwala poruszać się po różnych częściach pliku PE. Możemy edytować niektóre części pliku PE, a zawarty w nim edytor zasobów doskonale nadaje się do przeglądania i edycji zasobów pliku. Główną wadą tego narzędzia jest to, że nie jest ono darmowe.
Podsumowanie nagłówka Pe
Nagłówek PE zawiera przydatne informacje dla analityka malware i będziemy nadal je analizować w kolejnych rozdziałach. Tabela 1.7 zawiera przegląd kluczowych informacji, które można uzyskać z nagłówka PE.
Tabela 1.7. Informacje w nagłówku PE
Pole
Ujawniane informacje
Importy
funkcje z innych bibliotek używane przez malware
Eksporty
funkcje malware, które mogą być wywoływane przez inne programy lub biblioteki
Znacznik czasu
czas kompilacji programu
Sekcje
nazwy sekcji w pliku oraz ich rozmiary na dysku i w pamięci
Podsystem
wskazanie, czy program jest aplikacją wiersza poleceń, czy zawiera GUI
Zasoby
łańcuchy, ikony, menu i inne informacje zawarte w pliku
Podsumowanie
Korzystając z zestawu stosunkowo prostych narzędzi, możemy przeprowadzić analizę statyczną malware i uzyskać pewien wgląd w jego działanie. Ale analiza statyczna jest zazwyczaj tylko pierwszym krokiem i zwykle konieczne są dalsze badania. Następnym krokiem jest skonfigurowanie bezpiecznego środowiska, w którym można uruchomić złośliwe oprogramowanie i przeprowadzić podstawową analizę dynamiczną, co zobaczymy w dwóch kolejnych rozdziałach.
Laboratoria
Celem laboratoriów jest umożliwienie ćwiczenia umiejętności przedstawionych w danym rozdziale. Aby zasymulować realistyczną sytuację analizy złośliwego oprogramowania, otrzymasz niewiele informacji o analizowanym programie lub nie otrzymasz ich wcale. Podobnie jak we wszystkich laboratoriach w tej książce, plikom laboratoryjnym przeznaczonym do analizy statycznej nadano nazwy ogólne, w celu symulacji nieznanego typu malware, które zazwyczaj używa nazw nie mających konkretnego sensu lub wprowadzających w błąd.
Każde laboratorium składa się ze złośliwego pliku, kilku pytań, krótkich odpowiedzi na pytania i szczegółowej analizy złośliwego oprogramowania. Rozwiązania laboratoriów są zawarte w załączniku C.
Laboratoria zawierają dwie sekcje odpowiedzi. Pierwsza część składa się z krótkich odpowiedzi, z których należy skorzystać, jeśli sam wykonałeś laboratorium i chcesz po prostu sprawdzić swoją pracę. Druga sekcja zawiera szczegółowe wyjaśnienia wraz z naszym rozwiązaniem wartym naśladowania, a także informacje, w jaki sposób znaleźliśmy odpowiedzi na pytania zadane w danym laboratorium.
Laboratorium 1.1
To laboratorium bazuje na plikach Lab01-01.exe i Lab01-01.dll. Skorzystaj z narzędzi i technik opisanych w tym rozdziale, aby uzyskać informacje o plikach i odpowiedzieć na poniższe pytania.
Pytania
1. Załaduj pliki na http://www.VirusTotal.com/ i obejrzyj raporty. Czy któryś z plików pasuje do istniejących sygnatur antywirusowych?
2. Kiedy te pliki zostały skompilowane?
3. Czy istnieją oznaki, że któryś z tych plików jest spakowany lub zaciemniony? Jeśli tak, to co na to wskazuje?
4. Czy jakiekolwiek importy wskazują na to, co robi to malware? Jeśli tak, to które to są importy?
5. Czy są jakieś inne pliki lub indykatory hostowe, których można poszukiwać w zainfekowanych systemach?
6. Jakich indykatorów sieciowych można użyć do znalezienia tego złośliwego oprogramowania na zainfekowanych maszynach?
7. Jak myślisz, jaki jest cel tych plików?
Laboratorium 1.2
Przeanalizuj plik Lab01-02.exe.
Pytania
1. Załaduj plik Lab01-02.exe na http://www.VirusTotal.com/. Czy wykazuje on jakąś zgodność z istniejącymi sygnaturami antywirusowymi?
2. Czy są jakieś oznaki, że ten plik jest spakowany lub zaciemniony? Jeśli tak, to co na to wskazuje? Jeśli plik jest spakowany, rozpakuj go, jeśli to możliwe.
3. Czy jakiekolwiek importy sugerują funkcjonalności tego programu? Jeśli tak, to które to są importy i co nam mówią?
4. Jakie indykatory sieciowe lub hostowe mogą być użyte do identyfikacji tego złośliwego oprogramowania na zainfekowanych maszynach?
Laboratorium 1.3
Przeanalizuj plik Lab01-03.exe.
Pytania
1. Załaduj plik Lab01-03.exe na http://www.VirusTotal.com/. Czy pasuje on do istniejących sygnatur antywirusowych?
2. Czy są jakieś oznaki, że ten plik jest spakowany lub zaciemniony? Jeśli tak, to co na to wskazuje? Jeśli plik jest spakowany, rozpakuj go, jeśli to możliwe.
3. Czy jakiekolwiek importy sugerują funkcjonalności tego programu? Jeśli tak, to które to są importy i co nam mówią?
4. Jakie indykatory sieciowe lub hostowe mogą być użyte do identyfikacji tego złośliwego oprogramowania na zainfekowanych maszynach?
Laboratorium 1.4
Przeanalizuj plik Lab01-04.exe.
Pytania
1. Załaduj plik Lab01-04.exe na http://www.VirusTotal.com/. Czy pasuje on do istniejących sygnatur antywirusowych?
2. Czy są jakieś oznaki, że ten plik jest spakowany lub zaciemniony? Jeśli tak, to co na to wskazuje? Jeśli plik jest spakowany, rozpakuj go, jeśli to możliwe.
3. Kiedy ten pliki został skompilowany?
4. Czy jakiekolwiek importy sugerują funkcjonalności tego programu? Jeśli tak, to które to są importy i co nam mówią?
5. Jakie indykatory sieciowe lub hostowe mogą być użyte do identyfikacji tego złośliwego oprogramowania na zainfekowanych maszynach?
6. Ten plik zawiera jeden zasób w sekcji zasobów. Użyj Resource Hacker, aby zbadać ten zasób, a następnie użyj go do jego wyodrębnienia. Czego możesz się dowiedzieć na podstawie tego zasobu?