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

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

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

 

PUSH

CX

 

; регістри

 

PUSH

SI

 

; у стеку

 

MOV

СХ,[ВР] Count

; узяти лічильник

 

MOV

SI,[BP] Arr

; і адреса масиву

 

SUB

AX,AX

 

 

MOV

DX,AX

 

Next

ADD

AX[SI]

; накопичення

 

ADC

DX,0

 

; суми в DX,AX

 

ADD

SI,2

 

 

 

LOOP

Next

 

 

 

DIV

CX

 

; обчислення середнього (АХ = приватне)

 

MOV

SI[BP]Res1

; узяти адресу результату

 

MOV

[SI], AX

; записати результат в пам'ять

 

MOV

[BP] Res1,АХ; і в стек

 

 

POP

SI

 

; відновити

 

POP

CX

 

; регістри

 

POP

DX

 

 

 

POP

AX

 

 

 

POP

BP

 

 

 

RET

4

 

; пропустити 2 параметри

Avrg

ENDP

 

 

 

; Структура вікна в стеку

 

Frame STRUC

 

 

Save_BP

DW

?

; <---BP

Save_IP_CS

DW

2 DUP (?)

; +2

Count DW

?

 

; +6 значення лічильника (по RET про-

Arr_Addr

DW

?

; +8 адреса масиву пускаються)

Besl_Addr

DW

?

; +10 адреса результата/результат

Frame ENDS

 

 

 

CSeg_P

ENDS

 

 

 

END

 

 

 

Робота з макросами

Приклад макросів для очищення екрану та установки курсору у верхній лівий кут:

Macro read_del

Read

;збережемо атрибут і символ

Mov ah,09h

;функція запису символу із заданими атрибутами на екран

Mov al,20h

;помістимо ASCII – код пропуску і поточний атрибут

Mov bl,[attrib]

Mov cx,1

Int 10h

Endm read_del

Приклад макросу для позиціонування курсору в довільну точку екрану із запам’ятовуванням його координат у пам’яті за допомогою змінних row i clm.

Macro locate y, x, k

 

Mov ah,02h

;функція позиціонування курсора

71

Mov bh,0h

;номер сторіеки

Mov dh,yh

 

Mov dl,xh

 

Mov [row_ek],dh

 

Mov [clm_ek],dl

 

Int 10h

 

Приклад макросу, що виводить повідомлення mes довжиною leng і атрибутом кольору attriv з позиції, визначуваної змінними row i clm

Macro out_str mes,leng,attrib,k

Mov ah,13h

Mov al,1 ; ознака зсуву курсору в кінець рядка

Mov,0 ; номер відеосторінки

Mov bl,attrib

Mov cx,leng

Mov dh,[row_ek]

Mov dl,[clm_ek]

Mov bp,offset mes ; адреса рядка ES:BP

Int 10h

Endm out_str

Макроси – ефективний мовний засіб асемблера, що полегшує розробку, модифікацію і читання програм. Приведені нижче приклади макросів на основі функцій BIOS слід розглядати лише як один з можливих варіантів, оскільки структура макросів і функції, що реалізуються ними, залежать від цільового призначення програми і від стилю програми. Розглянемо лістинг макросів:

Ideal Model small P486N Stack 256

MACRO window N,attrib,y1,x1,y2,x2

;Макрос створює вiкно заданого розмiру з заданими атрибутами mov ah,06h

mov al,N mov bh,attrib mov ch,y1 mov cl,x1 mov dh,y2 mov dl,x2 int 10h

ENDM window

MACRO locate y,x

;Макрос встановлює курсор у задану позицiю вiкна mov ah,02h

mov bh,0 mov dh,y mov dl,x int 10h

72

ENDM locate

MACRO cprintf mes,len,attrib,x,y,n

;Макрос виводить рядок iз заданими атрибутами i координатами mov ah,13h

mov al,1 mov bh,n mov bl,attrib mov cx,len mov dh,y mov dl,x

