Защита от доступа к функционально-логической структуре системы связи

 

АННОТАЦИЯ


В данном документе описываются основные теоретические данные, необходимые для решения поставленной задачи по теме «Защита информации от копирования» по дисциплине «Кодирование и защита информации». Помимо теоретических данных, в документе описана программа, которая была написана для демонстрации работы данного алгоритма. Программа имеет интуитивно понятный интерфейс. Работоспособность программы была тщательно проверена.

В качестве языка программирования был выбран C++ и среда C++ Builder 6. Программа работает под управлением ОС Windows 7 (x32).



СОДЕРЖАНИЕ


. ОБЗОР СУЩЕСТВУЮЩИХ МЕТОДОВ И СРЕДСТВ РЕШЕНИЯ

.1 Проверка даты изготовления и контрольной суммы ПЗУ

.2 Проверка места расположения файла на диске

.3 Функция установки программы на жесткий диск

. ВЫБОР И ОБОСНОВАНИЕ МЕТОДА

. ИНФОРМАЦИОННАЯ ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ВЫБРАННОГО МЕТОДА

. ОЦЕНКА И РАСЧЕТ ОСНОВНЫХ ИНФОРМАЦИОННЫХ ХАРАКТЕРИСТИК

. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

ЗАКЛЮЧЕНИЕ

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

ПРИЛОЖЕНИЕ A

ПРИЛОЖЕНИЕ B

ПРИЛОЖЕНИЕ C

защита информация программа


1. ОБЗОР СУЩЕСТВУЮЩИХ МЕТОДОВ И СРЕДСТВ РЕШЕНИЯ ЗАДАЧИ СО СРАВНИТЕЛЬНЫМ АНАЛИЗОМ РАЗЛИЧНЫХ ПОДХОДОВ


1.1 ПРОВЕРКА ДАТЫ ИЗГОТОВЛЕНИЯ И КОНТРОЛЬНОЙ СУММЫ ПЗУ


Постоянное запоминающее устройство (ПЗУ) является неотъемлемой составной частью любого ПК. Содержимое ПЗУ учитывает особенности реализации конкретного ПК и может отличаться в компьютерах разного типа. Более того в конце ПЗУ (по адресу $F000:$FFF5) обычно записывается дата его изготовления, поэтому даже для ПК одного типа (и одной и той же фирмы - изготовителя) контрольная сумма ПЗУ отличается в разных экземплярах ПК.

Дата изготовления ПЗУ находится по адресу $F000: $FFF5 и занимает 8 смежных байт. Данные хранятся в символьном виде в формате MM/DD/YY (ММ - символы номера месяца, DD - номера дня, YY - номера года), например «06/26/12». Следующая программа выводит на экран дату изготовления ПЗУ:

:Integer;

begink:=0 to 7 do(chr(Mem[$F000:$FFF5+k]));

WriteLn .


Как показывает практика, любая уважающая себя фирма - изготовитель ПЗУ для ПК тщательно следит за корректностью этой даты. Конечно, каждый день во всем мире изготавливаются тысячи микросхем ПЗУ с одинаковой датой, однако вероятность того, что на конкурирующей с Вами фирме используются ПК того же типа и с такой же датой изготовления, как и у Вашего компьютера, крайне мала. Разумеется, при массовой закупке ПК, например для оснащения учебного класса многие или даже все одновременно приобретенные компьютеры могут иметь одну и ту же дату изготовления ПЗУ- Однако в таких случаях способность защищенных программ свободно переноситься с одного родственного компьютера на другой можно рассматривать как вполне естественную.

Эта проверка используется для защиты стационарных программ.


1.2 ПРОВЕРКА МЕСТА РАСПОЛОЖЕНИЯ ФАЙЛА НА ДИСКЕ


Хорошей индивидуальностью обладает физический номер кластера, начиная с которого на жестком диске располагается файл с защищенной программой, Действительно, вряд ли что-либо другое в аппаратно-программной среде ПК (кроме, разумеется, содержимого оперативной памяти) меняется столь же динамично, как файловая структура жесткого диска. При создании легальной копии номер начального кластера для файла программы на жестком диске в общем случае совершенно случаен. Если в момент запуска программа проверит этот номер, то в подавляющем большинстве случаев она легко обнаружит факт нелегального копирования.

