Adam Blaszczyk - Wirusy.doc

(675 KB) Pobierz
Wirusy

 

SPIS ROZDZIAŁÓW

 

Wstęp ............................................ XV

Rozdział 1. Podstawowe wiadomości o wirusach ..............................1

Rozdział 2. Rodzaje wirusów ..............................................................5

Rozdział 3. Podział wirusów ze względu na sposób działania po   uruchomieniu ..................................................................17

Rozdział 4. Obiekty atakowane przez wirusy ....................................33

Rozdział 5. Instalacja w pamięci operacyjnej ....................................97

Rozdział 6. Przejmowanie przerwań i znajdowanie czystych wejść do    systemu ........................................................................109

Rozdział 7. Ukrywanie się w systemie operacyjnym .......................143

Rozdział 8. Szyfrowanie kodu ..........................................................173

Rozdział 9. Inne mechanizmy stosowane przez wirusy ...................213

Rozdział 10. Przyszłość wirusów .......................................................235

Rozdział 11. Rodzaje programów antywirusowych ............................241

Rozdział 12. Techniki używane przez programy antywirusowe .........247

Rozdział 13. Konwencje stosowane przez programy antywirusowe -standard CARO ............................................................299

Rozdział 14. Profilaktyka antywirusowa ............................................311

Rozdział 15. Literatura .......................................................................319

 

SPIS TREŚCI

Wstęp              XV

Rozdział 1. Podstawowe wiadomości o wirusach ..........              1

1.1. Co to jest i jak działa wirus komputerowy ...............................              3

1.2. Języki programowania wykorzystane do pisania wirusów ......              4

Rozdział 2. Rodzaje wirusów ..........................................              5

2.1. Wirusy pasożytnicze (ang. parasite infectors) .......................              7

2.2. Wirusy towarzyszące (ang. companion infectors) .................              8

2.3. Wirusy plików wsadowych (ang. batchviruses).......................              12

2.4. Makrowirusy, wirusy makrosów (ang. macroviruses) ..............              13

2.5. Generatory wirusów ................................................................              14

2.6. Robaki (ang. worms) ..............................................................              14

2.7. Konie trojańskie (ang. trojan horses) ......................................              14

2.8. Bomby logiczne (ang. logical bombs)......................................              15

Rozdział 3. Podział wirusów ze względu na sposób działania

po uruchomieniu ............................................................              17

3.1. Wirusy nierezydentne (ang. non-resident yiruses) ...............              19

3.2. Wirusy rezydentme (ang. resident viruses) ..........................              21

3.2.1. Szybkie infektory (ang. fast infectors) ..................................              31

3.2.2. Wolne infektory (ang. slow infectors) ...................................              32

Rozdział 4. Obiekty atakowane przez wirusy ..................              33

4.1. Pliki...................................................................................35

4.1.1. Pliki wykonywalne COM .............................              35

4.1.2. Pliki wykonywalne EXE ............................... 45

4.1.2.1. Pliki EXE dla systemu DOS (stare EXE) ..................... 45

4.1.2.2. Pliki EXE dla trybu chronionego (nowe EXE) ..................   57

4.1.2.2.1. Pliki EXE dla Windows (NE) .............................              59

4.1.3. Pliki zawierające sterowniki urządzeń SYS (BIN, DRV) ....              66

4.1.4. Pliki systemowe DOS ...............................              75

4.1.4.1. Interpretator poleceń ....................................              75

4.1.4.2. Jądro systemu (ang, kemel infector) ........................              75

4.1.5. Pliki wsadowe BAT .................................              76

4.1.6. Pliki DOC .........................................              77

4.1.7. Pliki XLS..........................................              79

4.1.8. Pliki ASM .........................................              80

4.2. Sektory systemowe ..................................              86

4.2.1. Główny Rekord Ładujący (ang. Master Boot Record - MBR)              86

4.3. Rekord ładujący (ang. BOOt-sector).....................              92

4.4. Jednostki Alokacji Plików (JAP) (ang. dusters) ............              94

4.5. Wirusy kombinowane (ang. multipartition) ................              96

Rozdział 5. Instalacja w pamięci operacyjnej .............              97

5.1. Instalacja w tablicy wektorów przerwań ..................              99

5.2. Instalacja w obszarze zmiennych DOS ..................              100

5.3. Instalacja w pamięci poniżej 640kB i UMB ...............              100

5.4. Instalacja w pamięci HMA .............................              106

5.5. Nietypowe metody instalacji ...........................              107

5.5.1. Pamięć ekranu ....................................              107

