Wirusy Komputerowe.pdf

(2309 KB) Pobierz
WIRUSY KOMPUTEROWE
WIRUSY KOMPUTEROWE
ARCHITEKTURA KOMPUTERÓW
Autorzy: Mariusz Ciepły
Krzysztof Składzień
Wrocław 2001/2002
Spis treści:
1. Wstęp
2. Rodzaje wirusów
3. Metody infekcji obiektów
• główny rekord ładujący (MBR)
• pliki
- budowa PE
- infekcja PE
- moduły i funkcje
4. Architektura systemu
5. Wirus – sterownik VXD
6. Metody instalacji w pamięci operacyjnej
• tryb rzeczywisty
• tryb chroniony
- poziom ring3
- poziom ring0
- metody alternatywne
7. Zabezpieczania wirusów
• wyjątki (SEH)
• antydebugging
• antydisassembling
• szyfrowanie kodu
8. Optymalizacja kodu
9. Wirusy w Linux
10. Podsumowanie
11. Literatura
12. Dodatek – tablica assemblera
2
1.Wstęp
Wirus komputerowy to najczęściej program napisany w języku niskiego poziomu, jakim jest
assembler, można jednak używać języków wysokiego poziomu takich jak Pascal lub C. Okazuje się, że
assembler jest w tym temacie potężnym narzędziem. Jest niezastąpiony, gdyż można pisać bez ograniczeń,
jakie narzucają nam kompilatory języków wysokiego poziomu. Dlatego w tym opracowaniu skupiamy się na
opisie metod pisania wirusów opartych na assemblerze.
Najczęściej używany język koderów wirusów:
ASM
C/C++
Perl
VB/VBA/VBS
PHP
None (collector)
17
3
1
2
1
1
ASM
C/C++
Perl
VB/VBA/VBS
PHP
None (collector)
8% 4%
4%
4%
12%
68%
dane według Coderz.Net
W skrypcie przedstawimy konkretne rozwiązania i przykłady współczesnych technik pisania, dlatego
będziemy opisywać współczesną architekturę komputerów oraz najnowsze systemy operacyjne. Mamy
zamiar opisywać wirusy na bazie komputerów kompatybilnych z PC, ponieważ to dzięki ich popularności
temat ten rozwija się tak dynamicznie.
Czytelnik zapozna się również ze sposobami, dzięki którym udało się nam dojść do opisanych
technik. Mamy na myśli prace z debuggerami - podstawowego i najważniejszego narzędzia kodera wirusów.
Jest to ważne, ponieważ to dzięki debuggerom i technice reverse engineering można zrozumieć mechanizmy
działania zarówno komputera jak i jego systemu operacyjnego.
Dokumentacje dostarczane wraz z produktem zawsze zawierają te informacje, które ich autorzy
uważają za niezbędne, sprytnie omijając szczegóły. My uważamy, że taka forma dokumentacji jest
nieodpowiednia, ponieważ przez nią szerokie grono programistów tak naprawdę nie wie z jakimi
mechanizmami ma do czynienia. O czywiście tak szczegółowa i wnikliwa wiedza nie zawsze jest potrzebna,
jednak dla nas, koderów wirusów, jest niezbędna. Posiadamy swoje sposoby i techniki, dzięki którym tą
wiedzę zdobywamy, dlatego na przykład wiele metod w pisaniu wirusów pochodzi ze zdissasemblowanych
programów systemowych.
Wirusy to programy uważane jako jedyne w swoim rodzaju. Ich kod musi być przemyślany, a co
najważniejsze zoptymalizowany. Jest to bardzo ważne, ponieważ musi zajmować jak najmniej miejsca oraz
powinien niepostrzeżenie pracować na komputerze, dlatego zdecydowaliśmy się napisać o optymalizowaniu
kodu.
Wiedza na temat pisania wirusów nie musi być wykorzystywana do ich pisania, jest to raczej świetny
sposób poznania swojego komputera od wewnątrz. Umiejętność ta w dużym stopniu przydaje się do pisania
programów użytkowych, do odkrywania ukrytych funkcji w nowych systemach operacyjnych, ale także do
zmiany kodu w istniejących już programach – chyba najczęściej wykorzystywana.
3
261191.003.png
2. Rodzaje wirusów
Zdecydowana większość współczesnych wirusów to programy doklejające się do pliku, dzięki czemu
mogą być transportowane między komputerami. Koderzy wirusów jako jeden z głównych celów w swojej
pracy stawiają na dopracowanie funkcji infekcji a co za tym idzie rozprzestrzeniania się swojego programu.
Prowadzi do to tego, że powstało wiele ich odmian i typów. Mamy wirusy plików wsadowych, makrowirusy
(Word, MS Project, itp), wirusy pasożytnicze. Skrypt ten jednak opisuje wirusy w oparciu o architekturę
komputerów, jak ją wykorzystać do ich tworzenia, dlatego skupimy się na wirusach infekujących pliki oraz
określone sektory dysków twardych.
3. Metody infekcji obiektów
Najważniejszą częścią kodu wirusa jest jego procedura zarażająca, która decyduje o sukcesie
programu. Głównym celem ataków są pliki wykonywalne, czyli dla DOS były to programy z rozszerzeniami
COM oraz EXE (z ich podstawową architekturą), dla Win32 są to już w zasadzie tylko pliki EXE oznaczane
dodatkowo jako PE (Portable Executable).
Zawsze na każdym etapie pisania musimy zdecydować, na jakiej architekturze (platformie
systemowej) będzie pracować nasz program, musimy wiedzieć wszystko z najmniejszymi szczegółami o
systemie, dlatego jeżeli chcemy infekować pliki, czy określone sektory dysku to musimy znać ich budowę.
Główny rekord ładujący (Master Boot Record MBR)
Podczas uruchamiania komputera najpierw odczytywana jest pamięć ROM (właściwie: FlashRom), w której
zawarte są parametry BIOS-u, wykonywany jest test POST. Po zakończeniu tego pierwszego etapu
uruchamiania komputera BIOS odczytuje i uruchamia program znajdujący się w pierwszym sektorze
pierwszego dysku twardego lub na dyskietce (w zależności od tego, z jakiego nośnika korzystamy
uruchamiając system). Pierwszy sektor to właśnie Master Boot Record. Na początku tego sektora znajduje się
mały program, zaś na końcu – wskaźnik tablicy partycji. Program ten używa informacji o partycji w celu
określenia, która partycja z dostępnych jest uruchamialna, a następnie próbuje uruchomić z niej system.
Odczytanie pierwszego sektora dysku odbywa się poprzez wykonanie przerwania int 19h. Następnie jeżeli
zostanie zlokalizowany główny sektor ładujący, to będzie on wgrany do pamięci pod adresem 0000:7C000 i
wykona się tam krótki kod programu MBR. Zadaniem tego kodu jest odnalezienie aktywnej partycji na
dysku. Jeżeli zostanie ona odnaleziona to jej pierwszy sektor, nazywany boot sector (każdy system
operacyjny ma swoją wersje boot sector’a) będzie wgrany pod 0000:7C000 i program w MBR skoczy pod
ten adres, w przeciwnym wypadku zostanie wyświetlony odpowiedni komunikat o błędzie.
program ładujący
tablice partycji
446 bajtów
16 bajtów
2 bajty
flaga
aktywn.
początek
partycji
typ
partycji
koniec
partycji
sektor
początkowy
liczba
sektorów
1 bajt
3 bajty
1 bajt
3 bajty
4 bajty
4 bajty
Schemat budowy MBR
4
261191.004.png
Oto postać hex/ascii MBR dla Windows 98 OSR2:
OFFSET 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
000000
000010
000020
000030
000040
000050
000060
000070
000080
000090
0000A0
0000B0
0000C0
0000D0
0000E0
0000F0
000100
000110
000120
000130
000140
000150
000160
000170
000180
000190
0000A0
0001B0
0001C0
0001D0
0001E0
0001F0
3.....|.P.P....|
...PW...........
8,|.u...........
....It.8,t....N.
<.t...........F%
..F...<.t...<.t.
:.u+@.F%.u$..UP.
A..Xr...U.u....t
....V$.......f..
.......3.......N
%.N...r).P..>.}U
.tZ.......u..O..
...R..F..V....Z.
.Ot.3........TR.
V3.VVRP.SQ...V..
PR..B.V$..ZX.d.r
.@u.B......^..tN
ieprawid.owa tab
lica partycji. I
nstalator nie mo
.e kontynuowa...
Brak systemu ope
racyjnego.......
................
......W.........
................
................
................
....?..;.. '....
......0b..0Y....
................
..............U.
Taki główny sektor ładujący opisany jest w języku C następującymi strukturami:
s truct master_boot_record {
char bootinst[446]; // kod programu, do offsetu 0x1BE w MBR
char parts[4 * sizeof (struct fdisk_partition_table)];
ushort signature;
// ustawione na 0xAA55, ostatnie słowo w MBR
};
struct fdisk_partition {
unsigned char bootid; // partycja butująca? 0=nie, 80h=tak
unsigned char beghead; // początkowy numer głowicy
unsigned char begsect; // początkowy numer sektora
unsigned char begcyl; // początkowy numer cylindra
unsigned char systid; // oznaka systemu operacyjnego
unsigned char endhead; // końcowy numer głowicy
unsigned char endsect; // końcowy numer sektora
unsigned char endcyl; // końcowy numer cylindra
int relsect; // pierwszy względny sektor
int numsect; // liczba sektorów w partycji
};
Taki jeden struct fdisk_partition, czyli opis partycji zaznaczyliśmy na rysunku MBR’a szarym kolorem.
Występuje ona jako druga na dysku i jest aktywna (pole na offsecie 0x1CE ma wartość 0x80) oraz jest na
niej system plików FAT32x (pole na offsecie 0x1D2 ma wartość 0x0C). Widać od razu ile cennych
informacji dla wirusa możemy otrzymać analizując te dane. Skoro wiemy wszystko o budowie pierwszego
sektora dysku, to teraz przystąpmy do dekompilacji tego przykładowego MBR:
5
33C08ED0 BC007CFB 5007501F FCBE1B7C
BF1B0650 57B9E501 F3A4CBBE BE07B104
382C7C09 751583C6 10E2F5CD 188B148B
EE83C610 49741638 2C74F6BE 10074EAC
3C0074FA BB0700B4 0ECD10EB F2894625
968A4604 B4063C0E 7411B40B 3C0C7405
3AC4752B 40C64625 067524BB AA5550B4
41CD1358 721681FB 55AA7510 F6C10174
0B8AE088 5624C706 A106EB1E 886604BF
0A00B801 028BDC33 C983FF05 7F038B4E
25034E02 CD137229 BE500781 3EFE7D55
AA745A83 EF057FDA 85F67583 BE4F07EB
8A989152 99034608 13560AE8 12005AEB
D54F74E4 33C0CD13 EBB80000 80545214
5633F656 56525006 5351BE10 00568BF4
5052B800 428A5624 CD135A58 8D641072
0A407501 4280C702 E2F7F85E C3EB744E
69657072 61776964 B36F7761 20746162
6C696361 20706172 7479636A 692E2049
6E737461 6C61746F 72206E69 65206D6F
BF65206B 6F6E7479 6E756F77 61E62E00
4272616B 20737973 74656D75 206F7065
72616379 6A6E6567 6F000000 00000000
00000000 00000000 00000000 00000000
0000008B FC1E578B F5CB0000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
01010BEF 3F12103B 00002027 04008000
01130CEF BF953062 04003059 94000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 000055AA
0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
261191.005.png 261191.006.png 261191.001.png 261191.002.png
Zgłoś jeśli naruszono regulamin