mov bp,offset mes int 10h

ENDM cprintf

MACRO out_str intro

;Макрос виводить текст повiдомлення mov ah,09h

lea dx,[intro] int 21h

ENDM

out_str

DATASEG

intro

db 13,10,"██ ██ "

;Сегмент даних для графічного зображення

 

 

db

13,10,"██ ██ "

 

db

13,10,"██████"

 

 

db

13,10,"██████ "

 

db

13,10,"██ ██"

 

db

13,10,"██ ██"

 

db

13,10,""

 

db

13,10,"█████ "

 

db

13,10,"██ "

 

 

db

13,10,"██ "

 

db

13,10,"████ "

 

db

13,10,"██"

 

db

13,10,"██"

 

db

13,10,""

 

 

db

13,10," █████"

 

 

db

13,10,"██ ███ "

 

db

13,10,"██ "

 

db

13,10,"██"

 

db

13,10,"██ ███"

 

db

13,10," █████"

 

 

db

13,10,"",13,10,'$'

str1

db

"1/1$"

len7 = $-str1

 

yes

db

"Vse zashibis" ;данi рядка

yes_len = $-yes

 

 

Codeseg

 

73

Start:

mov ax,@data mov ds,ax mov es,ax

window 0,00001100b,0,0,28,80

;значення номерів: номер вiкна, атрибути символiв у вiкнi, координати лiвого ;верхнього кута, координата правого нижнього

locate 0,0 ;розмiщення рядка out_str intro

cprintf yes,yes_len,2Fh,20,22,0

;виводить макрос який виводить рядок з заданими атрибутами end_out:

exit:

mov ax,4C00h int 21h

End start

Дані макроси виконують такі функції: перший макрос створює вікно із заданими атрибутами. Номер вікна та його атрибути задаються на початку макросу. Роботою другого макроса є встановлення курсора у задані координати вікна, яке створено першим макросом. Третій макрос виводить рядок повідомлення, у нашому випадку це псевдографічне зображення, у даному макросі задаються координати виведення рядку та його атрибути. Завданням четвертого макросу є виведення на екран текстового повідомлення із заданими атрибутами.

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

1.У чому схожість і відмінність між командами переходу JMP і виклику підпрограми CALL?

2.Скільки є машинних кодів для команди повернення з підпрограми і

вчому полягає відмінність в їх виконанні?

3.Як можна, не використовуючи команду виклику CALL, викликати процедуру, що має атрибут FAR? Яку структуру має при цьому стек?

4.Якщо через стек передаються одні і ті ж параметри процедурі з атрибутом NEAR і процедурі з атрибутом FAR, то чи відрізнятиметься чимось структура вікна в стеку?

5.Як організувати умовний виклик підпрограми

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

1. Написати підпрограму, яка обчислює значення полінома. Y = anXn + an-1Xn-1 + ... + a1X + a0

Параметри передаються підпрограмі через стек в наступному порядку, починаючи з верхівки стека значення n, значення X, адреса масиву коефіцієнтів

74

a0, a1, a2, ... an-1, an. Викликаюча користувачем програма повинна викликати підпрограму для обчислення двох поліномів (5-й і 10-й ступені). Результат обчислення, який підпрограма повертає через стек на місці адреси масиву; початкові значення Х і коефіцієнтів вивести в символьному вигляді.

2.Написати підпрограму, яка в передаваному їй масиві 4-розрядних десяткових чисел в упакованому BCD-форматі знаходить мінімальне і максимальне значення. Параметри передаються через стек в наступному порядку, починаючи з верхівки стека: значення числа елементів, адреса масиву. На місці числа елементів підпрограма повертає мінімальний елемент, а на місці адреси масиву – максимальний елемент. Викликаєма програма повинна викликати підпрограму для обробки двох масивів (10 і 16 елементів), початкові значення елементів масивів і результати роботи підпрограми вивести в символьному вигляді.

