Классификация вредоносного ПО на основе композиций и комбинирования

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Введение

В настоящее время, в век информационных технологий, уже сложно найти людей не знакомых с такими терминами как вредоносное ПО, компьютерный вирус, компьютерный червь, троян, шифровальщик и т.п. Плюс к этому, большинство людей из этого множества также знает или подозревает, что таковые вредоносные ПО могут комбинировать, например троян может скрывать шифровальщика, а червь может выступать в кооперации с вирусом, и т.п. Плюс к этому существует достаточно большое количество книг и статей, описывающих вредоносные ПО и их композиции между собой. Тогда встаёт логичный вопрос: зачем нужна ещё одна статья, описывающая классификацию вредоносного ПО?

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

Таким образом, целью статьи будет являться: 1) сведение описания вредоносных ПО к их базовым функциям, 2) обобщение связей разнородных ПО по их более раздробленным классификациям. Далее, в работе иногда я буду сокращать "вредоносное ПО" до "ВПО".

Виды вредоносного ПО

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

Вирус

Основная специфика вируса - это его саморепликация, за счёт которой он становится способным внедрять свой код в другие ПО, тем самым их заражая. Заражённое ПО, вследствие своего заражения, становится способным далее также самореплицировать код вируса на другие ПО. Чистый вирус более не несёт никакой другой логики, кроме как саморепликации.
В настоящее время, наиболее распространены макровирусы, внедряющиеся в файлы типа .docs, .xlsx и прочее, в то время как классические вирусы буквально вымерли из-за всё более усложняющихся и совершенствующихся операционных систем, компиляторов, разнородности языков программирования и т.п. Необходимость учитывания всех возможных вариаций ПО, защиты ОС, оптимизаций компиляторов свело к минимуму использование классических вирусов.

Троян

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

Червь

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

Шифровальщик

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

Локер

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

Программа удалённого доступа

Программа удалённого доступа сама по себе не является вредоносным ПО, тем не менее, может использоваться как таковое. В представлении чистых функций программы удалённого доступа являют собой исключительно факт передачи данных от одной системы к другой, ни более ни менее. Сопутствующие действия (включая деструктуризирующие) могут рассматриваться как комбинация применений нескольких программ.
Программы удалённого доступа, использующиеся в качестве вредоносного ПО, также именуют RAT (Remote Access Trojan). Со стороны нашей концепции это будет не совсем корректно, потому как программы удалённого доступа в своём чистом виде оторваны от троянов, и как следствие, не представляют способ какого-либо обмана. Плюс к этому программа удалённого доступа может быть установлена другими методами, отличными от троянов, из-за чего и сам термин RAT начинает терять полностью свою валидность. В таком случае, для последующего сокращения я буду иногда использовать аббревиатуру RAP - Remote Access Program (звучать будет странно, согласен).

Стиллер

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

Руткит

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

Буткит

Основная специфика буткита - это вызов программ до загрузки операционной системы, вследствие чего буткит становится способен эффективно скрывать ранее запущенные процессы, которые нельзя будет увидеть стандартными средствами ОС.
Чистая функция буткита представляет собой лишь возможность выполнения установленных действий, не определяя их назначение. Иными словами, буткит технически, в своём чистом представлении, может быть безвреден, складируя "hello, world" в определённый сектор HHD или SSD перед загрузкой ОС.

Ботнет

Основная специфика ботнета - это кооперирование множества заражённых жертв (ботов) с целью осуществления запланированного действия, требующего много вычислительных ресурсов.
Примером таковых вредоносных ПО могут служить майнеры, вычисляющие необходимый хеш в задаче типа Proof-of-Work. Также примером ботнетов может служить атака распределённого отказа в обслуживании (DDoS).
Ботнет может быть как централизованным, так и децентрализованным. Последняя форма также может быть поделена на два вида - подконтрольный и бесконтрольный ботнет. В первом случае существует контролирующий узел, в то время как во втором случае не существует вовсе контроля действий из-за чего захардкоженные настройки уже удалённо не редактируются.

Спамер

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

Установщик

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

Логическая бомба

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

Очиститель

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

Инициализатор

Основная специфика инициализатора - это установка вредоносного ПО в процесс автоматического запуска операционной системой после своего старта.
Является одним из самых распространённых помощников за счёт своей относительной простоты и возможности воспроизводить исполнение программ даже после перезапуска системы.

Помимо пятнадцати вышеуказанных мной ВПО также существует ещё огромное количество других всевозможных ПО, начиная от программ с бесконечным циклом открытия/закрытия дисководов, программ засоряющих всё дисковое пространство и заканчивая биоскитами.