5.5.2. Bufory dyskowe DOS ...............................              108

Rozdział 6. Przejmowanie przerwań i znajdowanie czystych

wejść do systemu ...................................              109

6.1. Najczęściej przejmowane i wykorzystywane przerwania .....              111

6.2. Wykorzystanie funkcji DOS ............................              117

6.3. Bezpośrednie zmiany w tablicy wektorów przerwań ,.,,,.,              118

6.4. Włączanie się do istniejącego łańcucha obsługi przerwania

i znajdowanie czystych wejść do systemu (ang. tunnelling) ....   119

6.4.1. Korzystanie ze stałych adresów w systemie (przerwania

21hl2Fh) ............................................   120

6.4.2. Wykorzystanie trybu krokowego procesora (ang. tracing)...       122

6.4.3. Tuneling rekursywny (ang, recursive tunnelling)...........       122

6.4.4. Trik 2F/13 ........................................      124

6.5. Wykorzystanie trybu chronionego .......................      141

6.6. Włączanie się jako program obsługi urządzenia ...........      142

Rozdział 7. Ukrywanie się w systemie operacyjnym ........    143

7.1. Technika stealth .....................................      145

7.1.1. Podawanie prawdziwych długości plików (ang, semi-stealth)       146

7.1.1.1. Polecenie DIR wywoływane z poziomu DOS .................   146

7.1.1.2. Programy nakładkowe używające krótkich nazw programów

(DOS, Windows 3.1)......................................  149

7.1.1.3. Programy wykorzystujące długie nazwy plików (Windows95)

oraz polecenie DIR wywoływane z poziomu okna Tryb MS-DOS .   150

7.1.2. Podawanie oryginalnych długości i zawartości plików

(ang.full stealth).......................................   152

7.1.3. Podawanie prawdziwej zawartości sektorów (ang. Sectorlevel stealth) ..............................................   169

7.1.4. Fałszowanie odczytywanych sektorów na etapie obsługi przerwań sprzętowych (ang. hardware level stealth) ...............   169

7.2. Modyfikacja CMOS-a .................................      170

7.3. Atrybut etykiet dysku (ang. VolumeID) ..................      171

7.4. Dodatkowe ścieżki na dyskach .........................      171

Rozdział 8. Szyfrowanie kodu .........................    173

8.1. Procedury szyfrujące kod .............................      177

8.2. Procedury dekodujące ................................      178

8.2.1. Polimorficzne procedury dekodujące ...................       179

8.2.1.1. Semi-polimorfizm ........................................   179

8.2.1.2. Pełny polimorfizm ........................................   193

Rozdział 9. Inne mechanizmy stosowane przez wirusy .....    213

9.1. Sposoby dostępu do dysków ..........................      215

9.2. Sztuczki antydebuggerowe, antydeasemblerowe, antyemulacyj-

ne i antyheurystyczne ....................................   227

9.3. Optymalizacje kodu ..................................      231

9.4. Retrostruktury (techniki anty-antywirusowe), czyli walka z zainstalowanymi monitorami antywirusowymi ....................   232

Rozdział 10. Przyszłość wirusów .........................  235

10.1. Wirusy dla różnych systemów (ang. multisystem, multiplatform

viruses) .............................................   237

10.2. Wirusy infekujące wewnątrzplikowo (ang, surface infectors)       238

10.3. Wirusy zmienne genetycznie (mutujące swój kod) ........      238

10.4. Wirusy infekujące nowe, nie infekowane dotychczas obiekty      239

Rozdział 11. Rodzaje programów antywirusowych .........    241

11.1. Skanery (ang. scaners) .............................      243

11.2. Monitory (ang. behaviour blockers, interceptors, resident

monitors) ............................................   243

11.3. Szczepionki (ang. disinfectors) .......................      244

11.4. Programy autoweryfikujące ..........................      244

11.5. Programy zliczające sumy kontrolne (ang. integniy checkers).     245

Rozdział 12. Techniki używane przez programy antywirusowe .......................................    247

12.1. Skaning ..........................................      249

12.2. Heurystycze wyszukiwanie wirusów ....................      272

12.3. Tryb krokowy ......................................     284

12.4. Emulacja procesora .................................      284

12.5. Przynęty (ang. baits, decoys) .........................      285

12.6. Odświeżanie programów systemowych w sektorach .......      285

12.7. Blokowanie programów używających trybu krokowego .....      286

12.8. Pobieranie wielkości pamięci operacyjnej ...............      291

Rozdział 13. Konwencje stosowane przez programy antywiru-