Тем не менее, такой способ защиты нельзя считать идеальным по многим причинам. Проверка номера кластера выполняется далеко не так просто, как проверка типа ПК или даты изготовления ПЗУ, поскольку в стандартном Турбо Паскале (Турбо Си) нет средств для работы с дисками на физическом уровне. Однако главный недостаток заключается в другом: любое изменение местоположения файла даже в пределах одного каталога приводит к тому, что ранее установленная копия становится нелегальной. Это крайне неудобно для пользователя, в особенности если- он часто прибегает к процедуре переупорядочения файловой структуры с помощью утилиты типа программы П. Нортона Speed Disk.

Для проверки номера кластера можно использовать модуль F_Disk (отдельно распространяемая библиотека). В него входит процедура GetDirltem, возвращающая элемент каталога для заданного имени файла. Параметр FirstC этого элемента содержит интересующий нас номер.

Следующая программа выведет номер кластера для «своего» файла (т.е. ЕХЕ-файла, в котором она расположена). Для нормальной работы программы в среде Турбо Паскаль она должна компилироваться на диск.


Uses F_Disk; :Dir_Type; (ParamStr(0),DI); ('Файл ', ParamStr(0), ' начинаетсяскластера', DI.FirstC)

end.


Если Вы считаете, что номер единственного кластера не обладает необходимой степенью индивидуальности, Вы можете проверять цепочку кластеров по таблице FAT (NTFS) или начальные кластеры нескольких файлов.

Разумеется, такая проверка может использоваться для защиты только стационарных программ.


.3 ФУНКЦИЯ УСТАНОВКИ ПРОГРАММЫ НА ЖЕСТКИЙ ДИСК


Функция установки программы на жесткий диск состоит в «привязке» программы к конкретному ПК. Эта функция установки обеспечивает защиту от несанкционированного копирования программы с жесткого диска. Этот способ обеспечивают работу защищенной программы только при наличии ключевой дискеты и не позволяют «привязывать» программу к компьютеру. Для ряда пользователей это может показаться неудобным, так как каждый раз при запуске программы необходимо вставлять ключевую дискету в накопитель, кроме этого, дискету необходимо еще и хранить. Функция установки может быть реализована несколькими способами. Рассмотрим некоторые из них.

Одним из самых простых способов является закрепление за программой конкретного местоположения на НЖМД. В этом случае во время установки программы сохраняется дисковый адрес расположения программы. В ряде систем кроме дисковых адресов кластеров файлов установленной программы может быть сохранен порядок следования этих кластеров. Копирования программы обычными средствами Windows приведет к изменению местоположения файлов программы, что можно легко обнаружить при запуске программы. (Данный метод был рассмотрен ранее).

Другой способ заключается в том, что при установке программы на НЖМД сохраняются характеристики, специфичные только для данного компьютера такие как серийный номер процессора, контрольная сумма системы BIOS, серийный номер флеш накопителя. Данный способ обладает целым рядом достоинств. Так, копия программы может быть расположена на произвольном числе ПК, но работать она будет только на ПК, в который установлен данный накопитель. Недостатком данного способа является необходимость постоянно хранить данный накопитель и в случае потери «флешки» программа станет недоступной.



2. ВЫБОР И ОБОСНОВАНИЕ МЕТОДА


Среди описанных методов, на мой взгляд, наиболее эффективен метод, основанный на использовании индивидуальных свойств носителей информации, который и используется в данном курсовом проекте. Остальные методы, в частности проверка ПЗУ и состава аппаратных средств не является надежной защитой, по причине наличия достаточно большого количества подобных компьютеров. Хотя они являются незаменимыми при защите мобильных программ в рамках одной организации или класса вычислительной техники по причине идентичности аппаратных средств, что позволяет использовать программы только в пределах данной организации (класса вычислительной техники).

Еще один метод - метод проверки расположения файла на диске. Данный метод может считаться эффективным только для стационарных копий, так как программа перестает работать после первой же дефрагментации диска.

Метод, основанный на использовании индивидуальных свойствах носителей информации наиболее актуален так как имеет высокую степень надежности, не ограничивает пользователя при выборе расположения программы, при необходимости позволяет использовать программу на других ПК.Скорость работы алгоритма на порядок выше, чем в остальных методах.

Однако у этого алгоритма есть один недостаток, которого лишены остальные методы - постоянное наличие накопителя. Но тем не менее этот метод защиты является достаточно эффективным.




3. ИНФОРМАЦИОННАЯ ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ВЫБРАННОГО МЕТОДА


Для написания программы, защищающая текст от копирования, использован язык программирования C++ и среда программирования BuilderC++ 6.