Тем не менее, вышеописанного списка нам будет достаточно, чтобы рассматривать возможности комбинирования, а также начать классифицировать вредоносное ПО по способу применения в совокупности с другими ВПО.

Классификация вредоносных ПО

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

Далее, мы также можем заметить ещё одну закономерность, объединяющую другие ВПО воедино, а именно сама специфика транспортирования. Трояны, черви, программы удалённого доступа и установщики представляют собой методы передачи ВПО от одной системы к другой. В отличие от исполнителей, чистая функция которых сводится к конечной логике, ради которой ВПО и создавалось, чистая функция вышеописанных программ сводится исключительно к способам передачи других ВПО, самих себя или всё вместе для увеличения масштаба распространения ВПО по множеству систем. Таковые ВПО далее мы будем именовать распространителями.

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

Исполнители

Распространители

Помощники

Шифровальщик

Троян

Вирус

Локер

Червь

Логическая бомба

Стиллер

Программа удалённого доступа

Руткит

Спамер

Установщик

Буткит

Ботнет

Инициализатор

Очиститель

Композиции классов вредоносного ПО

Редко можно встретить в чистом виде исполнителя, распространителя или помощника по отдельности. Отсутствие композиции приводит к быстрому отмиранию образца. Часто ВПО представляет собой композицию, как нескольких видов программ, так и нескольких классов.

Также стоит заметить, что использование ВПО без композиций становится бессмысленным в любых сценариях. Так например логично, что нет смысла распространяться по системам, либо вживляться в них без соответствующей полезной нагрузки. Но обратное также становится верным, а именно - нет смысла применять полезную нагрузку без распространения по системам или соответствующего вживления в системы, т.к. если мы не будем применять распространителей, то предъявление жертве программы типа "Я_зловредная_программа_Установи_меня_и_пожалеешь.exe" вряд ли окажется эффективным. Равносильный сценарий и с вживлением в систему, когда например перезагрузка компьютера может сбросить исполнителя, как например локер.

Всё вышеописанное говорит лишь о том, что композиции ВПО необходимы для жизнеспособности конечного ВПО. Но при данном сценарии композиций следует учитывать также одно противоречие - чем большая цепочка композиций ВПО формируется, тем легче антивирусное ПО способно распознавать вредоносность приложения.

1. Исполнитель + Распространитель

Является наиболее частой комбинацией вредоносных ПО. Так например, идеально могут сочетаться такие композиции как Червь+Шифровальщик и Троян+Стиллер, потому как им не требуется дальнейшая логика вживления в систему. Шифровальщику достаточно единожды зашифровать все файлы, чтобы выполнить свою цель. Стиллеру достаточно единожды украсть все необходимые данные, чтобы также выполнить свою миссию.

Тем не менее, этой композиции недостаточно, когда речь заходит о долгом пребывании в системе, например комбинации Червь+Ботнет или Троян+Спамер, или RAP+Стиллер нежизнеспособны, если при перезапуске устройства исполнители не продолжат выполнять свою работу. В таком случае используются уже помощники.

2. Исполнитель + Помощник

Данная композиция становится часто "ядром" зловредных программ, потому как способно обеспечивать стабильное исполнение полезной нагрузки. Так например, комбинация Буткит+Локер способна в обход ОС приводить к блокировке компьютера, комбинация Руткит+Спамер позволяет скрывать источник навязчивой рекламы, Вирус+Ботнет может приводить к восстановлению майнинга или к DDoS атаке без изначально действующих процессов.

Но стоит сказать, что такая композиция является мало применяемой на практике, потому как игнорирует вовсе способы доставки ВПО на сторону жертвы. Поэтому использование данной композиции также неразрывно связано с распространителями.

3. Исполнитель + Исполнитель

На первый взгляд может показаться, что такое сочетание более теоретическое, допустимое, но на практике вообще не применяемое. Но такое утверждение лишь кажется на первый взгляд верно. Некоторые исполнители очень хорошо себя начинают ощущать/работать в композиции с другими исполнителями. Так например, Шифровальщик+Локер является классической композицией. Пока шифровальщик занят своей основной функцией, локер препятствует пользователю преждевременно завершить процесс шифровальщика. В некой мере локер начинает замещать помощников, но в отличие от последних - его действия кратковременны, нацелены лишь на текущий сеанс выполнения. Локеры не являются помощниками, потому как способны исполнять полезную нагрузку, например вымогание денег за счёт запугивания.

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

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

4. Помощник + Распространитель

