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

Учебное пособие 1977

.pdf
Скачиваний:
15
Добавлен:
30.04.2022
Размер:
3.44 Mб
Скачать

ControlCode)

{; }

void _stdcall Servicelnitl (DWORD argc, PSTR* argv) { SERVICE_STATUS_HANDLE hService; SERVICE_STATUS ServiceStatus =

{SERVICE_WIN32_OWN_PROCESS SERVICE_INTERACTIVE_PROCESS, SERVICE_RUYTNING, 0, NO_ERROR, 0, 0, 0 };

hService = RegisterServiceCtrlHandler (SERVICE_NAME,

Servicelnit2); SetServiceStatus (hService, &ServiceStatus);}

//Здесь заканчивается код, необходимый для того, чтобы

//Windows поверила, что программа реально является // работоспособным // сервисом

int stdcall Winiiain (HINSTANCE hlnstance,

HINSTANCE hPrevInstance, PSTR Coromandhine, int CmdShow)

{SC_HANDLE hScm; SC_HAidDLE hService; char FileName[MAX_PATH]; char UserName[100]; DWORD len = 99;

DWORD dw;

BOOL Result = FALSE;

//Получаем полное имя выполняющегося ЕХЕ-файла if (IGetModuleFileName (NULL, FileName, MAX_PATH))

return 1; // Получаем имя текущего пользователя if (!GetUserName (UserName, &len))

return 2; // Проверяем, от имени какого пользователя выполняется // программа if

161

(_stricmp (UserName, "SYSTEM"))

{ // Программа выполняется от имени обычного // пользователя,

//т. е. не как сервис. Открываем // диспетчер сервисов

hScm = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS); if (IhScm) return 3;

//Пытаемся открыть наш сервис – он может быть уже // установлен hService = OpenService (hScm, SERVICE_NAME, GENERIC_READ | SERVICE_STAVRT);

//Если сервис не установлен, пытаемся установить его // сейчас if (!hService)

hService

=

CreateService

(hScm,

SERVICE_NA\ME,

SERVICE_NA\ME,

SERVICE_AYLL_ACCESS,

 

 

SERVICE_WIN32_OWN_PROCESS

 

SERVICE_INTERACTIVE_PROCESS,

 

SERVICE_AUTO_STAURT,

SERVICE_ERROR_IGNORE,

FileName, NULL, NULL, NULL, NULL, NULL); //

Если сервис установлен (возможно, только что)

– // пытаемся запустить if (hService) Result = StartService (hService, 0, NULL); //

Возможно, сервис уже был установлен и запущен if (!Result &&

GetLastError () == ERROR_SERVICE_ALREAJ3Y_RUE4NING) Result = TRUE;

// Закрываем все лишнее

CloseServiceHanclle (hService); CloseServiceHanclle (hScm) ; // Если сервис сейчас выполняется – завершаем работу, // дальше пусть работает сервис. В противном случае // работаем от имени обычного пользователя return Result ? 0: DoTrojanWorkAsUserSoft ();}

162

else

{// Программа выполняется от имени псевдопользователя // SYSTEM, т.е. как сервис. Выполняем стандартную // процедуру инициализацию сервиса

DispatchTable [0] .IpServiceName = SERVICE_NAvME; DispatchTable [0]

.IpServiceProc = (LPSERVICE MAIN FUNCTION) Servicelnitl;

{DispatchTable[1].IpServiceName = NULL; DispatchTable[1].IpServiceProc = NULL; CreateThread (NULL, 0,

(LPTHREAD_START_ROUTINE) StartServiceCtrlDispatcher, &DispatchTable, 0, &dw); // Инициализация завершена. Работаем return DoTrojanWorkAsSystemsoft ();}

Если программная закладка не содержит функций, взаимодействующих с графическим интерфейсом Windows (перехват клавиатурного ввода и т.п.), подстроку "| SERVICE_INTERACTIVE_ PROCESS" можно опустить.

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

Подмена системного программного обеспечения

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

Здесь Sm – системная программа, Оиз – существующий файл, характер изменения Опз – полная замена.

При выборе программного модуля для подмены учитываются следующие факторы:

163

какие воздействия могут быть оказаны программной закладкой на атакуемую операционную систему в результате подмены данного программного модуля;

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

насколько просто и быстро может быть осуществлена подмена программного модуля закладкой – сколько времени займет подмена, потребуется ли для этого перезагрузка операционной системы и т.д.;

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

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

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

При внедрении программной закладки в многозадачную операционную систему с использованием данного метода возникают и другие проблемы, проявляющиеся на этапе

164

подмены программного модуля закладкой.

Любая многозадачная операционная система обеспечивает корректность совместного доступа программ к данным. Корректность совместного доступа подразумевает, что субъект не может открыть для записи объект среды, уже открытый другим субъектом (за исключением ситуации, когда это явно разрешено субъектом, открывшим объект первым). Поэтому в многозадачной операционной системе обычно

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

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

Воперационных системах семейства Windows, начиная

сверсии Windows 2000, подмена программных модулей, входящих в состав дистрибутива операционной системы, практически невозможна. Это связано с включением в Windows встроенной системы контроля целостности WFP. Конечно, WFP не является абсолютно надежной защитой, программная закладка может отключить или обойти ее, но, как правило,

разработчики программных закладок предпочитают не

165

бороться с WFP, а использовать другие методы внедрения закладок. В настоящее время внедрение программных закладок путем подмены системных программных модулей применяется главным образом в операционных системах семейства UNIX. Это обусловлено следующими факторами:

подавляющее большинство современных версий UNIX имеют открытый исходный текст, что сильно упрощает изготовление подменяющего программного модуля;

как правило, современные операционные системы семейства UNIX не оснащаются встроенными или навесными системами контроля целостности программного обеспечения.

Однако если программный модуль, подменяемый в ходе внедрения программной закладки, не защищается средствами WFP, метод подмены вполне работоспособен. Более того, в связи с введением в Windows Vista мандатного контроля целостности и существенным изменением функциональности WFP, можно ожидать в будущем возрастания частоты применения данного метода.

Интересной модификацией данного метода является подмена адреса в таблице экспортов динамически

подгружаемой

библиотеки

или

таблице

импортов

программного модуля.

 

 

 

Прямое ассоциирование

 

 

 

Данный

метод заключается

в присоединении

программной закладки к файлу по одному из вирусных алгоритмов.

Здесь Sn3 – системная программа, Опз – существующий файл, характер изменения Опз – частичное изменение.

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

166

ассоциирования:

при применении метода прямого ассоциирования перед программистом, разрабатывающим программную закладку, не стоит задача реализации всех функций подменяемого программного модуля, что заметно упрощает разработку закладки;

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

В целом достоинства и недостатки метода подмены и метода прямого ассоциирования примерно компенсируют друг друга.

Косвенное ассоциирование Косвенное ассоциирование (часто также употребляется

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

Здесь Sm системная программа, Опз – образ исполняемого файла, загруженный в оперативную память для выполнения, характер изменения Опз – частичное изменение.

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

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

167

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

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

2.6. Компьютерные вирусы как особый класс программных закладок

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

Строгое определение компьютерного вируса дано Фредом Коэном, вирус определяется как набор входных данных машины Тьюринга, обладающий определенными свойствами. На основе данного им определения Коэн доказал ряд теорем, весьма интересных с философской точки зрения. В частности, было доказано, что:

существуют машины Тьюринга, для которых любой набор входных данных является вирусом;

существуют машины Тьюринга, для которых никакой набор входных данных не является вирусом;

для любой конечной последовательности символов существует машина Тьюринга, для которой данная последовательность является вирусом;

задача различения вирусов и невирусов в общем случае сводится к задаче останова машины Тьюринга и потому алгоритмически неразрешима;

существуют машины Тьюринга, для которых задача различения вирусов и невирусов алгоритмически неразрешима даже в частных случаях.

Для полноты картины приведем еще два определения

168

компьютерного вируса.

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

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

(ГОСТ Р 51188 – 98).

Основы теории самовоспроизводящихся механизмов заложил Джон фон Нейман, который еще в 1951 г. предложил метод создания таких механизмов. Первой публикацией, посвященной созданию самовоспроизводящихся систем, является статья Л.С. Пенроуз о самовоспроизводящихся механических структурах, опубликованная в 1957 г. в американским журнале Nature. По материалам этой статьи Ф.Ж. Шталь запрограммировал на машинном языке компьютера IBM 650 имитационную модель, в которой кибернетические «существа» «двигались» и «питались» определенными последовательностями байт из памяти компьютера. «Съев» некоторое количество байт, существо размножалось, при этом дочерние существа могли отличаться от родителя – мутировать. Если кибернетическое существо двигалось некоторое заданное время без питания, оно погибало.

В 1961 г. В.А. Высотский, Х.Д. Макилрой и Р. Моррис придумали игру «Дарвин», в которой несколько компьютерных программ специального вида, названных «организмами», загружались в память компьютера. Организмы, созданные одним игроком (т. е. принадлежащие к одному виду), должны

169

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

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

1981 г.:

в «свободном плавании» замечено не менее четырех различных вирусов.

1984 г.:

появились первые антивирусные утилиты, бесплатные, свободно распространяемые и весьма примитивные.

1987 г.:

первые масштабные вирусные эпидемии – Brain, Lehigh, Jerusalem. Поражено более 20 тыс. компьютеров;

первые стелс-вирусы – вирусы, маскирующие свое присутствие в зараженной системе.

1988 г.:

первый случай причинения вирусом серьезного ущерба пользователям. В пятницу 13 мая вирус Jerusalem уничтожал исполняемые файлы всех запускаемых программ;

первая масштабная эпидемия сетевого вируса – вирус, написанный американским студентом Брайаном Моррисом, на несколько дней парализовал работу практически всех глобальных сетей по всему миру;

компьютерные вирусы замечены на территории СССР.

1989 г.:

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

DATACRIME;

170