3.Написати підпрограму, яка для масивів завдання 2 знаходить моду, тобто значення, що зустрічається найчастіше, і середнє значення елементів масиву. Висновок оформити відповідно вимогам завдання 2.

4.Написати підпрограму, яка в передаваному їй символьному масиві проводить перетворення десяткових чисел із знаком в двійкову форму і записує результати перетворення в інший масив. Ознакою завершення перетворення є або обробка заданого числа елементів масиву, або виявлення коду символу EOF (lAh) серед символів початкового масиву. Роздільниками між числами служить один або декілька пропусків. Параметри передаються підпрограмі в наступному порядку, починаючи з верхівки стека число оброблюваних елементів, адреса початкового масиву, адреса результуючого масиву. На місці останнього параметра повертається число дійсно оброблених елементів. Виконувана програма повинна викликати підпрограму для обробки двох масивів (15 елементів з кодом EOF після 12-го числа і 10 елементів без коду EOF) і вивести на друк оброблені елементи початкового масиву і результати перетворення (16ковими числами).

5.Написати підпрограму, що виконує функцію, зворотну завданню 4 початковий масив містить двійкові цілі числа із знаком, а в результуючий масив підпрограма поміщає значення цих чисел в ASCIIкодах, відокремлюючи числа трьома пропусками. Параметри підпрограмі передаються аналогічно завданню 4, повертається значення довжини результуючого масиву в байтах. Виконувана програма повинна викликати підпрограму для обробки двох масивів (10 і 15 елементів) і вивести IA екран дисплея в символьному вигляді 16-ковими числами значення елементів, початкового масиву і результати перетворення.

6.Написати підпрограму виведення дампу заданої ділянки пам'яті у

вигляді:

seg:offset хх хх хх хх хх хх хх хх | хх хх хх хх хх хх хх хх ASCII де seg:offset - адреса ділянки пам'яті (16-ричиі числа)

xx - 16-кове вміст байта (байти відділяються пропуском, а через 8 байтів розділення здійснюється символом |) ASCII – символьне зображення для байтів, коди яких мають символьну інтерпретацію, для інших використовується символ точки ".".

75

Підпрограмі через стек передається довжина ділянки, що відображається, в байтах і повна логічна адреса (Seg:Offset) його початку. При виведенні дампу передбачити останов при заповненні екрану (24 рядки) і очікування ініціалізації продовження натисненням будь-якої клавіші.

7.Написати підпрограму, яка в передаваному їй через стек байтовому полі записує в символьному вигляді поточний системний час у вигляді: чч:мм:сс. дд Викликана користувачем програма повинна викликати підпрограму з інтервалами 15 і 30 секунд і видати отримані від неї результати.

8.Написати підпрограму установки часу, яка набуває значення встановлюваного часу у вигляді: чч:мм:сс. дд. Адреса рядка передається підпрограмі через стек, помилкова ситуація сигнализируется через прапор CF. Викликаєма програма повинна запрошувати введення часу з клавіатури і сообщаь про помилки введення.

9.Написати підпрограму, яка в передаваному їй через стек байтовому полі записує поточну дату і день тижня у вигляді: дд ммм гггг – день тижня. Викликаюча програма повинна після повернення цієї інформації помістити її у верхньому правому кутку екрану темними символами на білому фоні.

10.Написати підпрограму установки дати, яка набуває значення

встановлюваної дати в одному з наступних форматів: дд-мм-гг або мм/дд/гг. Адреса рядка передається підпрограмі через стек, помилкова ситуація сигнализируется через прапор CF. Викликаюча програма повинна запрошувати введення дати з клавіатури і повідомляти про помилки введення.

11.Написати підпрограму знаходження найбільшого загального дільника (НЗД), використовуючи алгоритм Евклида: НЗД(х,у)= НЗД(у,у1)=