Данная композиция применяется, когда становится необходимым после факта распространения устоять в системе, вживиться в неё на более длительный срок, чем одноразовый запуск. Наиболее полезно это для распространителей типа программ удалённого доступа и установщиков, чтобы при перезагрузке устройства жертвы удалённый доступ или установщик мог быть восстановлен, например Руткит+RAP или Вирус+Установщик. Для червей помощники также могут быть полезны, если необходимым условием является постоянная периодичная рассылка уведомлений, рекламы, спама и прочего другим пользователям. Бессмысленны помощники для троянов, потому как если троян смог попасть в систему, то значит он уже выполнил свою основную функцию распространения, ни более ни менее.

Таким образом, для распространителей типа Программ удалённого доступа, Установщиков и Червей становятся наиболее полезными помощники типа Вирусы - т.к. однажды заразив часто используемый файл, RAP'ники, Установщики, или Черви будут возобновлять исполнение своей логики посредством многочисленного самореплицирования, Руткиты - т.к. способны скрывать факты своего дальнейшего распространения, Буткиты - т.к. могут позволить исполнять транспортирующую логику ещё до запуска ОС.

5. Помощник + Помощник

Допустимая комбинация, когда необходимо подкреплять одну помощь другой помощью. Так например, композиция Руткит+Вирус может приводить к автоматическому запуску вирусов в системе без содействия самого пользователя. И даже если руткит будет удалён, то вирус сможет вновь при комбинации Вирус+Руткит возобновить работу последнего. Эта композиция напоминает комбинацию Распространитель+Распространитель (которая будет описана далее) в лице Троян+Червь, только нацелена не на распространение ВПО на множество систем, а на удержание ВПО в одной системе.

6. Распространитель + Распространитель

Каждый распространитель может существовать сам по себе в отрыве от других распространителей. Так например, троян вполне может распространяться самостоятельно по устройствам жертв за счёт их глупости. Червь может распространяться автоматически, если в ОС присутствует уязвимость загрузки ПО без действия пользователя. Программа удалённого доступа и/или установщик, если были вшиты по умолчанию в устройство или в приложение как бэкдор, особо не требуют дополнительных способов распространения.

За счёт этого, может показаться избыточным применение сразу нескольких распространителей, но на деле - это одна из самых эффективных композиций. Например, использование композиции вида Троян+Червь является достаточно сильной комбинацией, т.к. если троян смог успешно попасть в систему жертвы за счёт глупости самой жертвы, то червь продолжает автоматическое распространение себя и трояна соответственно по электронной почте, по мессенджерам, форумам и т.д. с аккаунтов жертвы. Как только распространение червём будет завершено, вступает вновь распространение ВПО по трояну. И так цепочка ответственности троян->червь и червь->троян будет продолжаться далее, пока суммарная глупость жертв не закончится. В таком случае, будет обеспечена дополнительная "поддержка" червя ручной деятельностью пользователя за счёт трояна, вследствие чего, червю более не будет надобности использовать уязвимости в ОС.

Примерно такая же ситуация может наблюдаться при композиции Троян+RAP, либо RAP+Троян, где композиция некоммутативна. В первом случае, троян способен загрузить RAP на устройство жертвы, во втором случае, RAP уже будучи установленным загружает троян на устройство жертвы. Последний случай необходим для скрытия присутствия ВПО в системе, поэтому каждое ВПО "оборачивается" трояном. Например, будет куда лучше со стороны злоумышленника, если ВПО в процессах или в файловой системе будет называться как "csgo.exe" с соответствующей иконкой, а не "trojan_version_1_2.exe". За счёт композиции Троян+RAP достигается лёгкость вживления бэкдора (в сравнение с вживлением по умолчанию). За счёт композиции RAP+Троян нивелируется необходимость в постоянном использовании последнего.

Композиция Червь+RAP также является мощной, если червь в автоматическом режиме может распространяться по устройствам жертвы, не используя ручные действия для своей установки. В таком случае, будет обеспечено широкое распространение RAP, что является крайне сложной задачей при его чистом распространении (вживлением по умолчанию).

Таким образом, композиция распространителей позволяет всегда нивелировать определённые недостатки каждого отдельного распространителя. Но в данном контексте, стоит также учитывать фактор заметности отдельных распространителей к антивирусным программам. Так например, RAP является наиболее ресурсозатратным экземпляром распространителей, в то время как троян лишь использует "зрительные манипуляции" и не представляет собой использование сложных операций.

7. Исполнитель + Помощник + Распространитель

Является наиболее надёжной комбинацией, за счёт учитывания факторов масштабирования (распространителей) и жизнеспособности (помощником) итогового образца. Тем не менее, за счёт универсальности формируется противоречие, где сама массовость подобной композиции приводит к более лёгкому способу её анализа и детектирования.