sowe - standard CARO ..............................              299

Rozdział 14. Profilaktyka antywirusowa ..................              311

14.1. Ochrona przed wirusami plików uruchamialnych .........              313

14.2. Ochrona przed bombami logicznymi i końmi trojańskimi ...              315

14.3. Ochrona przed makrowirusami ........................              316

Rozdział 15. Literatura ...............................              319

 

 

Wstęp

Tematem niiejszego opracowania są wirusy komputerowe jeden z najbardziej tajemniczych i kontrowersyjnych tworów istniejących w świecie komputerów.

Od początku swego istnienia wirusy komputerowe były owiane mgłą tajemnicy zaś ich twórców uznawano za ludzi wiedzących znacznie więcej niż zwykli śmiertelnicy. Tymczasem wirus to zwykły program komputerowy który choć może bardziej wyrafinowany od innych jest na pewno o wiele łatwiejszy do napisania niż jakakolwiek aplikacja użytkowa czy gra.

Większość spotykanych wirusów to prymitywne przeróbki, bazujące na istniejących od dawna, klasycznych już i uznawanych za wzorcowe wirusach, takich Jak Jerusalem, Vienna, Stoned, Vacsina czy wirusy Dark Avengera. Przeróbki ograniczają się najczęściej do zmiany tekstu wewnątrz wirusa lub ewentualnie sekwencji kodu, czego wynikiem jest kolejna z licznych mutacji znanego wirusa. Oprócz nich istnieje bardzo mała grupa wirusów, których pojawienie się na komputerowej scenie wiązało się z zastosowaniem przez ich autorów nowych, nieznanych jeszcze nikomu sztuczek. Do tych ostatnich zaliczają się niewątpliwie wirusy wspomnianego już wyżej Dark Avengera, najsłynniejszego chyba twórcy wirusów komputerowych. On to właśnie jako pierwszy zastosował metodę zmiennych procedur szyfrujących w swym polimorficznym enginie MtE, a także jako jeden z pierwszych potrafił omijać zainstalowane monitory antywirusowe, czy odnajdywać oryginalne wejścia do znajdujących się w BIOS-ie procedur obsługi przerwania 13h.

Pojawienie się nowego wirusa infekującego nie zajętą jeszcze do tej pory platformę sprzętową lub programową budzi zwykle nie lada sensację, zwłaszcza gdy w sprawę wmieszają się media, żerujące na

tego typu historiach. Pomimo że najczęściej trywialny, wirus taki otwiera bowiem kolejną furtkę dla całej rzeszy późniejszych racjonalizatorów oraz wywołuje istną lawinę komentarzy na temat bezpieczeństwa systemów komputerowych.

tak widać, twórcy wirusów tworzą środowisko rządzące się swoimi własnymi prawami. Cały czas trwa wyścig nad wymyśleniem jeszcze lepszych lub całkowicie nowych, nieznanych wirusów. Ciekawa przykład twórczego podejścia do programowania wirusów zademonstrował autor ukrywający się pod pseudonimem Stormbringer w wirusie JUMP. Nazwa wirusa nie jest przypadkowa, gdyż, po de-asemblacji listing tego wirusa składa się tylko i wyłącznie z samych rozkazów skoków (właściwy kod został sprytnie ukryty wewnątrz wirusa).

Prymat w programowaniu wirusów wiodą niezaprzeczalnie mieszkańcy państw byłego bloku wschodniego, głównie Bułgarzy, Rosjanie i Słowacy. Dzieje się tak głównie z powodu braku, w tych krajach unormowań prawnych dotyczących przestępstw komputerowych, które istnieją już w wielu państwach zachodnich.

W dobie globalnej ekspansji sieci Internet w zasadzie każda osoba chcąca dowiedzieć się czegoś o wirusach może dostać się do bogatych, istniejących na całym świecie archiwów, poświęconych w całości programowaniu wirusów. Oferują one wirusy w wersji źródłowej, generatory wirusów, kolekcje złapanych egzemplarzy wirusów, a także tzw. ziny, czyli prowadzone przez wyspecjalizowane grupy magazyny (w postaci plików tekstowych lub stron HTML), poświęcone programowaniu wirusów (np.: 40HEX, VLAD, NukE InfoJournal, VBB, Immortal Riot). Za sprawą Intemetu w skład grup prowadzących te magazyny wchodzą ludzie ze wszystkich stron świata, którzy, co ciekawe, najczęściej deklarują się jako zagorzali przeciwnicy wirusów destrukcyjnych, a samo programowanie wirusów traktują jako swoistą sztukę. Po części mają rację, gdyż pisanie wirusów jest nie tylko świetną okazją do dogłębnego poznania systemu operacyjnego, ale i sprawdzenia własnych umiejętności programistycznych.