Реализуя защиты информации был использован процедурный подход. Для работы с USB устройствами были подключены стандартные библиотеки <Setupapi.h> и <devguid.h>.

При запуске программы появляется окно с полем для текста и тремя кнопками. Если к компьютеру подключен нужный флеш накопитель, то форма с текстом активна (подсвечивается зеленым цветом), иначе форма неактивна (подсвечивается красным цветом). При подключении/отключении накопителя автоматически происходит обновления формы, так же присутствует кнопка «Обновить» для ручного обновления формы - проверка компьютера на наличие флеш накопителя. Кнопка «Сохранить» позволяет сохранить защищенный текст в незащищенный формат txt на компьютер (при нажатии на кнопку появляется окно где пользователь выбирает куда сохранить файл и имя конечного файла), кнопка «Выход» позволяет закрыть программу.

Структурная схема алгоритма выглядит следующим образом:

Рисунок 3.1 - Структурная схема программ


Рисунок 3.2 - Структурная схема функции USBCHECK

. ОЦЕНКА И РАСЧЕТ ОСНОВНЫХ ИНФОРМАЦИОННЫХ ХАРАКТЕРИСТИК


Выполним расчет основных информационных характеристик.

Серийный номер флеш накопителя состоит из 24 знаков, в котором присутствуют как буквы английского алфавита, так и цифры. При попытке подбора потребуется попыток, т.е. 8,218* комбинаций. При данном способе защиты количество защищаемого текста не ограничено. Реакция системы на наличие USB-устройства составляет 0,002 секунды. Метод довольно прост в реализации. Программа весит 471 килобайт, имеет 170 строк кода, обладает высоким быстродействием




. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ


Для выполнения программы необходимо запустить исполняемый файл KIZI.exe. После запуска программы на экране появляется окно:


Рисунок 5.1- Основное меню программы (флеш накопитель не подключен)


Если к компьютеру подключен нужный флеш накопитель, то форма с текстом активна (подсвечивается зеленым цветом), иначе форма неактивна (подсвечивается красным цветом).

Рисунок 5.2- Основное меню программы (флеш накопитель подключен)


При подключении/отключении накопителя автоматически происходит обновления формы, так же присутствует кнопка «Обновить» для ручного обновления формы - проверка компьютера на наличие флеш накопителя.

Кнопка «Сохранить» позволяет сохранить защищенный текст в незащищенный формат txt на компьютер (при нажатии на кнопку появляется окно, где пользователь выбирает куда сохранить файл и имя конечного файла).

Рисунок 5.3- Сохранить(флеш накопитель подключен)


Если флеш накопитель не подключен, то при нажатии кнопки «Сохранить» появится сообщение о недоступности данной функции.


Рисунок 5.4- Сохранить(флеш накопитель не подключен)


Кнопка «Выход» позволяет завершить выполнение программы.

ЗАКЛЮЧЕНИЕ


В ходе выполнения курсового проекта была разработана и написана программа согласно с заданием варианта: был изучен один из методов защиты информации от несанкционированного копирования, составлены структурные схемы операций, используемых в алгоритме, разработана программа, реализующая данный алгоритм и тестовый пример. Алгоритм решения задачи на ЭВМ реализован на языке программирования C++ Текст программы находится в приложении к курсовой работе.

В ходе выполнения курсовой работы были изучена структура основных методов реализации защиты информации от копирования, был использован ряд литературы, который приведен в разделе «Библиографический список». Тестирование программы подтвердило ее эффективность как в плане защиты от копирования, так и в плане быстродействия. Компактность и скорость алгоритма позволяет использовать его в программах, которые необходимо оградить от несанкционированного копирования.

Таким образом, цель курсового проекта достигнута, задание выполнено согласно с вариантом: была разработана программа для защиты информации от копирования. Программа работает корректно.



БИБЛИОГРАФИЧЕСКИЙ СПИСОК


Веб-ресурс Википедия - ru.wikipedia.org

А.В.Спесивцев / В.А.Вегнер / А.Ю.Крутяков /В.В.Серегин / В.А.Сидоров «Защита информации в персональных ЭВМ» - М: Радио и Связь, Веста, 1993 - 193с

Б.Шнайер: «Прикладная криптография. Протоколы, алгоритмы, исзодные тексты на языке Си.» (научно-технический редактор перевода - П.. Семьянов) - М: Издательство ТРИУМФ, 2003 - 816 с.: ил



ПРИЛОЖЕНИЕ A


СодержимоефайлаUnit1.cpp

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Севастопольский национальный технический университет

Кафедра информационных систем

