КРАТКОЕ ОПИСАНИЕ ДЕЙСТВИЯ ВИРУСА SVC 5.0
ИСТОРИЯ ОБНАРУЖЕНИЯ
    В начале июня 1991 г. мы заметили, что с  нашей  ПЭВМ (фирмы
SELCO Computer, МП I80286) происходит что-то неладное  :  иногда
происходит произвольная перезагрузка DOS или машина  "зависает",
перестал  запускаться AUTOCAD,  при копировании  файлов во время
работы  Norton  Commander  время  создания копии устанавливается
на 12:00.
    Почти полная уверенность в проникновении неизвестного вируса
в  используемое  нами  ПО  возникла  у  нас  7  июня,  когда  мы
использовали  программу  AS  (автор  -  А.В.Байков) для перехва-
тывания дисковых операций при работе Norton Commander (программа
AS  перехватывает  прерывание  13H).  Мы заметили, что при любом
обращении к диску из NC  некая  программа  пытается  осуществить
запись  на диск.  При этом длины всех файлов при работе NC соот-
ветствовали их истинным исходным значениям.  Однако, при  после-
дующем  просмотре  директориев  в PC Tools выяснилось, что длины
многих *.COM и *.EXE файлов  увеличены  на  3103  байта.   Кроме
того, размер памяти системы, доступной DOS, уменьшен на 4 Kb (по
рапорту DOS), в то время, как PC Tools находит  столько  памяти,
сколько ее установлено в ПЭВМ на самом деле, а именно 640 Kb.
    8 июня  мы  запустили  на  "зараженной"  ПЭВМ  "программу  -
- приманку" (4 Kb кодов 90Н) - и вирус заразил ее.  После  этого
нетрудно было на "чистом" компьютере выделить его код и проанали-
зировать его работу.
ИНИЦИАЛИЗАЦИЯ
    Когда зараженная программа начинает выполняться,  управление
передается  на  начало тела вируса, т.к.  при заражении программ
первые 24 байта оригинального кода запоминаются в области данных
тела  вируса,  а  в  первые  3  байта,  в случае файла типа СОМ,
записывается JMP LABEL, где LABEL - начало кода вируса, а случае
заражения  файла  типа ЕХЕ модифицируется заголовок файла с тем,
чтобы  при  загрузке  управление  передавалось  на  начало  кода
вируса.
    Проверяется  наличие  кода  вируса  в ОЗУ.  Если он есть, то
сравнивается код вируса в памяти с  кодом  вируса  в  программе.
Если встречается отличие, то происходит перезагрузка ПЭВМ, иначе
управление пеpедается исходной программе.  Если  кода  вируса  в
ОЗУ  нет,  то  происходит  загрузка тела вируса в старшие адреса
оперативной памяти.  При этом:
    1. Определяется  размер доступной памяти.   Если  достаточно
места для размещения тела вируса, то освобождается блок памяти в
старших  адресах,  куда  переписывается тело вируса со смещением
0000Н относительно сегмента вновь распределенного блока памяти;
    2. Переустанавливаются вектора прерываний 21Н и 8Н;
    3. Управление передается исходной программе.
    Перед  тем,  как  передать  управление  исходной  программе,
происходит декодирование  первых  24  байт  исходной  программы,
которые  хранятся  со  смещением  0ВААН относительно начала кода
вируса в зараженной программе.
    Кодирование и декодирование выполняются с  помощью  одной  и
той же процедуры, фрагмент которой приведен ниже:
    PUSH       CS
    POP        DS
    POP        SI               ; SI  указывает на  начало  кода
                                ; вируса
    PUSH       SI
    MOV        AH,CS:[SI+0C1A]  ; ключ перекодировки
    MOV        DH,CS:[SI+0C1B]  ; ключ перекодировки
    ADD        SI,0BAA
                                ; начало процедуры перекодировки
    PUSH       DS
    POP        ES
    MOV        DI,SI
    MOV        CX,0018
    CLD