Liczba wirusów złapanych na świecie rośnie z roku na rok i nic me wykazuje na to, aby tendencja ta miała ulec gwałtownej zmianie. W kolekcji wirusów należącej do jednej z czołowych firm amerykańskich produkującej programy antywirusowe znajduje się obecnie ponad 20000 próbek wirusów, z czego ok. 6000 to wirusy całkowicie

różne. Należy pamiętać, iż istnienie wirusów komputerowych jest ściśle związane z niedoskonałością zarażanych przez nie systemów operacyjnych. Twórcy wirusów skrzętnie wykorzystują do swych celów wszelkie możliwe luki w systemie: nieudokumentowane funkcje, systemowe struktury danych, a nawet odnalezione własnoręcznie błędy w kodzie systemu. To właśnie wirusy - paradoksalnie - pośrednio wpływają na wzrost bezpieczeństwa systemów komputerowych, gdyż kolejne wersje różnych środowisk zwykle starają się załatać istniejące luki w systemie.

Osobne miejsce w dyskusjach na temat wirusów zajmują programy antywirusowe (w literaturze często określane skrótem AV). O ile pisanie wirusów jest raczej indywidualnym procesem twórczym, o tyle pisanie skutecznych programów antywirusowych stało się domeną całych grup programistycznych, których członkowie muszą posiadać o wiele większą wiedzę na temat wirusów niż typowy twórca wirusów. Usuwanie wirusów jest procesem naprawczym, a to wiąże się z odpowiedzialnością, którą muszą wziąć na siebie twórcy programów AV. Autorzy wirusów nie muszą przejmować się ewentualnymi szkodami powstałymi na skutek ich błędu lub nawet zwykłej niewiedzy. W przypadku programów AV nie można pozwolić sobie nawet na najmniejsze potknięcie. O ile dodawanie do skanera kolejnych sygnatur typowych i trywialnych wirusów to zajęcie zajmujące niewiele czasu, o tyle dekodo-wanie i rozszyfrowywanie kodu najnowszych wirusów, używających kilkustopniowych zmiennych procedur szyfrujących, sztuczek anty-emulacyjnych, antydebuggerowych i antydeasemblerowych, zarażających dużą ilość obiektów i będących zwykle wolnymi infektorami, to zadanie zajmujące bardzo dużo czasu, a i tak często okazuje się, iż zastosowana metoda nic umożliwia odnalezienia wszystkich wariantów wirusa.

Aby przyspieszyć wymianę informacji na temat wirusów, autorzy różnych programów antywirusowych z całego świata utworzyli coś w rodzaju organizacji, która zajmuje się zbieraniem danych o istniejących wirusach oraz o technikach ich wykrywania i usuwania.

Poniższe rozdziały powinny przynajmniej częściowo wyjaśnić mechanizmy wykorzystywane przez nowoczesne wirusy i programy antywirusowe. Oprócz typowych i trywialnych sztuczek, stosowanych od dawna przez wyżej wymienione programy, omówionych zostało kilka bardziej zaawansowanych technik, m.in.:polimorfizm (wykorzystywanie zmiennych procedur szyfrujących);

>  stealth (zaawansowane ukrywanie się w systemie);

>  heurystyka (wykrywanie nowych, nieznanych wirusów na podstawie znajomości charakterystycznych ciągów instrukcji).

Do zrozumienia całości materiału niezbędna jest podstawowa znajomość komputerów PC oraz systemów DOS i WINDOWS. Niezbędna jest także przynajmniej pobieżna znajomość asemblera procesorów 80x86 i jakiegoś języka wysokiego poziomu (np.: Pascal, C). Niezorientowanego czytelnika odsyłam do pozycji umieszczonych w spisie na końcu książki.

Dla uproszczenia, w opracowaniu została zastosowana pewna konwencja, dotycząca używania w tekście funkcji systemu DOS i BIOS. Występujące w tekście skróty (XXXX/YY) oznaczają użycie funkcji XXXX przerwania programowego YY. Zapis (4B00/21) oznaczać więc będzie instrukcję uruchomienia programu przy użyciu funkcji 4B00h przerwania programowego 21h obsługiwanego przez DOS, a (4E/4F/21) oznaczać będzie wywołanie funkcji 4Eh lub 4Fh przerwania programowego 21h, w tym przypadku realizujących poszukiwania pierwszej (funkcja 4Eh) lub kolejnej (funkcja 4Fh) pozycji katalogu. Dokładny opis funkcji systemu DOS i BIOS można znaleźć w wielu różnych opracowaniach, z których najlepszym i najpełniejszym wydaje się stale rozwijana, dostępna w angielskojęzycznej wersji elektronicznej, lista przerwań Interrupt List Ralpha Browne'a.

