Міністерство освіти і науки України
Кіровоградський державний технічний університет
ФАЕП
Кафедра Програмного забезпечення
Курсова робота
Тема:
"Захист файлів від запису"
Зміст
Вступ
1. Призначення та область застосування програми
1.1 Захист файлів від несанкціонованого копіювання
2. Огляд існуючих методів для захисту файлів від несанкціонованого доступу
2.1 Використання криптографії
2.2 Прив'язка до місця розташування на диску
2.3 Ключова дискета з нестандартним форматом
3. Постанова задачі та методи її реалізації
3.1 Захист файлів від запису
3.1.1 Процес підготування програми на мові ассемблера
3.2 Реалізація задачі
Список літератури
Додатки
Текст програми
Блок-схема алгоритму
Вступ
Методи захисту даних на персональних комп'ютерах надзвичайно різноманітні як по кінцевій меті, так і по технічному втіленню; їх можна розділити на механічні, апаратні і програмні.
До механічних засобів захисту відносяться різноманітні кришки і чохли з замками (що замикають, наприклад, дисковод гнучких дисків або мережний вимикач), клейкі пластини для приклеювання термінала до комп'ютера, а комп'ютера до столу, помешкання що замикаються із сигналізацією і багато інших.
Апаратні засоби реалізуються у вигляді спеціальних електронних модулів, що підключаються до системного каналу комп'ютера або портів вводу-виводу, і здійснюють обмін кодовими послідовностями з програмами, що захищаються.
Найбільш різноманітні - програмні засоби. Сюди відносяться програми шифрації даних по заданому користувачем ключу, адміністратори дисків, що дозволяють обмежити доступ користувачів до окремих логічних дисків, методи встановлення програмного продукту з дистрибутивних дискет, що дозволяють виконати установку не більше вказаного числа запуску програм, що захищаються за допомогою некопійованих ключових дискет, спеціальні захисні програмні оболонки, куди поміщаються програми що захищуються.
1. Призначення та область застосування програми 1.1 Захист файлів від несанкціонованого копіювання
Особливості захисту персональних комп'ютерів (ПК) обумовлені специфікою їх використання. Як правило, ПК користується обмежене число користувачів. ПК можуть працювати як в автономному режимі, так і в складі локальних мереж (сполученими з іншими ПК) і можуть бути залучені до віддаленого ПК або локальної мережі за допомогою модему по телефонній лінії.
Стандартність архітектурних принципів побудови, устаткування і програмного забезпечення персональних комп'ютерів, висока мобільність програмного забезпечення і ряд інших ознак визначають порівняно легкий доступ професіонала до інформації, що знаходиться в ПК. Якщо персональним комп'ютером користується група користувачів, то може виникнути необхідність в обмеженні доступу до інформації різноманітних користувачів.
Дана програма призначена для захисту від копіювання та від знищення файлів на гнучкому диску. Програма працює на всіх IBM-сумісних ПК. Для коректної роботи програми потрібна OS MS - DOS версії 5.0 або вище або WINDOWS 9x.
2. Огляд існуючих методів для захисту файлів від несанкціонованого доступу 2.1 Використання криптографії
Коритувачі ПК у різноманітних організаціях для обміну інформацією усе ширше використовують електронну пошту, що без додаткових засобів захисту може стати надбанням сторонніх осіб. Самим надійним захистом від несанкціонованого доступу до переданої інформації і програмних продуктів ПК є застосування різноманітних методів шифрування (криптографічних методів захисту інформації).
Криптографічні методи захисту інформації - це спеціальні методи шифрування, кодування або іншого перетворення інформації, у результаті якого її утримання стає недоступним без пред'явлення ключа криптограми й оберненого перетворення. Криптографічний метод захисту, безумовно, самий надійний метод захисту, тому що охороняється безпосередньо сама інформація, а не доступ до неї (наприклад, зашифрований файл не можна прочитати навіть у випадку крадіжки носія). Даний метод захисту реалізується у виді програм або пакетів програм, що розширюють можливості стандартної операційної системи. Захист на рівні операційної системи, частіше усього, повинен доповнюватися засобами захисту на рівні систем керування базами даних, що дозволяють реалізовувати складні процедури керування доступом.
В даний час не існує узвичаєної классифікації криптографічних методів захисту інформації. Проте, коли піддається перетворенню (шифровці) кожний символ переданого повідомлення ("симетричний" метод закриття інформації), можна умовно виділити чотири основні групи:
підстановка - символи тексту що шифрується заміняються символами того ж або іншого алфавіту відповідно до заздалегідь визначеного правила;
перестановка - символи тексту що шифрується переставляються по деякому правилу в межах заданого блока переданого тексту
аналітичне перетворення - текст що шифрується перетвориться по деякому аналітичному правилу;
комбіноване перетворення - вихідний текст шифрується двома або великим числом засобів шифрування.
Існує велике число програмних продуктів шифрування інформації, що відрізняються по ступеню надійності.
2.2 Прив'язка до місця розташування на дискуЯкщо потрібно виключити копіювання програми з гнучкого диска на інший гнучкий диск, її можна прив'язати до номера кластера або сектора, із якого починається файл програми на диску. Прив'язка здійснюється в такий спосіб. Спеціально підготовлена установча програма відкриває файл із робочою програмою і по таблиці відкритих файлів знаходить початковий номер кластера. Це число, що є своєрідним ключем, записується установчою програмою у визначене місце файла робочої програми (у поле даних). Робоча ж програма після запуску насамперед виконує ту ж операцію - визначає свою початкову адресу, а потім порівнює його з ключем. Якщо числа збігаються, програма приступає до виконання своєї змістовної частини; якщо не збігаються - аварийно завершується. При копіюванні програми на інший диск (або навіть на той же самий) вона виявиться розташованої в іншому місці і номер кластера, записаний нустановчою програмою вже не буде відповідати реальній адресі файла. У той же час за допомогою установчої дискети програму неважко встановити на будь-якому диску.
2.3 Ключова дискета з нестандартним форматом
Достатньо надійний засіб захисту програм від переносу на інші комп'ютери полягає у використанні ключової дискети. У цьому випадку робоча програма, що знаходиться на жорсткому диску, перед початком роботи перевіряє наявність на дисководі дискети з ключовою інформацією. Для того, щоб ключову дискету не можна було розмножити за допомогою команди DISKCOPY, що здійснює копіювання на фізичному рівні, ключова інформація записується на доріжці з нестандартним форматом, розташованої до того ж за межами робочого простору диска. Така ключова дискета підготовляється спеціальною установчою програмою, що за допомогою функції 05h переривання BIOS 13h, форматує, наприклад, доріжку номер 40 (або 80) із розміром сектора 256 байтів замість 512 і записує на її заданий ключ. Робоча програма перед початком роботи виконує читання нестандартної доріжки і при відсутності самої доріжки або ключа на ній аварийно завершується. Такий засіб зручний тим, що користувач, придбавши програмний продукт із ключовою дискетою, може вільно переносити його з комп'ютера на комп'ютер і навіть запускати його на декількох комп'ютерах одночасно, але не має можливості передати програмний пакет третій особі (не позбавивши себе ключової дискети).
Очевидно, що для жорсткості захисту розглянуті методи можуть використовуватися спільно в різноманітних комбінаціях.
3. Постанова задачі та методи її реалізації 3.1 Захист файлів від запису 3.1.1 Процес підготування програми на мові ассемблера
Процес підготування і налагодження програми включає такі етапи:
підготування вихідного тексту програми за допомогою будь-якого текстового редактора. Файл із вихідним текстом повинний мати розширення. ASM;
трансляція програми за допомогою ассемблера ТASM. EXE із метою одержання об'єктного файла;
компонування об'єктного модуля за допомогою компоновника ТLINK. ЕХЕ з метою одержання завантажувального файла
При виборі редактора для підготування вихідного тексту програми варто мати на увазі, що багато текстових процесорів (наприклад, Microsoft Word) додають у вихідний файл службову інформацію. Тому варто скористатися редактором, що виводить у вихідний файл "чистий текст", без яких-небудь керуючих символів. До таких редакторів відносяться, наприклад, широко поширені в нас Лексикон, Norton Editor і ін. Якщо файл із вихідним текстом програми названий P. ASM, то рядок виклику ассемблера може мати такий вид:
ТASM /ZI
Ключ /ZI управляє включенням в об'єктний файл номерів рядків вихідної програми й іншої інформації, не необхідної при виконанні програми, але використовуваної відлагоджувальником CodeView.
Рядок виклику компоновника може мати такий вигляд:
ТLINK /V
Ключ /V передає в завантажувальний файл символьну інформацію, що дозволяє відлагоджувальнику CV виводити на екран повний текст вихідної програми, включаючи мітки, коментарі та ін. Компоновник створює завантажувальний модуль у форматі. ЕХЕ. Якщо вихідна програма написана у форматі. СОМ, то після трансляції і компонування її треба перетворити у файл типу. СОМ. Для цього використовується включена до складу DOS зовнішня команда EXE2BIN:
EXE2BIN P P.com
Перший параметр позначає вихідний для команди EXE2BIN завантажувальний файл Р. ЕХЕ, другий - очікуваний результат перетворення. Вказівка розширення. СОМ у другому параметрі обов'язкова, тому що по замовчанню команда EXE2BIN створює файл із розширенням. BIN.
3.2 Реалізація задачіЗадача по забезпеченню захисту файлу на гнучкому диску від несанкціонованого запису передбачає створення такої програми, яка б при читанні диску не давала б змоги недозволеному користувач читати інформацію на ній.
Після того, як користувач запустить програму і введе ім’я файлу (File. Txt), що необхідно захистити від запису, програма відкриє цей файл, і витягне з нього один кластер. Місце, де знаходився цей кластер буде помічене як БЕД - блок. Потім програма створить файл на жорсткому диску (File_), в який буде занесено номер кластеру і пароль (пароль користувач повинно ввести в процесі роботи програми). Створивши такий файл програма закінчує свою роботу. Після цього файл на гнучкому диску не можна ні прочитати, ні скопіювати, ні знищити. Цей алгоритм програми дозволяє захистити файл від несанкціонованого копіювання на інший диск. Навіть коли дискету буде втрачено без наявності файлу File_ не можна надати файлу попереднього вигляду.
Список літератури
1. Финогенов К.Г. “Самоучитель по системным функциям MS-DOC".
2. Скэнлон Л. “Персональные ЭВМ IBM PC и XT”
3. Фигурнов: "Работа пользователя с IBM PC".
4. Громов В.И. Васильев Г.А. "Энциклопедия компьютерной безопасности"
5. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT: Пер. с англ. - Финансы и статистика, 1992. - 544 с.
6. Браун Р., Кайл Дж. Справочник по прерываниям для IBM PC: В 2-х томах: Т.1. Пер. с англ. - М.: Мир, 1994. - 558 с. Т.2. Пер. с англ. - М.: Мир, 1994. - 480 с.
Додатки Текст програми
. model tiny
. data
Boot db 512 dup (0)
Fat1 db 512*9 dup (0)
Root db 512*9 dup (0)
DTA db 2Ch dup (0)
RootRecord db 32 dup (0)
Size_Fat db 0
Clust dw 0
CntSim dw 0
el_DTA dw 0
el_Root dw 0
Save_di dw 0
MassOne dw 0
Sim dw 0
Handle dw?
FileName db 13 dup (0)
File_Nam db 13 dup (0)
New_File db 13 dup (0)
Password db 8 dup (0)
Passwd db 8 dup (0)
InFile db " "
Path db "a: \ "
Inp_file db "Input name of file: $"
Inp_Pass db "Input password: $"
Err_file db "Error name of file... $"
Err_Pass db "Error password... $"
Err_WrtF db "Error write Fat... $"
Err_WrtR db "Error write Root... $"
Select db "Select operatiom: ",13,10,"1 - Protected file",13,10,"2 - DeProtected file",13,10,"$"
. code
SetDTA Proc
mov ah,1ah
mov dx,offset DTA
int 21h
Ret
SetDTA Endp
Perevod Proc
mov ah,2
mov dl,13
int 21h
mov ah,2
mov dl,10
int 21h
Ret
Perevod Endp
ReadBoot Proc; Процедура читання BOOT сектора
mov al,0
mov dx,0
mov cx,1
mov bx,offset Boot
int 25h
pop dx
Ret
ReadBoot Endp
CntFat Proc
mov ah,Boot [16h]
mov Size_Fat,ah
Ret
CntFat Endp
ReadFat Proc; Процедура читання FAT
mov cx,0
mov al,0
mov dx,1
mov cl,Size_Fat
mov bx,offset Fat1
int 25h
pop dx
Ret
ReadFat Endp
ReadRoot Proc
mov al,0
mov dx, 19
mov cx,8
mov bx,offset Root
int 25h
pop dx
Ret
ReadRoot Endp
ReadNameFile Proc; Процедура читання ім’я файлу
mov ah,09h
mov dx,offset Inp_File
int 21h
call SetDTA
mov di,0
NewSimFileName:
mov ah,1
int 21h
cmp al,13
je EndVvod
cmp al,'a'
jl NotBig
cmp al,'z'
jg NotBig
sub al, 20h
NotBig:
mov FileName [di],al
mov File_Nam [di],al
inc di
cmp di,13
jne NewSimFileName
EndVvod:
mov di,0
NewSimPath:
mov ah,FileName [di]
mov Path [di+3],ah
cmp ah,0
je EndPath
inc di
jmp NewSimPath
EndPath:
mov ah,4eh
mov dx,offset Path
mov cx,3Fh
int 21h
jnc FileOk
call Perevod
mov ah,09h
mov dx,offset Err_File
int 21h
mov ah,1
int 21h
jmp Exit0
FileOk:
mov di,12
mov si,10
NewSimName:
mov ah,FileName [di]
dec di
cmp ah,0
je NewS
mov FileName [si],ah
mov bh,0
mov FileName [di+1],bh
dec si
NewS:
cmp ah,'. '
jne NewSimName
mov bh,0
mov FileName [si+1],bh
mov di,0
NewS1:
mov ah,FileName [di]
cmp ah,0
jne NewS2
mov bh,' '
mov FileName [di],bh
NewS2:
inc di
cmp di,11
jne NewS1
Ret
ReadNameFile Endp
NumClust Proc; Процедура, що зчитує номер кластера
mov di,0
NewSimRoot:
mov di,el_Root
mov ah,Root [di]
mov di,el_DTA
mov al,FileName [0]
cmp ah,al
jne Dalee
mov bx,el_Root
mov di,0
mov el_DTA,di
NewSimEqu:
mov di,el_Root
mov ah,Root [di]
mov di,el_DTA
mov al,FileName [di]
cmp ah,al
jne NotEqu
inc CntSim
NotEqu: inc el_Root
inc el_DTA
mov di,el_DTA
cmp di,11
jne NewSimEqu
cmp di,CntSim
jne NotThisFile
sub di,11
mov Save_di,di
jmp Read_Clust
NotThisFile:
mov di,0
mov el_DTA,di
mov CntSim,di
mov el_Root,bx
Dalee: inc di
inc el_Root
mov di,el_Root
cmp di,3200
jne NewSimRoot
Read_Clust:
mov di,el_Root
sub di,11
mov al,Root [di+1ah]
mov ah,Root [di+1bh]
mov Clust,ax
mov bx,0
NewSimRecord:
mov ah,Root [di+bx]
mov RootRecord [bx],ah
inc bx
cmp bx,32
jne NewSimRecord
Ret
NumClust Endp
ReadClusts Proc; Процедура читання кластера
mov ax,Clust
mov bx,0
mov dx,0
mov ax,Clust
mov bx,3
mul bx
mov bx,2
div bx
mov bx,ax
mov cx,Clust
and cx,1
jne NeChet
mov al,Fat1 [bx]
mov ah,Fat1 [bx+1]
mov cx,ax
shr cx,12
shl cx,12
add cx,0FF7h
mov Fat1 [bx],cl
mov Fat1 [bx+1],ch
shl ax,4
shr ax,4
mov MassOne,ax
jmp EndClust
NeChet:
mov al,Fat1 [bx]
mov ah,Fat1 [bx+1]
mov cx,ax
shl cx,12
shr cx,12
add cx,0FF70h
mov Fat1 [bx],cl
mov Fat1 [bx+1],ch
shr ax,4
mov MassOne,ax
EndClust:
Ret
ReadClusts Endp
ReadPassword Proc; Процедура, що читає пароль
call Perevod
mov ah,09h
mov dx,offset Inp_Pass
int 21h
mov di,0
NewSimPassword:
mov ah,8
int 21h
cmp al,13
je EndVvodPass
mov Password [di],al
inc di
cmp di,8
jne NewSimPassword
EndVvodPass:
Ret
ReadPassword Endp
WriteFile Proc; Процедура запису в файл
mov di,0
NewSimN_File:
mov ah,File_Nam [di]
cmp ah,0
je EndVvodN_File
mov New_File [di],ah
inc di
cmp di,13
jne NewSimN_File
EndVvodN_File:
mov ah,'_'
mov New_File [di-1],ah
mov ah,3Ch
mov dx,offset New_File
mov cx,0
int 21h
jnc N_FileOk
mov ah,09h
mov dx,offset Err_File
int 21h
mov ah,1
int 21h
jmp Exit0
N_FileOk:
mov Handle,ax
mov di,Save_di
mov ah,40h
mov bx,Handle
mov cx,32
mov dx,offset RootRecord
int 21h
mov di,0
mov ax,MassOne
mov si,5
NewDec:
mov dx,0
mov bx,10
div bx
mov cx,ax
add dl,30h
mov InFile [si-1],dl
dec si
mov ax,cx
cmp si,0
jne NewDec
mov ah,40h
mov bx,Handle
mov cx,5
mov dx,offset Infile
int 21h
call ReadPassword; Викликаємо процедуру ReadPassword
mov ah,40h
mov bx,Handle
mov cx,di
mov dx,offset Password
int 21h
mov ah,3eh
mov bx,Handle
int 21h
Ret
WriteFile Endp
WriteData Proc; Процедура запису в файл даних
mov ax,0
mov cx,0
mov al,0
mov dx,1
mov cl,Size_Fat
mov bx,offset Fat1
int 26h
pop dx
jnc no_err
call Perevod
mov ah,09h
mov dx,offset Err_WrtF
int 21h
mov ah,1
int 21h
jmp Exit0
no_err:
Ret
WriteData Endp
Coder Proc
call Perevod
call ReadBoot
call CntFat
call ReadFat
call ReadRoot
call ReadNameFile
call NumClust
call ReadClusts
call WriteFile
call WriteData
Ret
Coder Endp
FindNullRecord Proc; Процедура знаходження нульового запису
mov di,0
NewSimFindRecord:
mov ah,Root [di]
inc di
cmp ah,229
jne NewSimFindRecord
dec di
mov Save_di,di
Ret
FindNullRecord Endp
ReadNameFileW Proc; Процедура читання імені записаного файлу
mov ah,09h
mov dx,offset Inp_File
int 21h
call SetDTA
mov di,0
W_NewSimFileName:
mov ah,1
int 21h
cmp al,13
je W_EndVvod
cmp al,'a'
jl W_NotBig
cmp al,'z'
jg W_NotBig
sub al, 20h
W_NotBig:
mov FileName [di],al
inc di
cmp di,13
jne W_NewSimFileName
W_EndVvod:
mov ah,4eh
mov dx,offset FileName
mov cx,3Fh
int 21h
jnc W_FileOk
call Perevod
mov ah,09h
mov dx,offset Err_File
int 21h
mov ah,1
int 21h
jmp Exit0
W_FileOk:
Ret
ReadNameFileW Endp
ReadFile Proc; Процедура читання файлу
mov ah,3dh
mov dx,offset FileName
mov al,2
int 21h
jnc R_FileOk
call Perevod
mov ah,09h
mov dx,offset Err_File
int 21h
mov ah,1
int 21h
jmp Exit0
R_FileOk:
mov Handle,ax
mov ah,3fh
mov bx,Handle
mov cx,32
mov dx,offset RootRecord
int 21h
mov di,0
mov ah,3fh
mov bx,Handle
mov cx,5
mov dx,offset InFile
int 21h
mov di,0
mov ax,0
mov MassOne,ax
mov bx,10000
mov cx,10
NewDec_R:
mov dx,0
mov al, InFile [di]
sub al,30h
mul bx
mov Sim,ax
mov dx,0
mov ax,bx
div cx
mov bx,ax
mov ax,Sim
add MassOne,ax
mov ax,0
inc di
cmp di,5
jne NewDec_R
mov ax,MassOne
call ReadPassword
mov ah,3fh
mov bx,Handle
mov cx,8
mov dx,offset Passwd
int 21h
mov bx,ax
mov ax,0
mov di,0
mov CntSim,ax
NewSimPw:
mov ah,Password [di]
mov al,Passwd [di]
cmp ah,al
jne Dalee0
inc CntSim
Dalee0:
inc di
cmp di,bx
jne NewSimPw
cmp di,CntSim
je PasswdOk
call Perevod
mov ah,09h
mov dx,offset Err_Pass
int 21h
mov ah,1
int 21h
jmp Exit0
PasswdOk:
mov di,Save_di
mov bx,0
NewRR:
mov ah,RootRecord [bx]
mov Root [di+bx],ah
inc bx
cmp bx,32
jne NewRR
Ret
ReadFile Endp
WriteClusts Proc; Процедура запису в файл кластера
mov al,RootRecord [1ah]
mov ah,RootRecord [1bh]
mov Clust,ax
mov ax,Clust
mov bx,0
mov dx,0
mov ax,Clust
mov bx,3
mul bx
mov bx,2
div bx
mov bx,ax
mov cx,Clust
and cx,1
jne NeChetW
mov al,Fat1 [bx]
mov ah,Fat1 [bx+1]
mov cx,ax
shr cx,12
shl cx,12
add cx,MassOne
mov Fat1 [bx],cl
mov Fat1 [bx+1],ch
jmp EndClustW
NeChetW:
mov al,Fat1 [bx]
mov ah,Fat1 [bx+1]
mov cx,MassOne
shl cx,4
mov MassOne,cx
mov cx,ax
shl cx,12
shr cx,12
add cx,MassOne
mov Fat1 [bx],cl
mov Fat1 [bx+1],ch
EndClustW:
Ret
WriteClusts Endp
DeleteFile Proc; Процедура знищення файлу
mov ah,41h
mov dx,offset FileName
int 21h
Ret
DeleteFile Endp
DeCoder Proc
call Perevod
call ReadBoot
call CntFat
call ReadFat
call ReadRoot
call FindNullRecord
call ReadNameFileW
call ReadFile
call WriteClusts
call WriteData
call DeleteFile
Ret
DeCoder Endp
Select_Operation Proc
NewSelect:
call Perevod
mov ah,09h
mov dx,offset Select
int 21h
mov ah,1
int 21h
cmp al,31h
jne NotCoder
call Coder
jmp EndSelect
NotCoder:
cmp al,32h
jne NotDeCoder
call DeCoder
jmp EndSelect
NotDeCoder:
jmp NewSelect
EndSelect:
call Perevod
Ret
Select_Operation Endp
Main Proc
mov ax,@data
mov ds,ax
call Select_Operation
Exit0: mov ah,04ch
int 21h
Main Endp
End Main
Блок-схема алгоритму
Продовження блок-схеми алгоритму:
Похожие работы
... заціях для обміну інформацією усе ширше використовують електронну пошту, що без додаткових засобів захисту може стати надбанням сторонніх осіб. Самим надійним захистом від несанкціонованого доступу до переданої інформації і програмних продуктів ПК є застосування різноманітних методів шифрування (криптографічних методів захисту інформації). Криптографічні методи захисту інформації - це спеціальні ...
... В АБС АКБ «ПРОМІНВЕСТБАНК» ТА ОЦІНКА РІВНЯ ВРАЗЛИВОСТІ БАНКІВСЬКОЇ ІНФОРМАЦІЇ 3.1 Постановка алгоритму задачі формування та опис елементів матриці контролю комплексної системи захисту інформації (КСЗІ) інформаційних об’єктів комерційного банку В дипломному дослідженні матриця контролю стану побудови та експлуатації комплексної системи захисту інформації в комерційному банку представлена у вигляді ...
... в компіляторах. Але, оскільки в інформаційних системах необхідно підтримувати складні структури даних, ці індивідуальні засоби керування даними складали суттєву частину інформаційних систем, практично повторюючись, від однієї системи до іншої. Намагання виділити загальну частину інформаційних систем, відповідальну за керування складно-структурованими даними стало, першою спонукаючою причиною ...
... перегляду текстових файлів Натискаючи або вибираючи в нижній частині панелей TC F3 можна відкривати файли для перегляду, при цьому вони не можуть редагуватися. 6. Що таке фрагментація файлів і як її усунути Прискорення роботи жорсткого диска здійснюється шляхом дефрагментації. 1. Запускаємо програму дефрагментації диска. 2. Вибираємо диск, який потрібно. Можна також для запуску програми ...
0 комментариев