LABEL:
    LODSB                       ;
    XOR        AL,AH            ;
    STOSB                       ; перекодировка кода
    ADD        AH,DH            ;
    LOOP       LABEL            ;
    Если была загружена программа типа СОМ, то начиная с CS:0100
переписываются первые 3 байта раскодированного кода и управление
передается на CS:0100.
    Если была загружена программа типа ЕХЕ, то восстанавливается
из  раскодированных  24  байт  оригинальный  заголовок  файла  и
управление передается на оригинальный CS:IP.
ИНФИЦИРОВАНИЕ ПРОГРАММ
    Когда вирус находится в ОЗУ, он перехватывает прерывания 21Н
и 8Н.
    При возникновении прерывания INT 8H происходит следующее:
    1. Проверяет вектора прерываний INT 1H, INT 3H;
    2. Ecли они не совпадают с установленными им самим, то проис-
       ходит переопределение этих векторов на точки входа в теле
       вируса;
    3. Управление передается на обработку истинного INT 8H.
    Koгда возникает INT 3H и INT 1H сравнивается CS инициирующей
прерывание программы с СS вируса. Если они совпадают,  то проис-
ходит перезагрузка ПЭВМ (JMP F000:FFF0). Eсли не  совпадают,  то
происходит переход на истинную обработку прерываний. Видимо, это
является попыткой борьбы с отладчиками.
    При возникновении INT 21Н виpус реагирует на функции:
        1. 11Н - найти первый совпадающий файл через FCB;
        2. 12H - найти следующий совпадающий файл через FCB;
        3. 3СН - создать файл через описатель;
        4. 3DH - открыть описатель файла;
        5. 3ЕН - закрыть описатель файла;
        6. 40Н - писать в файл через описатель;
        7. 42H - (подфункция 02Н)  переместить указатель файла к
                 концу файла;
        8. 4ВН - загрузить и выполнить, при этом  выделяет  под-
                 функции :
               - 00Н, 01Н - загрузить и выполнить;
               - 03Н      - загрузить программный оверлей;
        9. 4СН - завершить программу;
       10. 4ЕН - найти первый совпадающий файл через описатель;
       11. 4FH - найти следующий совпадающий файл  через  описа-
                 тель;
       12. 57Н - дать/установить время/дату файла;
       13. 83Н - ?;
       14. 84H - ?.
    Вирус пытается инфицировать программы, когда  возникает  INT
21H c АН, равным 03DH, 03ЕН, 040Н, 04ВН.
    Сценарий  действий  во  всех  случаях примерно одинаков (для
примера дана схема действий при АН = 4В):
    1.  В имени файла  ищется  цепочка  символов  "CHKD".   Если
таковая  находится,  то  по  некоторому  адресу в область данных
вируса  заносится  1.   Содержимое  памяти   по   этому   адресу
проверяется    при   возникновении   INT   21Н   с   АН   равным
11H,12H,4ЕH,4FH (Find First and Find Next).  Ecли там  1  то  на
экран выводится истинная длина файла.
    2.  Переопределяются  вектора прерываний 23Н, 24Н.  При этом
прерывания не запрещаются.
    3.  Извлекается атрибут  файла.   Если  файл  системный,  то
восстанавливаются   прежние   вектора   прерываний  23Н,  24Н  и
выполняется переход на истинный INT 21H.
    4.  Открывается файл для чтения и записи.
    5.  Извлекаются дата и время  создания  файла.   Если  число
секунд   равно  60,  то  закрывается  описатель  файла,  восста-
навливаются прежние вектора прерываний 23Н,  24Н  и  выполняется
переход на истинный INT 21H.
    6.  Если  число  секунд не равно 60, то в имени файла ищутся
цепочки символов "mm", "MM", "bm",  "BM"  и  если  одна  из  них
находится,  то  закрывается  описатель  файла, восстанавливаются
прежние вектора прерываний 23Н, 24Н  и  выполняется  переход  на
истинный INT 21H.
    7.  Если цепочка символов не встретилась, то описатель файла