В данной композиции достаточно совмещать лишь уже ранее изученные композиции. Так например, композицию Червь+Ботнет можно объединить с композицией Ботнет+Буткит, образуя, тем самым, композицию Ботнет+Буткит+Червь. Единственным условием формирования трёх-этапной композиции становится необходимость существования сцепляющего ВПО, как в нашем случае был Ботнет. Из похожих комбинаций, также на скидку можно привести Стиллер+Логическая бомба+Троян (Троян+Стиллер <-> Стиллер+Логическая бомба), Спамер+Вирус+Установщик (Спамер+Вирус <-> Вирус+Установщик) и т.д.

Трёх-этапная композиция не обязательна должна быть в форме Исполнитель + Помощник + Распространитель, но также может быть и в формации Исполнитель + Помощник + Помощник (например, Спамер + Вирус + Руткит), Исполнитель + Распространитель + Распространитель (например, Шифровальщик + Троян + Червь), Исполнитель + Исполнитель + Помощник (например, Локер + Шифровальщик + Буткит), Исполнитель + Исполнитель + Распространитель (например, Спамер + Стиллер + Троян).

Помимо трёх-этапной композиции может существовать и N-этапная композиция, но с увеличением числа используемых видов ПО будет увеличивать и вероятность детектирования итогового образца на подобной комбинации.

Композиции в реальном мире

В качестве примера, нам необходимо рассмотреть ряд существующих вредоносных ПО и попытаться их деструктуризировать на ранее описанные составные компоненты.

WannaCry

Данное вредоносное ПО состоит из нескольких составляющих: шифровальщика, червя и инициализатора. Представляет собой один из тех случаев, когда червь может работать в одиночку без сопутствующих композиций с другими распространителями за счёт использования уязвимости в ОС Windows. Функция инициализатора постоянно воспроизводить деструктивное действие шифровальщика.

Petya

Схож с WannaCry за счёт использования лишь одного распространителя. Отличием становится замена помощника с инициализатора на буткит, вследствие чего избавиться от разрушительных действий становится более проблемной задачей. Также отличием является и то, что Petya не даёт никакой возможности расшифровать информацию, даже с учётом передачи денежных средств. В определённой степени исполнитель в роли шифровальщика становится очистителем. Плюс к этому добавляется исполнитель - локер.

PlugX

Данное вредоносное ПО состоит также из нескольких компонентов: трояна, червя, программы удалённого доступа и инициализатора. Использует классическую схему распространения Троян+Червь для последующей установки программы удалённого доступа и инициализатора. Особенностью зловреда является отсутствие исполнителя, и существование четырёх-этапной композиции с трёх-этапной моделью: Распространитель + Распространитель + Распространитель. Таким образом, PlugX можно рассматривать лишь как шаблон для последующего введения исполнителей.

Nscpucnminer

Представляет собой достаточно простую комбинацию в лице трояна, ботнета и инициализатора. По названию основное предназначение данного ВПО - это майнинг криптовалюты. Жертвы заражаются по классической схеме обмана оболочкой трояна.

ZeuS

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

Это не сам ZeuS, просто спам от сайта, но забавно
Это не сам ZeuS, просто спам от сайта, но забавно

Таким образом, можно видеть, что все программы в той или иной мере используют как минимум трёх-этапные композиции. Большинство из данных экземпляров объединяют все три класса вредоносного ПО.

Заключение

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

Источник: https://habr.com/ru/articles/748254/


Интересные статьи

Интересные статьи

При обучении модели классификации объектов (подбор весовых коэффициентов) столкнулись с тем, что проблема НЕ В ТОМ, КАК НАЙТИ разделяющую прямую, а В ТОМ, КАКУЮ ИМЕННО ВЫБРАТЬ из полученного множества...
Ранее мы рассказали о первой части исследования, которое провели магистры, аспиранты и сотрудники Института дизайна и урбанистики ИТМО. Они проанализировали несколько миллионов публикаций из популярно...
Задача – «Провести анализ сообщений коммерческого чата на предмет игнорирования вопроса клиента менеджером компании»На входе: лог чатов с клиентом компании в csv формате:...
Привет, Хабровчане! В конце августа в OTUS запускается 2 мощных курса по обратной разработке кода (реверс-инжиниринг). В связи с этим приглашаем вас на День Открытых дверей, где Арту...
Всем привет. Недавно задался вопросом: «А что, если… ?». В результате родилась вот такая тема-идея: Проектирование на основе «отражения». Этой самой идеей я и хочу поделиться с Вами в данной п...