Где и как искать вирус?
Советы вирусолога Евгений Каспеpский
🕛 16.03.2009, 13:30
Рассматриваются ситуации, с которыми может столкнуться пользователь в том случае, если его компьютер поражен вирусом, но ни одна из известных ему антивирусных программ не дала положительного результата. Где и как искать вирус? Какие при этом необходимы инструментальные средства и какими методами следует пользоваться?Как известно, вирусы делятся на резидентные и нерезидентные. Встречавшиеся мне до сих пор резидентные вирусы отличались гораздо большим коварством и изощренностью, чем нерезидентные. Поэтому для начала рассмотрим простейший случай: поражение компьютера неизвестным пользователю нерезидентным вирусом. Такой вирус активизируется при запуске какой-либо инфицированной программы, пытается заразить другие файлы, а затем передает управление программе-носителю и в дальнейшем (в отличие от резидентных вирусов) не будет мешать ее работе. Для обнаружения такого вируса необходимо побайтно сравнить дистрибутивные копии с используемыми программами (упоминание о важности хранения таких копий уже стало банальностью) . В настоящее время разработано достаточно много утилит для побайтного сравнения файлов, самая простейшая из них - COMP - содержится в DOS.
Существуют специальные утилиты, которые не только сравнивают содержимое файлов и их параметры (длину, атрибуты, время последней модификации), но и сообщают о наличии в разных файлах одинаковых повторяющихся участков кода или проверяют файлы на наличие "подозрительных" команд (например, утилита Mask Locator, разработанная А. Шеховцовым). Такие утилиты очень удобны, но иногда начинают "ругаться" на широко распространенные упаковщики ЕХЕ-файлов и некоторые файлы DOS, к тому же они плохо обнаруживают вирусы, часть кода которых зашифрована.
Для обнаружения результатов действия вируса рекомендуется запустить одну из резидентных антивирусных программ-мониторов и следить за ее сообщениями о "подозрительных" действиях программ (запись в COM- или EXE-файлы, запись на диск по абсолютному адресу и т.п.). Существуют антивирусные программы-мониторы, которые не только перехватывают такие действия, но и сообщают адрес, откуда поступил "подозрительный" вызов (к таким мониторам относятся ANTIKOR.ЕХЕ, -D.COM, DEFENSE.ЕХЕ). Обнаружив подобное сообщение, следует выяснить от какой программы оно поступило, и проанализировать ее коды с помощью резидентного дизассемблера (например, Quaid Analyrer, -D3.COM и др.)
Рассмотренные методы подходят для обнаружения большинства как резидентных, так и нерезидентных вирусов, однако не срабатывают, если вирус выполнен по технологии "СТЕЛС" (Stealth) что делает бесполезным использование как утилит сравнения файлов, так и резидентных программ-мониторов.
Если в компьютере обнаружены следы деятельности вируса, но видимых изменений в файлах и системных секторах дисков не наблюдается, то вполне возможно, что компьютер поражен одним из СТЕЛС-вирусов. В этом случае следует осуществить "холодную" перезагрузку DOS (с помощью клавиши Reset) с заведомо чистой от вирусов дискеты, содержащей резервную копию DOS, и действовать как и при поражении нерезидентным вирусом. Однако иногда зто нежелательно, а часто и невозможно (известны, например, случаи покупки новых компьютеров, зараженных вирусом). Тогда придется обнаружить и нейтрализовать резидентную часть вируса, выполненную по технологии "СТЕЛС".
Что такое дизассемблер
Дизассемблер - это утилита, осуществляющая обратное ассемблирование т.е. переводящая машинные коды в язык ассемблера. Такие утилиты крайне необходимы не только при отладке программ (для чего они и создаются), но и при анализе кодов вируса.
Возникает вопрос: где в памяти и как искать вирус или его резидентную часть? Существует несколько способов инфицирования памяти:
1. Проникновение вируса в таблицу векторов прерываний.
Лучший способ обнаружить такой вирус состоит в том, чтобы просмотреть карту распределения памяти, которая отображает список резидентных программ (пример такой карты приведен в табл. 1). Подробная карта памяти сообщает информацию о всех блоках, на которые разбита память: адрес блока управления памятью - MCB (Memory Control Block), имя программы-владельца блока, адрес префикса ее программного сегмента - PSP (Program Segment Prefix) и список перехватываемых блоком векторов прерываний.
При наличии вируса в таблице векторов прерываний утилиты, отображающие карту распределения памяти (например, MAPMEM.COM, MFT.COM, -D.COM и др.), начинают "шуметь" (см. табл. 2).
Другой, более надежный, но требующий высокой квалификации вирусолога способ, - просмотреть таблицу векторов с помощью дизассемблера. Если при этом будут обнаружены коды какой-то программы - код вируса (или участок кода) найден. 2. Встраивание вируса в DOS несколькими способами: * в произвольный системный драйвер, * в системный буфер, * в другие рабочие области DOS (например, в область системного стека или в свободные места таблиц DOS и BIOS).
Мне известен единственный способ инфицирования вирусом произвольного системного драйвера: прикрепление тела вируса к файлу, содержащему драйвер, и модификация заголовка поражаемого драйвера. В этом случае вирус можно обнаружить при просмотре карты распределения памяти, содержащей список системных драйверов. Если при этом в списке присутствует драйвер, не описанный в файле 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
30,85,89,8E,90,93, 95,97,98,9D,9E,9F, A2,A7,A9,AB,AE,AF, B1,B3,BB,BE,BF,C0, C4,C9,CE,CF,D0,D1, D2,D4,D5,D8,D9,DA, DB,DD,DF,E0,E4,E5, E6,E7,E8,E9,EA,ED, EE,F3,F4,F5,F7,F8, F9 "Шум"
СТЕЛС-вирусы: невидимка в компьютере
В последнее время зафиксированы вирусные атаки так называемых СТЕЛС-вирусов. Эти вирусы представляют собой весбма совершенные программы, которые перехватывают обращения 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"
3. Проникновение вируса в область прикладных программ: 1. в виде отдельной резидентной программы или отдельного блока MCB; 2. внутри или "приклеевшись" к какой-либо резидентной программе.
Если вирус внедряется в область памяти, отведенную для прикладных программ, в виде нового блока, т.е. создавая для себя собственный блок MCB, или отдельной резидентной программы, то его можно обнаружить при просмотре подробной карты распределения памяти, отображающей адреса всех блоков MCB. Обычно такой вирус выглядит как отдельный блок памяти (табл. 3), не имеющий имени и перехватывающий один или несколько векторов прерываний (например, int 8h, int 13h, int 1Ch или int 21h).
Вирус может "приклеиться" к программам, которые резидентно размещены в памяти. При этом обнаружить его сложнее - нужно знать реальную длину программ, размещенных в памяти, и список прерываний, которые они перехватывают. Следует отметить, что у вируса, использующего такой способ внедрения, возникают неприятности, так как отличить исполняемую нерезидентную программу от резидентной невозможно, поэтому такой вирус, скорее всего, окажется "маложивущим". 4. Проникновение вируса за границу памяти, выделенной под DOS.
Все загрузочные и некоторые файловые вирусы располагаются за пределами памяти, выделенной для DOS, уменьшая значение слова, расположенного по адресу [0040:0013]. Обнаружить такие вирусы очень просто: достаточно узнать емкость оперативной памяти и сравнить ее с реальной. Если вместо 640 или 512 Кбайт система сообщит меньшее значение, то следует просмотреть дизассемблером "отрезанный" участок памяти. При обнаружении на этом участке кодов какой-то программы, вирус, скорее всего, найден.
Внимание! В некоторых компьютерах, использующих расширенную память, емкость оперативной памяти уменьшается на 1 Кбайт. 5. Встраивание вируса в конкретные, заведомо резидентные программы.
Возможно инфицирование вирусом файлов 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, позволяющего восстанавливать перекрестные ссылки, здесь вряд ли что поможет. К тому же следует учитывать, что во-первых, некоторые вирусы успешно блокируют попытки просмотреть их коды с помощью отладчиков, во-вторых, при работе с отладчиком есть вероятность, что вирус "вырвется" из-под контроля.