Евгений Каспеpский
Интеркомпьютер N6/1990, стр. 46-48 (Советы вирусолога)
ISSN 0236-2554
1990
Рассматриваются ситуации, с которыми может столкнуться пользователь в том случае, если его компьютер поражен вирусом, но ни одна из известных ему антивирусных программ не дала положительного результата. Где и как искать вирус? Какие при этом необходимы инструментальные средства и какими методами следует пользоваться?
Как известно, вирусы делятся на резидентные и нерезидентные. Встречавшиеся мне до сих пор резидентные вирусы отличались гораздо большим коварством и изощренностью, чем нерезидентные. Поэтому для начала рассмотрим простейший случай: поражение компьютера неизвестным пользователю нерезидентным вирусом. Такой вирус активизируется при запуске какой-либо инфицированной программы, пытается заразить другие файлы, а затем передает управление программе-носителю и в дальнейшем (в отличие от резидентных вирусов) не будет мешать ее работе. Для обнаружения такого вируса необходимо побайтно сравнить дистрибутивные копии с используемыми программами (упоминание о важности хранения таких копий уже стало банальностью) . В настоящее время разработано достаточно много утилит для побайтного сравнения файлов, самая простейшая из них - COMP - содержится в DOS.
Существуют специальные утилиты, которые не только сравнивают содержимое файлов и их параметры (длину, атрибуты, время последней модификации), но и сообщают о наличии в разных файлах одинаковых повторяющихся участков кода или проверяют файлы на наличие "подозрительных" команд (например, утилита Mask Locator, разработанная А. Шеховцовым). Такие утилиты очень удобны, но иногда начинают "ругаться" на широко распространенные упаковщики ЕХЕ-файлов и некоторые файлы DOS, к тому же они плохо обнаруживают вирусы, часть кода которых зашифрована.
Для обнаружения результатов действия вируса рекомендуется запустить одну из резидентных антивирусных программ-мониторов и следить за ее сообщениями о "подозрительных" действиях программ (запись в COM- или EXE-файлы, запись на диск по абсолютному адресу и т.п.). Существуют антивирусные программы-мониторы, которые не только перехватывают такие действия, но и сообщают адрес, откуда поступил "подозрительный" вызов (к таким мониторам относятся ANTIKOR.ЕХЕ, -D.COM, DEFENSE.ЕХЕ). Обнаружив подобное сообщение, следует выяснить от какой программы оно поступило, и проанализировать ее коды с помощью резидентного дизассемблера (например, Quaid Analyrer, -D3.COM и др.)
Рассмотренные методы подходят для обнаружения большинства как резидентных, так и нерезидентных вирусов, однако не срабатывают, если вирус выполнен по технологии "СТЕЛС" (Stealth) что делает бесполезным использование как утилит сравнения файлов, так и резидентных программ-мониторов.
Если в компьютере обнаружены следы деятельности вируса, но видимых изменений в файлах и системных секторах дисков не наблюдается, то вполне возможно, что компьютер поражен одним из СТЕЛС-вирусов. В этом случае следует осуществить "холодную" перезагрузку DOS (с помощью клавиши Reset) с заведомо чистой от вирусов дискеты, содержащей резервную копию DOS, и действовать как и при поражении нерезидентным вирусом. Однако иногда зто нежелательно, а часто и невозможно (известны, например, случаи покупки новых компьютеров, зараженных вирусом). Тогда придется обнаружить и нейтрализовать резидентную часть вируса, выполненную по технологии "СТЕЛС".
Возникает вопрос: где в памяти и как искать вирус или его резидентную часть? Существует несколько способов инфицирования памяти:
Лучший способ обнаружить такой вирус состоит в том, чтобы просмотреть карту распределения памяти, которая отображает список резидентных программ (пример такой карты приведен в табл. 1). Подробная карта памяти сообщает информацию о всех блоках, на которые разбита память: адрес блока управления памятью - MCB (Memory Control Block), имя программы-владельца блока, адрес префикса ее программного сегмента - PSP (Program Segment Prefix) и список перехватываемых блоком векторов прерываний.
При наличии вируса в таблице векторов прерываний утилиты, отображающие карту распределения памяти (например, MAPMEM.COM, MFT.COM, -D.COM и др.), начинают "шуметь" (см. табл. 2).
Другой, более надежный, но требующий высокой квалификации вирусолога способ, - просмотреть таблицу векторов с помощью дизассемблера. Если при этом будут обнаружены коды какой-то программы - код вируса (или участок кода) найден.
Мне известен единственный способ инфицирования вирусом произвольного системного драйвера: прикрепление тела вируса к файлу, содержащему драйвер, и модификация заголовка поражаемого драйвера. В этом случае вирус можно обнаружить при просмотре карты распределения памяти, содержащей список системных драйверов. Если при этом в списке присутствует драйвер, не описанный в файле CONFIG.SYS, то он и может оказаться вирусом.
Вирус, встраивающийся в системный буфер, должен уменьшать общее число буферов, в противном случае он будет уничтожен последующими операциями считывания с диска. Достаточно несложно написать программу, которая подсчитывает число буферов, реально присутствующих в системе, и сравнивает полученный результат со значением команды BUFFERS, расположенной в файле CONFIG.SYS (если команда BUFFERS отсутствует, то со значением, устанавливаемым DOS по умолчанию). Подобная проверка прекрасно работает в моей антивирусной программе -V.EXE (практически 100%-ное обнаружение вируса).
Существует достаточно способов внедрения вируса в системные таблицы или область системного стека DOS. Однако реализация этих способов потребует от автора вируса досконального знания различных версий DOS. К тому же свободного места в DOS не так уж много, и поэтому написание полноценного СТЕЛС-вируса такого типа маловероятно (вирусы, написанные без использования технологии СТЕЛС, можно обнаружить одним из описанных выше способов). Если же все-таки подобный вирус появится, то обнаружить его код можно дизассемблированием участков DOS, "подозрительных" на наличие кода вируса.
Таблица 1. Карта распределения незараженной памяти
Адрес блока MCB | Адрес PSP | Размер блока MCB (Кб) | Имя программы владельца блока MCB | Номера векторов прерываний |
---|---|---|---|---|
0E9A | 0E9B | 3,2 | COMMAND.COM | 22,24,2E |
0F6E | 0F6F | 0,04 | блок свободен | |
0F72 | 0E9B | 0,15 | COMMAND.COM | |
0F7D | 0F85 | 23 | -D.COM | 10,1B,1C,23,26,27,28,2F,40,EF,FF |
1545 | 1546 | 0,10 | блок свободен | |
154D | 154E | 3,9 | PLUCK.COM | 09,13,16,21 |
1648 | 0E9B | 549,3 | COMMAND.COM | 30,EE,F2,F3,F4,F5,F6,F7,F8,FE |
Таблица 2. Карта распределения паямяти при проникновении вируса в таюлицу векторов прерываний
Адрес блока MCB | Адрес PSP | Размер блока MCB (Кб) | Имя программы владельца блока MCB | Номера векторов прерываний | ||
---|---|---|---|---|---|---|
0E9A | 0E9B | 3,2 | COMMAND.COM | 22,24,2E,EB | ||
0F6E | 0F6F | 0,04 | блок свободен | |||
0F72 | 0E9B | 0,15 | COMMAND.COM | |||
0F7D | 0F85 | 23 | -D.COM | 10,1B,1C,23,26,27,28,2F,40,CA,D3 | ||
1546 | 1547 | 0,10 | блок свободен | |||
154E | 154F | 3,9 | PLUCK.COM | 09,13,16,91 | ||
164C | 0E9B | 549,3 | COMMAND.COM |
|
СТЕЛС-вирусы: невидимка в компьютере
В последнее время зафиксированы вирусные атаки так называемых СТЕЛС-вирусов. Эти вирусы представляют собой весбма совершенные программы, которые перехватывают обращения DOS к пораженным файлам или секторам дисков и "подставляют" вместо себя незараженные участки кода. Кроме этого такие вирусы при обращении к файлам используют достаточно оригинальные алгоритмы, позволяющие "обманывать" резидентные антивирусные программы-мониторы.
Один из представителей СТЕЛС-вирусов - вирус "4096". Он перехватывает прерывание int 21h, обрабатывает 20 (!) его функций (FindFirst, FindNext, Read, Write, Lseek, Open, Create, Close, Exec, и т.д.) и хорошо маскируется. При обращении DOS к зараженному файлу вирус подставляет его первоначальную длину и время модификации, а при чтении этого файла или при загрузке его в память исправляет считанную с диска информацию таким образом, что файл будет представлен в незараженном виде. При записи в файл новой информации вирус "лечит" его (так как в этом случае возможно уничтожение части кода вируса), а затем заражает снова. При этом вирус обращается в DOS "напрямую", обходя практически все известные мне антивирусные программы-мониторы.
Таблица 3. Карта распределения памяти при проникновении вируса в область прикладных программ
Адрес блока MCB | Адрес PSP | Размер блока MCB (Кб) | Имя программы владельца блока MCB | Номера векторов прерываний |
---|---|---|---|---|
0E9A | 0E9B | 3,2 | COMMAND.COM | 22,24,2E |
0F6E | 0F6F | 0,04 | блок свободен | |
0F72 | 0E9B | 0,15 | COMMAND.COM | |
10D1 | 10DA | 23 | -D.COM | 10,1B,23,26,27,28,2F,40 |
17AF | 17B0 | 1,7 | ? | 08 ** |
1820 | 0E9B | 539,3 | COMMAND.COM | 30,31 |
9F04 | 0000 | 3,9 | ? | 1C,21 * |
* Обнаружен вирус "Yankee Doodle"
** Обнаружен вирус "Jerusalem"
Если вирус внедряется в область памяти, отведенную для прикладных программ, в виде нового блока, т.е. создавая для себя собственный блок MCB, или отдельной резидентной программы, то его можно обнаружить при просмотре подробной карты распределения памяти, отображающей адреса всех блоков MCB. Обычно такой вирус выглядит как отдельный блок памяти (табл. 3), не имеющий имени и перехватывающий один или несколько векторов прерываний (например, int 8h, int 13h, int 1Ch или int 21h).
Вирус может "приклеиться" к программам, которые резидентно размещены в памяти. При этом обнаружить его сложнее - нужно знать реальную длину программ, размещенных в памяти, и список прерываний, которые они перехватывают. Следует отметить, что у вируса, использующего такой способ внедрения, возникают неприятности, так как отличить исполняемую нерезидентную программу от резидентной невозможно, поэтому такой вирус, скорее всего, окажется "маложивущим".
Все загрузочные и некоторые файловые вирусы располагаются за пределами памяти, выделенной для DOS, уменьшая значение слова, расположенного по адресу [0040:0013]. Обнаружить такие вирусы очень просто: достаточно узнать емкость оперативной памяти и сравнить ее с реальной. Если вместо 640 или 512 Кбайт система сообщит меньшее значение, то следует просмотреть дизассемблером "отрезанный" участок памяти. При обнаружении на этом участке кодов какой-то программы, вирус, скорее всего, найден.
Внимание! В некоторых компьютерах, использующих расширенную память, емкость оперативной памяти уменьшается на 1 Кбайт.
Возможно инфицирование вирусом файлов DOS, которые являются резидентными (например, IO.SYS, MSDOS.SYS, COMMAND.COM), загружаемых драйверов (ANSY.SYS, COUNTRY.SYS, RAMDRIVE.SYS) и др. Обнаружить такой вирус гораздо сложнее вследствие малой скорости его распространения, но, однако, вероятность атаки подобного вируса значительно меньше.
Предлагается способ, который может облегчить выявление вируса в подобной ситуации. Он основан на следующем свойстве: подавляющее большинство вирусов для обнаружения незараженных файлов или секторов дисков перехватывают прерывания int 13h или int 21h, встраиваясь в обработчик прерывания. В таком случае для обнаружения вируса достаточно просмотреть текст (команды ассемблера) обработчиков указанных прерываний (например, с помощью специально созданной для этой цели программы -INT.COM). Правда, для того, чтобы отличить вирус от обычных программ, требуется достаточный опыт работы с вирусами и некоторое представление о структуре обработчика прерываний на незараженном компьютере.
Конечно, возможны и другие, достаточно экзотические, способы инфицирования памяти вирусом, например, внедрение вируса в расширенную память или в видеопамять (что уже встречалось), но присутствие подобных вирусов обнаруживается слишком быстро.
После локализации вируса в памяти или обнаружения зараженного файла дальнейшие действия ясны: предстоит проделать анализ алгоритма вируса, т.е. выяснить:
При решении этих задач не обойтись без дизассемблера или отладчика, причем по моим наблюдениям, половина вирусологов предпочитают пользоваться отладчиками (Quaid Analyzer, Advanced Trace86, FULSCREEN DEBUG и др.), а другая половина - дизассемблерами (DisDoc или Sourcer).
И отладчики, и дизассемблеры имеют положительные и отрицательные черты - каждый выбирает то, что он считает более удобным. Несложные короткие вирусы быстро "вскрываются" стандартным отладчиком DEBUG, при анализе объемных и сложных вирусов (типа вируса "4096") не обойтись без дизассемблера. Для быстрого восстановления пораженных файлов достаточно просмотреть с помощью отладчика код вируса до того места, где он восстанавливает загруженную программу перед тем, как передать ей управление (фактически именно этот алгоритм чаще всего используется для "лечения" файлов или участков дисков, зараженных вирусом). Если же требуется получить детальную картину работы вируса или его хорошо документированный листинг, то кроме дизассемблера Sourcer, позволяющего восстанавливать перекрестные ссылки, здесь вряд ли что поможет. К тому же следует учитывать, что во-первых, некоторые вирусы успешно блокируют попытки просмотреть их коды с помощью отладчиков, во-вторых, при работе с отладчиком есть вероятность, что вирус "вырвется" из-под контроля.
[Вернуться к списку] [Комментарии (0)]