Программа защиты информации от копирования

РАЗРАБОТАЛ

Студент гр. И-32д

Лынок А.Ю.


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Вариант задания 11 Утверждено 06.09.2012

Среда программирования BuilderC++

Дата последней коррекции: 25.10.2011 .

Версия 1.1

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


#include <vcl.h>

#pragma hdrstop

#include <stdio.h>

#include <windows.h>

#include <Setupapi.h>

#include <devguid.h>

#include "conio.h"

#include "tchar.h"

//#include <devguid.h>_GUID( GUID_DEVCLASS_USB,0x36FC9E60, 0xC465, 0x11CF, 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 );ol="USB\\VID_0951&PID_162A\\001CC07CED91F091916AE363";ol2;txxt;

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form1;fi=0;lol=0;sv;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{=false;

}

//---------------------------------------------------------------------------

__fastcall TForm1::FormCreate(TObject *Sender)

{

//Memo2->Text=="При изучении данного раздела дисциплины Кодирование и защита информации выполняется шесть лабораторных работ. На каждую из них отводится 4 часа аудиторных занятий и 2 часа самостоятельных работ."

"Каждая из лабораторных работ связана с построением и исследованием определённого двоичного кода. Для исследования помехоустойчивости кодов исследуется программная модель информационной системы, в которой осуществляется передача дискретной информации от источника к приёмнику через канал связи с помехами."

"В качестве исходных данных к лабораторным работам выступают:"

"-осмысленный фрагмент текста, являющийся исходным сообщением, подлежащим кодированию (текст выдаётся на первом занятии и используется им в течение всего семестра)"

"-метод кодирования, подлежащий исследованию в конкретной лабораторной работе."

"На первом этапе необходимо определить информационные характеристики сообщения: состав символов (алфавит), частоты появления символов в сообщении, энтропию сообщения (указанные характеристики являются общими для всех лабораторных работ и поэтому рассчитываются только в первой лабораторной работе)"

"Исследуя информационные характеристики сообщения для заданного в каждой лабораторной работе метода кодирования производится разработка кода вручную. В результате построения данного этапа лабораторной работы должны быть построены полные таблицы кодов для эффективных либо неразделимых кодов, либо получены порождающая и проверочная матрицы для систематических и блочных кодов."

"Затем рассчитываются информационные характеристики кодов. Данная операция выполняется один раз в пределах каждой лабораторной работы."

"Используя файл как исходное сообщение и таблицу кодов или порождающую матрицу кода как программную модель производится построение кодовой последовательности на выходе канала связи. Данная операция также производится однократно в пределах выполнения каждой лабораторной работы."

"Далее для различных значений вероятности искажения одиночного разряда или нескольких разрядов производится имитация прохождения сообщения через канал связи с шумами. В результате на выходе канала связи получается искажённое сообщение (кодовая последовательность).";

//-----------------*------------------------------*--------------------------------*-------------------------*------------------------>Text=txxt;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{; // информация о всех подключенных утройствах*guidDev = (GUID*) &GUID_DEVCLASS_USB; // параметр для поиска устройства= SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE); // запись в deviceInfoSet информации о всех устройствах

TCHAR buffer [4000]; //строкаmemberIndex = 0; //счетчик(true)

{

SP_DEVINFO_DATA deviceInfoData; // информация об одном устройстве

ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA)); // обнуление deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); // в поле размер //(dviceInfoData) записываем размер (SP_DEVINFO_DATA)(SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex, &deviceInfoData) == FALSE) // проверка на ошибки

{(GetLastError() == ERROR_NO_MORE_ITEMS)

{;

}

}=0 ; // объявляение переменно под размер(deviceInfoSet, &deviceInfoData, buffer, sizeof(buffer), &nSize); //записываем из deviceInfoSet в deviceInfoData[nSize] ='\0'; //дописываем конец строки

_tprintf (_T("%s\n"), buffer); //записываем содержимое deviceInfoData в буфер++; //увеличиваем счетчик(String(buffer).SubString(1,8)=="USB\\VID_") { // проверяем юсб //устройство

// ShowMessage(String(buffer)); // AnsiString dsa; =buffer;(CompareText(ol,ol2)==0) lol=1; //присваеваем флажок }

}(deviceInfoSet)

{(deviceInfoSet); //очищение deviceInfoSet

}


//-----------------*------------------------------*--------------------------------*-------------------------*-----------------------(lol==1) { Memo2->Enabled=true;->Canvas->Brush->Color=clGreen;->Canvas->Rectangle(6,6,556,435);

}{ Memo2->Enabled=false;->Canvas->Brush->Color=clRed;->Canvas->Rectangle(6,6,556,435);

}

}