НЗД(у1,у2)= ... = НЗД(уn-1,0)= у де у1 = х MOD у, у2 = у MOD у1 і т.д. за умови, що х >= у. Значення х і у, а також результат НОД(х,у) передаються через стек. Викликаюча програма повинна одержати НЗД(А,В,С) і НЗД(D,E,F,G), де А, В, С, D, Е, F і G цілі .числа без знаку, і вивести початкові значення результати в символьному вигляді.

12.Написати підпрограму, яка в передаваному їй символьному масиві проводить перетворення 4-розрядних десяткових чисел без знаку в двійкову форму BCD-кодів упакованого формату і записує результати перетворення в інший масив. Ознакою завершення перетворення є або обробка заданого числа елементів масиву, або виявлення коду символу ЕOF (1Ah) серед символів початкового масиву. Роздільниками між числами служить один або декілька пропусків. Параметри передаються підпрограмі в наступному порядку, починаючи з верхівки стека: число оброблюваних елементів, адреса початкового масиву, адреса результуючого масиву. На місці останнього параметра повертається число дійсно оброблених елементів. Викликаюча програма повинна викликати підпрограму для обробки двох масивів (16 елементів з кодом EOF після 11-го числа і 15 елементів без коду EOF) і вивести на друк оброблені елементи початкового масиву і результати перетворення (16ковими числами).

76

13. Написати підпрограму, що виконує функцію, зворотну завданню 12: початковий масив містить BCD-коди цілих чисел без знаку, а в результуючий масив підпрограма поміщає значення цих чисел в ASCII-кодах, відокремлюючи числа трьома пропусками. Параметри підпрограмі передаються аналогічно завданню 12, повертається значення довжини результуючого масиву в байтах. Викликана програма повинна викликати підпрограму для обробки двох масивів (10 і 15 елементів) і вивести на екран дисплея в символьному вигляді 16-ковими числами значення елементів початкового масиву і результати перетворення.

Додаток 6.1. Програма з виведення скан-кодів клавіатури. ideal

model small stack 256

macro out_str mes mov ah,09h

lea dx[mes] int 21h

endm out_str dataseg

table_hex db '0123456789ABCDEF' buf_hex db 5 dup(?)

mes1 db 10,13,'$' codeseg

start: mov ax,@data mov ds,ax again:mov ah,10h int 16h

cmp al,1bh je exit mov dx,ax mov al,dh

mov [word buf_hex],ax mov [byte buf_hex+2],dh mov al,dl

call conv_hex

mov [word buf_hex+3],cx mov ah,9

mov dx,affset mes1 int 21h

mov ah,40h mov bx,1 mov cx,5

lea dx,[buf_hex] int 21h

jmp again

77

exit: mov ax,4C00h int 21h

proc conv_hex push dx

mov bx,offset table_hex mov ah,0

mov cl,4 shl ax,cl shr al,cl xlatb mov dh,al mov al,ah xlatb mov dl,al mov ax,dx pop dx ret

endp conv_hex end start

78

Практична робота № 8

Тема: Розробка нерезидентної програми-віруса. Мета Вивчення принципу дії зараження об’єктів.

роботи:

Теоретичні відомості

Із збільшенням кількості людей, що користуються комп’ютером, і можливостей обміну між ними інформацією по електронній пошті та через інтернет зросла загроза зараження комп’ютера, а також псування або розкрадання інформації шкідливими програмами.

В цілому шкідливі програми можна розділити на наступні три класи:

Черв’яки (Worms) – дана категорія шкідливих програм для розповсюдження використовує вразливі місця мережевого захисту. Назву цього класу було дано виходячи із здатності черв’яків "переповзати" з комп’ютера на комп’ютер, використовуючи мережі, електронну пошту та інші інформаційні канали. Завдяки цьому черв’яки володіють виключно високою швидкістю розповсюдження. Черв’яки проникають на комп’ютер, обчислюють мережеві адреси інших комп’ютерів і розсилають за цими адресами свої копії. Крім мережевих адрес черв’яки часто використовують дані адресної книги поштових клієнтів для розсилки заражених повідомлень. Представники цього класу шкідливих програм іноді створюють робочі файли на дисках системи, але можуть взагалі не звертатися до ресурсів комп’ютера (за винятком оперативної пам’яті). Черв’яки також є свого роду підготовчим етапом для проникнення на комп’ютер інших шкідливих програм. Так, черв’як може створити ряд вразливостей, використовуючи які, на комп’ютер проникають троянські програми.