сравнивается  с  0005Н.   При  равенстве  закрывается  описатель
файла,  восстанавливаются  прежние вектора прерываний 23Н, 24Н и
выполняется переход на истинный INT 21H.
    8.  Если описатель файла не равен 0005H, то вирус проверяет,
заражена ли загружаемая программа.  Если число секунд равно 60 и
3 байта со смещением pавным длина  файла  минус  8АН  от  начала
файла  равны  соответственно  35, 2Е, 30 (5.0) то виpус считает,
что файл уже заражен.
    9.  Если файл еще не заражен, то  модифицируются  первые  24
байта   программы  с  тем,  чтобы  при  ее  загрузке  управление
передавалось  на  начало  кода  вируса.   Модифицированный   код
записывается  в  начало  программы  на  диске, а в ее конец тело
вируса.
    10. После  заражения закрывается  описатель  файла,  восста-
навливаются  прежние  вектора  прерываний  23Н, 24Н и передается
управление исходной программе.
ПРОЯВЛЕНИЕ
    Зараженные программы имет длину на 0C1FН байт  большую,  чем
исходный  код.   Однако,  при  просмотре каталогов на зараженной
машине этого видно не будет, т.к.  при возникновении INT  21H  c
AH,  равным  11H,12H,4ЕH,4FH  (Find  First and Find Next), вирус
проверяет, заражен найденный файл или нет.  Если  файл  заражен,
то  в  DTA  записывается  длина  файла  минус  0C1F, т.е.  длина
незаpаженного   файла.    Аналогично   виpус   маскиpует    свое
пpисутствие  и  при  возникновении  INT  21H  c  АН  равным  57Н
(установить/опросить время/дату файла).
    Мы не нашли в коде вируса ничего, что могло  бы  привести  к
нежелательным  последствиям  (удаление  файлов, форматирование и
т.д.).  С этой точки зрения вирус выглядит довольно безобидным.
ОБНАРУЖЕНИЕ И ЛЕЧЕНИЕ
    Обнаружить данный вирус достаточно просто.  В области данных
вируса  есть  символьная  строка "(c) 1990 by SVC,Ver.  5.0", по
которой вирус, если он есть на диске, можно обнаружить с помощью
программ типа PC TOOLS.
    При   написании   антивирусной  программы  можно  предложить
следущую последовательность действий:
    1.  Для каждого проверяемого файла  определяется  время  его
создания.
    2.  Если  число  секунд  равно 60, то проверяются 3 байта по
смещению, pавному "длина  файла  минус  8АН". Если   они   равны
соответственно 35Н, 2ЕН, 30Н, то файл заражен.
    3.  Выполняется  декодирование  первых 24 байт оригинального
кода, которые расположены по смещению "длина файла  минус  01CFН
плюс  0BAAН".   Ключи  для декодирования расположены по смещению
"длина файла минус 01CFН плюс 0С1AН" и "длина файла минус  01CFН
плюс 0С1BН".  Процедура декодирования описана выше.
    4. Раскодированные байты переписываются в начало программы.
    5. Файл усекается до величины "длина файла - 0С1F".
    Изложенный   алгоритм  реализован  в  программе  ASVC50.EXE,
написанной на языке программирования TURBO-PASCAL 5.0  (исходный
текст в файле ASVC50.PAS).
    При таких действиях могут возникнуть "потерянные  кластеры",
от которых нужно избавиться.
ПРИМЕЧАНИЕ
    Мы не смогли определить, что происходит на зараженной машине
при возникновении INT 21H c АН, равным 83Н,  84Н,  поскольку  не
имеем  описания оных.  Вообще, с информацией по системе - полный
"КАРАУЛ !!".
И.А.Мигитко, А.В.Байков                                 20.06.91
  
 |