Na koniec warto jeszcze dodać kilka uwag o słownictwie używanym w opracowaniu. Większość terminów związanych z komputerami jest siłą rzeczy pochodzenia angielskiego. Próby tworzenia ich polskich odpowiedników mijają się najczęściej z celem, gdyż powstałe w ten sposób neologizmy nie odzwierciedlają w pełni sensu słów angielskich. Liczne przykłady z literatury komputerowej (i nie tylko) ostatnich kilku lat dowiodły, iż jedynym sensownym wyjściem z tej sytuacji jest integracja pewnych terminów obcojęzycznych z językiem polskim. Z tego też powodu w opracowaniu używane są (w niezbędnym minimum) terminy angielskie opatrzone odpowiednimi komentarzami w języku polskim. W sytuacji niemożności znalezienia adekwatnego polskiego odpowiednika dla słowa angielskiego używane będzie słowo obce (np. stealth).

 

1.1. Co to jest i jak działa wirus komputerowy

Wirus komputerowy definiowany jest najczęściej jako krótki program mający zdolność samopowielania po jego uruchomieniu. Jest on zwykle przenoszony w zainfekowanych wcześniej plikach lub w pierwszych sektorach fizycznych logicznych dysków. Proces infekcji polega zazwyczaj na odpowiedniej modyfikacji struktury pliku albo sektora. Zainfekowaną ofiarę często nazywa się nosicielem (ang. host), a proces samopowielania - replikacją. Długość typowego wirusa waha się w granicach od kilkudziesięciu bajtów do kilku kilobajtów i w dużym stopniu zależy od umiejętności programistycznych jego twórcy, a także od języka programowania użytego do jego napisania. Od umiejętności i zamierzeń autora zależą także efekty, jakie wirus będzie wywoływał w zainfekowanym systemie (oczywiście, nie zawsze musi być to próba formatowania dysku twardego).

Większość z istniejących wirusów zawiera tylko kod odpowiedzialny za replikację (ang. dropper), natomiast "specjalne efekty" to zwykle działania uboczne spowodowane przez błędy.

Z powyższego wynika jednoznacznie, iż pomijając istniejącą zawsze możliwość sabotażu, zarażenie komputera wirusem nastąpić może tylko przy niejawnej współpracy użytkownika, który, bądź to uruchamiając zarażony program, bądź próbując wczytać system z zarażonej dyskietki, a nawet odczytując zainfekowany dokument, nieświadomie sam instaluje wirusa w używanym przez siebie komputerze.

 

1.2. Języki programowania wykorzystywane do pisania wirusów.

Do zaprogramowania wirusa wystarczy znajomość dowolnego popularnego języka programowania, np. Pascala czy C, jednak największy procent wirusów pisany jest w czystym asemblerze. Spowodowane jest to głównie specyfiką kodu generowanego przez ten język, a zwłaszcza jego zwięzłością. Kod maszynowy programu, który z punktu widzenia użytkownika nie robi nic, w językach wysokiego poziomu zajmie od kilkuset bajtów do kilku, a nawet kilkuset kilobajtów. W asemblerze podobny program zajmie od jednego (instrukcja RET w pliku COM) do czterech bajtów (wywołanie funkcji 4Ch przerwania 21h). Spowodowane jest to tym, iż do każdego wygenerowanego przez siebie programu kompilatory języków wysokiego poziomu dodają standardowe prologi i epilogi, niewidoczne dla piszącego w danym języku programisty, które są odpowiedzialne m.in. za obsługę błędów, stosu, operacje we/wy itp. Można powiedzieć, iż długość programu wynikowego (rozumianego jako kod maszynowy) jest wprost proporcjonalna do poziomu języka programowania, w którym został on napisany. Na korzyść asemblera przemawia także fakt, iż z jego poziomu mamy bardzo dużą swobodę w dostępie do pamięci czy portów, a programista ma możliwość świadomego wpływu na kształt przyszłego programu, np. w zakresie używanych instrukcji czy rozwiązań programowych. Jak widać, programy napisane w asemblerze są optymalne pod względem szybkości działania i długości kodu,...

Zgłoś jeśli naruszono regulamin