//---------------------------------------------------------------------------

__fastcall TForm1::Button2Click(TObject *Sender)

{>Terminate();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{=0;; // информация о всех подключенных утройствах*guidDev = (GUID*) &GUID_DEVCLASS_USB; // параметр для поиска устройства= SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE); // запись в deviceInfoSet информации о всех устройствах

TCHAR buffer [4000]; //строкаmemberIndex = 0; //счетчик(true)

{

SP_DEVINFO_DATA deviceInfoData; // информация об одном устройстве

ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA)); // обнуление //deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); // в поле размер //(dviceInfoData) записываем размер (SP_DEVINFO_DATA)(SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex, &deviceInfoData) == FALSE) // проверка на ошибки

{(GetLastError() == ERROR_NO_MORE_ITEMS)

{;

}

}nSize=0 ; // объявляение переменно под размер(deviceInfoSet, &deviceInfoData, buffer, sizeof(buffer), &nSize); //записываем из deviceInfoSet в deviceInfoData[nSize] ='\0'; //дописываем конец строки

_tprintf (_T("%s\n"), buffer); //записываем содержимое deviceInfoData в буфер++; //увеличиваем счетчик(String(buffer).SubString(1,8)=="USB\\VID_") { // проверяем юсб устройство

// ShowMessage(String(buffer)); // AnsiString dsa;=buffer;(CompareText(ol,ol2)==0) lol2=1; //присваеваем флажок }

}(deviceInfoSet)

{(deviceInfoSet); //очищение deviceInfoSet

}


//-----------------*------------------------------*--------------------------------*-------------------------*-----------------------(lol2==1) { Memo2->Enabled=true;->Canvas->Brush->Color=clGreen;->Canvas->Rectangle(6,6,556,435);=true;

}{ Memo2->Enabled=false;->Canvas->Brush->Color=clRed;->Canvas->Rectangle(6,6,556,435);=false;

}

}


//---------------------------------------------------------------------------

__fastcall TForm1::Button1Click(TObject *Sender)

{kl;=Memo2->Text;

(sv) {(SaveDialog1->Execute() ) {*lst=new TStringList;=Memo2->Text;>Text=kl;>SaveToFile(SaveDialog1->FileName+".txt");

delete lst;

}

}ShowMessage("Функция в данный момент не доступна!");

}

//---------------------------------------------------------------------------




ПРИЛОЖЕНИЕB


СодержимоефайлаUnit1.h

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Севастопольский национальный технический университет

Кафедра информационных систем

Программа защиты информации от копирования


РАЗРАБОТАЛ

Студент гр. И-32д

Лынок А.Ю.


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Вариант задания 11 Утверждено 06.09.2012

Среда программирования BuilderC++

Дата последней коррекции: 25.10.2011 .

Версия 1.1

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


#ifndefUnit1H

#define Unit1H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Dialogs.hpp>

#include <ExtCtrls.hpp>

//---------------------------------------------------------------------------TForm1 : public TForm

{

__published:// IDE-managed Components*Memo2;*Button4;*Button1;*Button2;*Label1;*Timer1;*SaveDialog1;__fastcall FormCreate(TObject *Sender);__fastcall Button4Click(TObject *Sender);__fastcall Button2Click(TObject *Sender);__fastcall Timer1Timer(TObject *Sender);__fastcall Button1Click(TObject *Sender);:// User declarations:// User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif



ПРИЛОЖЕНИЕ C


Содержимое файлаProject3_1

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Севастопольский национальный технический университет

Кафедра информационных систем

Программа защиты информации от копирования


РАЗРАБОТАЛ

Студент гр. И-32д

Лынок А.Ю.


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Вариант задания 11 Утверждено 06.09.2012

Среда программирования BuilderC++

Дата последней коррекции: 25.10.2011 .

Версия 1.1

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include<vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------("Unit1.cpp", Form1);

//---------------------------------------------------------------------------WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

{>Initialize();>CreateForm(__classid(TForm1), &Form1);>Run();

}(Exception &exception)

{>ShowException(&exception);

}(...)

{

{Exception("");

}(Exception &exception)

{>ShowException(&exception);

}

}0;

}

//---------------------------------------------------------------------------

1.


АННОТАЦИЯ В данном документе описываются основные теоретические данные, необходимые для решения поставленной задачи по теме «Защита информации от ко

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