Евгений Каспеpский
КомпьютерПресс N8/1992 (стр. 57-65)
ISSN 0868-6157
Август 1992
Как и следовало ожидать, на территории бывшего СССР разразилась настоящая эпидемия компьютерной заразы, принимающей самые разнообразные и довольно изощренные формы. Телефонные звонки от обеспокоенных владельцев персональных компьютеров раздаются ежедневно из самых разных мест - от Украины до Благовещенска и обсерваторий в Казахстане. В отличие от традиционного гриппа, эти эпидемии все реже заносятся "оттуда" и все чаще имеют ярко выраженные отечественные приметы...
Наши создатели вирусов недолго плелись в хвосте мирового компьютерного хулиганства - пропорционально числу ввозимых компьютеров росло и поголовье электронных насекомых, неизвестных знаменитым SCAN'ам и TNTVIRUS'ам. И, как следствие, практически все пользователи компьютеров рано или поздно (а кое-кто и постоянно) встречаются с вирусом. И, как еще одно следствие, далеко не всегда антивирусные программы правильно опознают этот вирус, и, что гораздо важнее, далеко не все антивирусы правильно его удаляют.
Естественно, что если за соседним столом работает системный программист, который за 2-3 часа выловит гостя и стерилизует компьютер (не прибегая при этом к команде "FORMAT C:"), или вы сами являетесь таковым, то можно спать спокойно. Но если это не так, то придется либо самому становиться системным программистом, либо выделить вирус и отослать его разработчику (или разработчикам) антивирусных программ, а затем с нетерпением ждать ответа.
Ниже приведены рекомендации пользователям, оказавшимся в подобной ситуации. Естественно, что эти рекомендации отражают только Мой личный опыт, и специалисты в области вирусов, особенно их авторы, могут со мной поспорить. В первую очередь, описаны правила использования антивирусных программ, затем методы выделения вируса и наиболее общие способы анализа и удаления вируса. Часть материала, приведенного ниже, впервые опубликована в журнале "Интеркомпьютер", #6, 1990 г.
Перед использованием антивирусных программ крайне желательно загрузиться с резервной копии DOS, которая расположена на заведомо чистой от вирусов и защищенной от записи дискете. Это необходимо для того, чтобы застраховаться от присутствия резидентного вируса, так как он может блокировать работу антивируса или использовать его работу для инфицирования. проверяемых файлов. Перезагрузка компьютера должна быть холодной, так как некоторые вирусы "выживают" при теплой перезагрузке.
Желательно, чтобы антивирусные программы, используемые для проверки, были самых последних версий. Желательно также, чтобы хоть одна из них была отечественного производства, так как процесс эмиграции вируса в другие страны и иммиграции антивирусных программ занимает довольно большое время. Поэтому наиболее оперативно на появление нового вируса реагируют только отечественные антивирусные программы.
Если обнаружены зараженные файлы, то следует:
Следует отметить, что качество восстановления файлов многими антивирусными программами оставляет желать лучшего. Многие популярные антивирусы частенько необратимо портят файлы вместо их лечения. Поэтому если потеря файлов нежелательна, то выполнять перечисленные выше пункты следует в полном объеме.
Необходимо обращать особое внимание на чистоту модулей, сжатых утилитами типа LZEXE, PKLITE или DIET, файлов в архивах (ZIP, ARC, ICE, ARJ и т.д.) и данных в самораспаковывающихся файлах, созданных утилитами типа ZIP2EXE. Если случайно упаковать файл, зараженный вирусом, то обнаружение и удаление такою вируса без распаковки файла практически невозможно. В данном случае типичной будет ситуация, при которой все антивирусные программы сообщат о том, что от вирусов очищены все диски, но через некоторое время вирус появится опять.
Штаммы вируса могут проникнуть и в backup-копии программного обеспечения при обновлении этих копий. Причем архивы и backup-копии являются основными поставщиками давно известных вирусов. Вирус может годами "сидеть" в дистрибутивной копии какого-либо программного продукта и неожиданно проявиться при установке программ на новом компьютере.
Никто не может гарантировать полного уничтожения всех копий компьютерного вируса, так как файловый вирус может поразить не только выполняемые файлы, но и оверлейные модули с расширениями имени, отличающимися от СОМ или EXE. Загрузочный вирус может остаться на какой-либо дискете и внезапно проявиться при случайной попытке перезагрузить с нее. Поэтому целесообразно некоторое время после удаления вируса постоянно пользоваться резидентным антивирусным монитором типа утилиты -D.СОМ, входящей в комплекс "'Доктор' Касперский". При помощи резидентного монитора можно перехватить момент появления подавляющего большинства вирусов. Если вирус нерезидентный, то монитор перехватит обращение к файлам типа СОМ или ЕХЕ. Если вирус резидентный, то отслеживаются изменения в блоках памяти и в таблице векторов прерываний. При этом следует выяснить, как резидентный вирус выглядит на карте оперативной памяти, и после дезактивации вируса периодически просматривать карту памяти на предмет обнаружения этого вируса.
И последнее замечание. Не каждый сбой компьютера является проявлением вируса, поэтому почаще вспоминайте поговорку "Не так страшен черт, как его малюют". К тому же, поражение вирусом - не самое плохое, что может случиться с компьютером.
В этом разделе рассматриваются ситуации, с которыми может столкнуться пользователь в том случае, если его компьютер поражен вирусом, но ни одна из известных ему антивирусных программ не дала положительного результата. Где и как искать вирус? Какие при этом необходимы инструментальные средства и какими методами следует пользоваться?
Как известно, вирусы делятся на резидентные и нерезидентные. Встречавшиеся мне до сих пор резидентные вирусы отличались гораздо большим коварством и изощренностью, чем нерезидентные. Поэтому для начала рассмотрим простейший случай - поражение компьютера неизвестным нерезидентным вирусом. Такой вирус активизируется при запуске какой-либо зараженной программы, совершает все, что ему положено, передает управление программе-носителю и в дальнейшем (в отличие от резидентных вирусов) не будет мешать ее работе. Для обнаружения такого вируса необходимо сравнить длины файлов на винчестере и в дистрибутивных копиях (упоминание о важности хранения таких копий уже стало банальностью). Если это не поможет, то побайтно сравнить дистрибутивные копии с используемыми программами. В настоящее время разработано достаточно много утилит такого сравнения файлов, самая простейшая из них (утилита COMP) содержится в DOS.
Существуют специальные утилиты, которые не только сравнивают содержимое файлов и их параметров (длина, атрибуты, время последней модификации), но и сообщают о наличии в разных файлах повторяющихся одинаковых участков кода или проверяют файлы на наличие "подозрительных" команд (например, утилиты Virus Locator А.Шеховцова или Lie Detector Е.Сусликова, алгоритм теста на "подозрительность" включен и в программу-фаг -V.ЕХЕ). Такие утилиты очень удобны, но иногда начинают "ругаться" на широко распространенные упаковщики ЕХЕ- файлов, некоторые файлы DOS, на антивирусные "насадки" к файлам, плохо обнаруживают вирусы, часть кода которых зашифрована. К тому же, в последнее время появляется все большее количество вирусов-"призраков", у которых два штамма одного вируса практически никогда не имеют ни одного совпадающего байта (в большинстве случаев это достигается сложными шифровками тела вируса и многочисленными модификациями кодов в блоке расшифровки).
Можно также просмотреть дамп выполняемых файлов. В некоторых случаях можно сразу обнаружить присутствие вируса по наличию в его коде текстовых строк. Многие вирусы, например, содержат строки: ".COM", "*.COM", "*.*", "MZ" "COMMAND" и т.д. Эти строки часто встречаются в начале или в конце зараженных файлов. Существует и еще один способ визуального определения зараженного вирусом файла. Он основан на том, что выполняемые файлы, исходный текст которых написан на языке высокого уровня, имеют вполне определенную структуру: сегмент кода программы, а сразу за ним - сегмент данных, причем в начале этого сегмента стоит строка-копирайт фирмы-изготовителя компилятора. Если в дампе такого файла за сегментом данных следует еще один участок кода, то вполне вероятно, что файл заражен вирусом.
Рекомендуется запустить одну из резидентных антивирусных программ-мониторов и следить за ее сообщениями о "подозрительных" действиях программ (запись в COM- или EXE-файлы, запись на диск по абсолютному адресу и т.п.). Существуют мониторы, которые не только перехватывают такие действия, но и сообщают адрес, откуда поступил "подозрительный" вызов (к таким мониторам относится -D.СОМ). Обнаружив подобное сообщение, следует выяснить, от какой программы оно пришло, и проанализировать ее коды при помощи резидентного дизассемблера (например, -UTIL.COM). При анализе кодов программ, резидентно находящихся в памяти, большую помощь часто оказывает трассирование прерываний 13h и 21h.
В загрузочных секторах дисков расположены небольшие, как правило, программы, назначение которых состоит в определении размеров и границ логических дисков (для MBR-винчестера) или загрузке операционной системы (для Boot-сектора). Дампы таких программ приведены в Приложении.
Вначале следует прочитать содержимое сектора, "подозрительного" на наличие вируса. Для этой цели лучше использовать программы из комплекта "Нортоновских утилит".
Некоторые загрузочные вирусы практически сразу обнаруживают свое присутствие различными текстовыми строками (например, вирус "Stone" содержит строки: "Your РС is now Stoned!", "LEGALISE MARIJUANA!"). Некоторые вирусы, поражающие Boot-секторы дисков, проявляются отсутствием строк, обязательно присутствующих в Boot-секторе. К таким строкам относятся: строка-заголовок Boot-сектора, содержащая номер версии DOS или название фирмы-производителя программного обеспечения (например, строка "MSDOS3.3"); имена системных файлов (например, строка "IO SYSMSDOS SYS"); строки сообщений об ошибках.
Стандартный загрузчик MS-DOS, расположенный в MBR, занимает меньше половины сектора, и многие вирусы поражающие MBR винчестера, довольно просто заметить по увеличению длины кода, расположенного в секторе MBR.
Однако существуют вирусы, которые внедряются в загрузчик без изменения его текстовых строк и с минимальными изменениями кода загрузчика (например, вирусы, изменяющие при инфицировании MBR всего 3 байта Disk Partition Table, соответствующие адресу активного загрузочного сектора). Для идентификации такого вируса придется провести более детальное исследование кодов загрузочного сектора вплоть до полного анализа алгоритма работы его кода.
Приведенные рассуждения основываются на том, что стандартные загрузчики (программы, записываемые операционной системой в загрузочные секторы) реализуют стандартные алгоритмы загрузки операционной системы и оформляются в соответствии с ее стандартами. Если же диски отформатированы утилитами, не входящими в состав DOS (например, Disk Manager), то для обнаружения в них вируса следует проанализировать алгоритм работы и оформление загрузчиков, создаваемых такой утилитой.
Рассмотренные выше методы обнаружения файловых и загрузочных вирусов подходят для большинства как резидентных, так и нерезидентных вирусов. Однако эти методы не срабатывают, если вирус выполнен по технологии "стелс", что делает бесполезным использование большинства резидентных мониторов, утилит сравнения файлов и чтения секторов.
Если в компьютере обнаружены следы деятельности вируса, но видимых изменений в файлах и системных секторах дисков не наблюдается, то вполне возможно, что компьютер поражен одним из "стелс"-вирусов. В этом случае необходимо загрузить DOS с заведомо чистой от вирусов дискеты, содержащей резервную копию DOS, и действовать как и при поражении нерезидентным вирусом. Однако иногда это нежелательно, а в ряде случаев невозможно (известны, например, случаи покупки новых компьютеров, зараженных вирусом). Тогда придется обнаружить и нейтрализовать резидентную часть вируса, выполненную по технологии "стелс". Возникает вопрос: где в памяти и как искать вирус или его резидентную часть? В настоящее время известно несколько способов инфицирования памяти.
При наличии вируса в таблице векторов прерываний утилиты, отображающие карту распределения памяти (например, -D.СОМ, -UTIL.COM), начинают "шуметь".
Таблица 1. Карта распределения незараженной памяти
Адрес блока MCB | Адрес PSP | Размер блока MCB (Кб) | Имя программы владельца блока MCB | Номера векторов прерываний |
---|---|---|---|---|
0E9A | 0E9B | 3,20K | COMMAND.COM | 22,24,2E |
0F6E | 0F6F | 0,04K | блок свободен | |
0F72 | 0E9B | 0,15K | COMMAND.COM | |
0F7D | 0F85 | 23,20K | -D.COM | 10,1B,1C,23,26,27,28,2F,40,EF,FF |
1545 | 1546 | 0,10K | блок свободен | |
154D | 154E | 3,90K | PLUCK.COM | 09,13,16,21 |
1648 | 0E9B | 549,30K | COMMAND.COM | 30,EE,F2,F3,F4,F5,F6,F7,F8,FE |
Таблица 2. Таблица векторов прерываний поражена вирусом
Адрес блока MCB | Адрес PSP | Размер блока MCB (Кб) | Имя программы владельца блока MCB | Номера векторов прерываний | ||
---|---|---|---|---|---|---|
0E9A | 0E9B | 3,20K | COMMAND.COM | 22,24,2E,EB | ||
0F6E | 0F6F | 0,04K | блок свободен | |||
0F72 | 0E9B | 0,15K | COMMAND.COM | |||
0F7D | 0F85 | 23,20K | -D.COM | 10,1B,1C,23,26,27,28,2F,40,CA,D3 | ||
1546 | 1547 | 0,10K | блок свободен | |||
154E | 154F | 3,90K | PLUCK.COM | 09,13,16,91 | ||
164C | 0E9B | 549,30K | COMMAND.COM |
|
Другой, более надежный, но требующий высокой квалификации пользователя способ, - просмотреть таблицу векторов прерываний с помощью дизассемблера. Если при этом будут обнаружены коды какой-то программы, то код вируса (или участок кода) найден.
Вирус, встраивающийся в системный буфер, должен уменьшать общее число буферов; в противном случае он будет уничтожен последующими операциями считывания с диска. Достаточно несложно написать программу, которая подсчитывает число буферов, реально присутствующих в системе, и сравнивает полученный результат со значением команды BUFFERS, расположенной в файле CONFIG.SYS (если команда BUFFERS отсутствует, то со значением, устанавливаемым DOS по умолчанию). Подобная проверка прекрасно работает (100% попаданий) в антивирусной программе -V.ЕХЕ.
Существует достаточно способов внедрения вируса в системные таблицы или область стека DOS. Однако реализация этих способов потребует от автора вируса досконального знания различных версий DOS. К тому же свободного места в DOS не так уж много, поэтому написание полноценного "стелс"-вируса такого типа маловероятно. Если же все-таки подобный вирус появится, то обнаружить его код можно дизассемблированием "подозрительных" на наличие вируса участков DOS.
Если вирус внедряется в отведенную для прикладных программ область памяти в виде нового блока, создавая для себя собственный MCB, или как отдельная резидентная программа, то его можно обнаружить при просмотре подробной карты распределения памяти, отображающей адреса всех блоков MCB. Обычно такой вирус выглядит как отдельный блок памяти (табл. 3), не имеющий имени и перехватывающий один или несколько векторов прерываний (например, int 8h, 13h, 1Ch, 21h).
Таблица 3. Вирус в области пользовательских программ
Адрес блока MCB | Адрес PSP | Размер блока MCB (Кб) | Имя программы владельца блока MCB | Номера векторов прерываний |
---|---|---|---|---|
0E9A | 0E9B | 3,20K | COMMAND.COM | 22,24,2E |
0F6E | 0F6F | 0,04K | блок свободен | |
0F72 | 0E9B | 0,15K | COMMAND.COM | |
10D1 | 10DA | 23,20K | -D.COM | 10,1B,23,26,27,28,2F,40 |
17AF | 17B0 | 1,70K | ? | 08 (Обнаружен вирус "Yankee Doodle") |
1820 | 0E9B | 539,30K | COMMAND.COM | 30,31 |
9F04 | 0000 | 3,90K | ? | 1C,21 (Обнаружен вирус "Jerusalem") |
Внимание!
Емкость оперативной памяти может уменьшиться на один или несколько килобайт и в результате использования расширенной памяти или некоторых типов контроллеров. При этом типична следующая картина: в "отрезанном" участке содержимое большинства байтов нулевое.
В этом случае обнаружить вирус гораздо сложнее - необходимо знать реальную длину программ, размещенных в памяти, и список прерываний, которые они перехватывают. Но этот способ не очень удобен и иногда не срабатывает. Поэтому рекомендуется использовать другой метод, который может облегчить выявление вируса в подобной ситуации. Он основан на следующем свойстве - подавляющее большинство вирусов для обнаружения незараженных файлов или секторов дисков перехватывают прерывания 13h или 21h, встраиваясь в обработчик прерывания. В таком случае для обнаружения вируса достаточно просмотреть текст (команды ассемблера) обработчиков указанных прерываний (например, при помощи программы -UTIL.СОМ). Правда, для того, чтобы отличить вирус от обычных программ, требуется достаточный опыт работы с вирусами и некоторое представление о структуре обработчика на незараженном компьютере. К тому же следует быть осторожным: существует несколько вирусов, которые "завешивают" систему при попытке трассировки их кодов.
Известны вирусы, которые при заражении файлов или дисков не пользуются прерываниями, а напрямую работают с ресурсами DOS. При поиске подобного вируса необходимо тщательно исследовать изменения во внутренней структуре зараженной DOS: список драйверов, таблицы файлов, стеки DOS и т.д. Это очень кропотливая работа, которая, учитывая многочисленность версий DOS, требует очень высокой квалификации пользователя.
Конечно, возможны и другие, достаточно экзотические способы инфицирования памяти вирусом, например, внедрение вируса в видеопамять (что уже встречалось) или в расширенную память, но подобные вирусы встречаются достаточно редко и всегда проявлялись хотя бы одним из перечисленных выше признаков. Возможно, конечно, создание монстров, использующих виртуальные режимы процессоров 80386 и 80486 (а что будет в 80586?), но, во-первых, это будет слишком заметно, а во-вторых, программист подобной квалификации всегда найдет для себя более осмысленную задачу.
На мой взгляд, наиболее удобным для хранения и анализа вируса объектом является файл, содержащий его (вируса) тело. Как показывает практика, для анализа файлового вируса удобнее иметь несколько зараженных файлов различных, но не очень больших, длин. При этом желательно иметь зараженные файлы всех типов (COM, EXE и SYS), которые могут быть поражены вирусом. Если необходимо проанализировать часть оперативной памяти, то при помощи некоторых утилит (например, -UTIL.СОМ) довольно просто выделить участок, где расположен вирус, и скопировать этот участок на диск. Если же требуется анализ сектора MBR или Вооt-сектора, то скопировать их в файлы можно при помощи популярных "Нортоновских утилит". Для хранения загрузочного вируса наиболее удобен файл-образ зараженного диска. Для его получения необходимо отформатировать дискету (лучше 360 Кбайт), заразить ее вирусом, скопировать образ дискеты (все сектора, начиная с 0-го и кончая последним) в файл и, при необходимости, скомпрессировать его (эту процедуру можно проделать при помощи "Нортоновских утилит", программ TELEDISK или DISKDUPE).
Зараженные файлы или файл-образ зараженной дискеты лучше передать разработчикам антивирусных программ по модему или, в крайнем случае, на дискете по почте в обмен на антивирусную программу. Однако, если это займет много времени, которое, как известно, не ждет, то пользователям, достаточно уверенным в себе, можно попробовать и самостоятельно разобраться в вирусе и написать антивирус.
При анализе алгоритма вируса предстоит выяснить:
При решении этих задач не обойтись без дизассемблера или отладчика (это могут быть отладчики Quaid Analyzer, Advanced Trace86, FULSCREEN DEBUG или дизассемблеры DisDoc, Sourcer или IDA).
И отладчики, и дизассемблеры имеют и положительные, и отрицательные черты - каждый выбирает то, что он считает более удобным. Несложные короткие вирусы быстро "вскрываются" стандартным отладчиком DEBUG; при анализе объемных и высокосложных (типа вируса "V-4096") не обойтись без дизассемблера. Если необходимо быстро обнаружить метод восстановления пораженных файлов, то достаточно пройтись отладчиком по началу вируса до того места, где он восстанавливает загруженную программу перед тем, как передать ей управление (фактически именно этот алгоритм чаще всего используется при лечении вируса). Если же требуется получить детальную картину работы вируса или хорошо документированный листинг, то, кроме дизассемблера Sourcer и его возможности восстанавливать перекрестные ссылки, здесь вряд ли что поможет. К тому же, следует учитывать, что, во-первых, некоторые вирусы достаточно успешно блокируют попытки протрассировать их коды, а во-вторых, при работе с отладчиком существует ненулевая вероятность того, что вирус вырвется из-под контроля.
При анализе файлового вируса необходимо выяснить, какие файлы (COM, EXE, SYS) поражаются вирусом, в какое место (места) в файле записывается код вируса - в начало, конец или середину файла, в каком объеме возможно восстановление файла (полностью или частично), в каком месте вирус хранит восстанавливаемую информацию.
При анализе загрузочного вируса основная задача - выяснение адреса (адресов) сектора, в котором вирус сохраняет первоначальный загрузочный сектор (если, конечно, вирус сохраняет его).
Для резидентного вируса также необходимо выделить участок кода, создающий резидентную копию вируса, и вычислить возможные адреса точек входа в перехватываемые вирусом прерывания. Необходимо также выяснить, каким образом и где в оперативной памяти выделяет вирус место для своей резидентной копии: записывается ли вирус по фиксированным адресам в системные области DOS и BIOS, уменьшает размер памяти, выделенной под DOS (слово по адресу [0000:0413]), создает для себя специальный MCB-блок, либо использует какой-либо другой способ.
Существуют особые случаи, когда анализ вируса может оказаться очень сложной для пользователя задачей, например, при анализе вируса-"призрака". В этом случае лучше обратиться к специалисту по анализу кодов программ.
При поражении компьютера произвольным вирусом перед пользователем могут возникнуть следующие задачи: дезактивация резидентной памяти, лечение загрузочных секторов (MBR, Boot), обход подкаталогов всех дисков, поиск и восстановление зараженных файлов.
При лечении оперативной памяти следует обнаружить коды вируса и изменить их таким образом, чтобы вирус в дальнейшем не мешал работе антивирусной программы.
Оптимальный алгоритм обнаружения кодов вируса зависит от способа инфицирования вирусом оперативной памяти. Если вирус записывает свою резидентную копию по фиксированным адресам, то и искать ее нужно по этим адресам. Если вирус создает для своей TSR-копии новый MCB-блок, то следует пройти все MCB-блоки, начиная с первого и кончая последним, и в каждом блоке по фиксированным адресам искать коды вируса. Если вирус записывается за пределами памяти DOS, предварительно уменьшая размер выделенной под DOS памяти, то следует провести полное сканирование "отрезанного" от DOS участка. Практически для всех способов инфицирования вирусом оперативной памяти подходит метод трассировки прерываний, используемый вирусами семейства "Yankee".
После того как определены адреса TSR-копии вируса, следует исправить его коды таким образом, чтобы полностью нейтрализовать влияние вируса на процесс поиска и лечения зараженных файлов. Итак, если, например, вирус заражает файлы при их открытии, это может выглядеть примерно следующим образом:
Исходный код вируса Код дезактивированного вируса ........ ............... ........ ........... 80 FC 3D CMP AH, 3Dh 80 FC 3D CMP AH, 3Dh 74 хх JE Infect_File 90 NOP Е9 хх хх JMP Continue 90 NOP Е9 хх хх JMP Continue ........ ............... ........ ...........
При дезактивации TSR-копии вируса следует учитывать, что вирус может предпринимать специальные меры для восстановления своих кодов (например, некоторые вирусы семейства "Yankee"), и в этом случае придется нейтрализовать и механизм самовосстановления вируса.
Восстановление секторов в большинстве случаев довольно простая операция, выполняемая при помощи "Нортоновских утилит" или DOS'овской команды SYS. При заражении компьютера вирусом со сложным алгоритмом основной задачей становится определение адреса сектора, в котором находится сохраненный вирусом оригинальный загрузочный сектор. Некоторые вирусы не сохраняют старое содержимое сектора (вирус "Azusa"); в этом случае придется восстанавливать коды загрузочного сектора по какому-либо образцу (например, по образцам, приведенным в Приложении).
При восстановлении системных загрузчиков следует соблюдать особую осторожность, поскольку результатом неправильного исправления сектора MBR или Boot-сектора может быть потеря всей информации на диске (дисках). Поэтому даже довольно простую процедуру считывания и восстановления оригинального загрузочного сектора нужно обязательно проверить на корректность. Простейшая проверка состоит в выяснении наличия в конце загрузочного сектора сигнатуры AA55h.
При лечении файлов следует учесть следующие правила:
Само лечение файла производится в большинстве случаев довольно просто. Если вирус записывается в конец файла, то необходимо восстановить старое начало файла (у ЕХЕ-файлов особое внимание следует обратить на корректность полей восстанавливаемых заголовков) и затем отрезать вирус от файла (пример программы, восстанавливающей файлы, пораженные вирусом "Vienna-648", приведен в Приложении). Если вирус записался в начало файла, то следует переписать старое содержимое файла в его (файла) начало и укоротить файл.
В более сложных случаях (особенно, если вирус зашифрован или выполнен по технологии "призрак") процедура восстановления файла может существенно усложниться.
Е.КасперскийOffset_3_Bytes=206h SEGA SEGMENT BYTE PUBLIC ASSUME CS:SEGA, DS:SEGA ORG 100H CURE PROC START: PUSH CS ; Код и данные POP DS ; в одном сегменте MOV DX, OFFSET File_Name ; Открыть файл MOV AX, 3D02h INT 21h JC Error MOV Handle, AX MOV CX, 3 ; Прочитать первые MOV DX, OFFSET Buffer ; 3 байта файла MOV BX, Handle MOV AH, 3Fh INT 21h JC Error XOR CX, CX ; Вычислить адрес MOV AX, WORD PTR Buffer+1 ; первоначального ADD AX, Offset_3_Bytes ; начала файла ADC CX, 0 ; (старые 3 байта) MOV DX, AX ; Установить указатель MOV BX, Handle ; на старые 3 байта MOV AX, 4200h INT 21h JC Error MOV CX, 3 ; Прочитать старое MOV DX, OFFSET Buffer+3 ; начало файла MOV BX, Handle MOV AH, 3Fh INT 21h JC Error XOR CX, CX ; Переместить указатель XOR DX, DX ; на начало файла MOV BX, Handle MOV AX, 4200h INT 21h JC Error MOV CX, 3 ; Восстановить начало файла MOV DX, OFFSET Buffer+3 MOV BX, Handle MOV AH, 40h INT 21h JC Error XOR CX, CX ; Переместить указатель MOV DX, WORD PTR Buffer+1 ; на начало вируса ADD DX, 3 ADC CX, 0 MOV BX, Handle MOV AX, 4200h INT 21h JC Error MOV CX, 0 ; Укоротить файл MOV BX, Handle MOV AH, 40h INT 21h Error: MOV BX, Handle ; Закрыть файл MOV AH, 3Eh INT 21h MOV AX, 4C00h ; Выход в DOS INT 21h Handle DW ? File_Name DB "INFECT.COM" Buffer DB 6 DUP (?) CURE ENDP SEGA ENDS EBD START
С адреса 0000 по адрес 00E1 - программа загрузки активного Boot-сектора.
С адреса 01C0 по адрес 01FD - таблица разбиения диска (Disk Partition Table).