Віруси (Viruses) – програми, які заражають інші програми – додають в них свій код, щоб при запуску зараженого файлу дістати можливість виконання несанкціонованих дій. Це просте визначення дає можливість виявити основну дію, що виконується вірусом – зараження. Швидкість розповсюдження вірусів дещо нижча, ніж у черв’яків.

Троянські програми (Trojans) – програми, які виконують на комп’ютерах, що вражаються, несанкціоновані користувачем дії, тобто залежно від яких-небудь умов знищують інформацію на дисках, приводять систему до "зависання", крадуть конфіденційну інформацію і т.д. Даний клас шкідливих програм не є вірусом в традиційному розумінні цього терміну (тобто не заражає інші програми або дані); троянські програми не здатні самостійно проникати на комп’ютери і розповсюджуються зловмисниками під виглядом "корисного" програмного забезпечення. При цьому шкода, що наноситься ними, може у багато разів перевищувати втрати від традиційної вірусної атаки.

79

Найбільш поширеними типами шкідливих програм, що псують комп’ютерні дані, стали черв’яки. Далі по поширеності слідують віруси і троянські програми. Деякі шкідливі програми суміщають в собі характеристики двох або навіть трьох з перерахованих вище класів.

Також широкого поширення набули наступні потенційно небезпечні програми:

Програми-реклами (AdWare) – програмний код, без відома користувача включений в програмне забезпечення з метою демонстрації рекламних оголошень. Як правило, програми-реклами вбудовані в програмне забезпечення, що розповсюджується безкоштовно. Реклама розташовується в робочому інтерфейсі. Часто дані програми збирають і переправляють своєму розробнику персональну інформацію про користувача, змінюють різні параметри браузера (стартові і пошукові сторінки, рівні безпеки і т.д.), а також створюють неконтрольований користувачем трафік. Все це може привести як до порушення політики безпеки, так і до прямих фінансових втрат.

Потенційно небезпечні програми (RiskWare) – програмне забезпечення, яке не має визначенної шкідливої функції, але може бути використане зловмисниками як допоміжні компоненти шкідливої програми, оскільки містить проломи і помилки. У цю категорію потрапляють, наприклад, програми віддаленого адміністрування, IRC-клієнти, FTP-сервера, всілякі утиліти для зупинки процесів або утаєння їх роботи.

Програми-шпигуни (SpyWare) – програмне забезпечення, метою якого є несанкціонований доступ до даних користувача, відстежування дій на комп’ютері, збір інформації про зміст жорсткого диска. Вони дозволяють зловмиснику не тільки збирати інформацію, але і контролювати чужий комп’ютер. Програми-шпигуни, як правило, розповсюджуються разом з безкоштовним програмним забезпеченням і встановлюються на комп’ютер непомітно для користувача. До таких відносяться клавіатурні шпигуни, програми злому паролів, програми збору кониденциальной інформації (наприклад, номерів кредитних карт).

Програми автодозвону (PornWare) – програми, які здійснюють модемне з’єднання з різними платними інтернет-ресурсами, як правило, порнографічного змісту.

Хакерські утиліти (Hack Tools) – програмне забезпечення, яке використовується зловмисниками у власних цілях для проникнення на ваш комп’ютер. До них відносяться різні нелегальні сканери вразливостей, програми для злому паролів, інші види програм для злому мережевих ресурсів або проникнення в систему, що атакується.

Основними джерелами розповсюдження шкідливих програм є електронна пошта і інтернет, хоча зараження може також відбутися через дискету або CD-диск.

Завданням даної практичної роботи, є розробка програми-віруса, яка заражає файли.

80