Практикум_СП
.pdf
|
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