Virus.DOS.Zhengxi

Класс Virus
Платформа DOS
Описание

Technical Details

Семейство очень опасных полиморфик-стелс-вирусов. Имеют длину более 7K,
заражают EXE-, OBJ- и LIB-файлы, дописывают COM-дропперы в архивы ZIP, ARJ
и RAR, содержат строки:

Abnormal program termination
The Virus/DOS 0.54  Copyright (c) 1995 Zhengxi Ltd
Warning! This program for internal use only!

Вирусы семейства относятся к наиболее сложным из известных на сегодняшний
день. Они используют множество методов заражения файлов, сложный
полиморфик-механизм, двойную шифровку кода вируса и т.д. В вирусах
представлено множество идей из других вирусов, например, заражение
EXE-файлов в середину напоминает вирус «Lucretia», заражение OBJ-файлов —
«Shifter», заражение архивов — «Dementia», а полиморфик-механизм представляет собой улучшенный вариант SMEG engine.

Заражение памяти

Код вируса получает управление из различных точек в зависимости от
зараженного объекта. Если запускается зараженный EXE-файл (метод заражения
«appending», см. ниже) или COM-дроппер, вирус получает управление
непосредственно при выполнении зараженного файла (команда JMP_Virus в
начале COM-файла или CS:IP на вирус в заголовке EXE-файла). В EXE-файлах,
зараженных методом «inserting», вирус получает управление из своей
программы-загрузчика. В файлах, слинкованных с зараженными OBJ/LIB-файлами,
вирус получает управление командой CALL, которая может располагаться в
произвольном месте файла.
В любом из перечисленных выше случаев управление передается
полиморфик-расшифровщику, который состоит из двух основных циклов. Первый
цикл расшифровывает второй цикл и снимает первый уровень шифровки с кода
вируса, затем второй цикл восстанавливает код вируса в «чистом» виде и
передает управление инсталлятору. Инсталлятор перехватывает INT 1,
трассирует INT 21h и ищет в кодах INT 21h некоторую последовательность байт
(эти байты присутствуют в кодах обработчика INT 21h в DOS 5.x и DOS 6.x).
Если такой код найден, то вирус сохраняет его в своем теле и записывает
вместо него FAR CALL на адрес обработчика INT 25h (Absolute Disk Read).
Затем вирус сохраняет 5 байт обработчика INT 25h и записывает на их место
команду FAR JMP на свое тело. Результат выглядит примерно следующим образом:

INT 21h handler:
...              ...
+-------  2E FF 1F ????    CALL FAR  CS:Int25
|         C7 06            ????        ; magic word
| Int25:  ???? ????        ???? ????   ; far addr of INT 25h
|         ...              ...
|
+> INT 25h handler:
+-------- EA ???? ????     JMP FAR  VirusHandler
|         ...              ...
|
+> Virus handler:
2E 8F 06 ...     POP       CS:Caller_IP
...              ...

Таким образом, вирус использует одну и ту же подпрограмму для перехвата INT
21h и INT 25h. Для того чтобы разделить вызовы различных прерываний, он
анализирует адрес, откуда пришел вызов. Если вызов идет из обработчика INT
21h, то вирус передает управление своему обработчику INT 21h. В противном
случае управление передается вирусному обработчику INT 25h.
При заражении памяти вирус также проверяет несколько условий и не заражает
компьютер, если выполняется хотя бы одно из условий:

- компьютер работает под MS Windows
- загрузка производилась с дискеты (A: или B:)
- INT 8, 13h, 28h указывают на один сегмент (если в памяти антивирусный
монитор?)
- день создания зараженного файла близок к текущей дате (два старших
бита номера дня создания файла совпадают с двумя старшими битами
текущего дня)

При выделении памяти под свою TSR-копию вирус использует DOS-вызовы (ChMem
и AllocMem) и устанавливает себя в conventional-memory. Однако в дальнейшем
вирус может переместить себя в другие адреса памяти, включая UMB.
Затем вирус возвращает управление программе-носителю. Если это COM-дроппер,
то вирус выводит сообщение:

Abnormal program termination

и возвращает управление DOS. Если заражен EXE-файл (appending), то вирус
восстанавливает заготовок файла и передает управление по первоначальным
CS:IP. Если заражен EXE-файл (inserting) или OBJ/LIB-файл, вирус возвращает
управление прерванной подпрограмме.

Обработчик INT 21h

Вирус перехватывает 18 функций INT 21h:

3Dh, 6Ch - Open/Create File
3Eh      - Close File
3Fh      - Read File
42h      - Lseek
4Bh      - Execute File
41h      - Delete File
11h, 12h - FindFist/Next FCB
4Eh, 4Fh - FindFist/Next ASCII
00h, 4Ch - Terminate
31h      - Stay TSR
67h      - Set Handle Count
48h, 49h, 4Ah - Allocate/Free/Resize Memory

Функции Set Handle Count, Execute File и Allocate/Free/Resize Mem
используются вирусом для того, чтобы спрятать свой блок памяти. Вирус
корректирует MCB-блоки: «показывает» свой код непосредственно перед вызовом
функции и «сращивает» его с предыдущим блоком после вызова. В результате
блок памяти с кодом вируса виден только DOSом, а утилиты просмотра
системной памяти не видят его.
При вызовах функций Terminate, Stay TSR и FreeMem вирус перемещает себя по
другому адресу в памяти. При этом вирус копирует себя либо «поближе» к
программам DOS или в UMB.
При открытии файлов вирус выполняет несколько действий в зависимости от
режима открытия файла (ReadOnly или ReadWrite). Если на запись открывается
зараженый файл, то вирус лечит его. Перед лечением вирус проверяет имя
программы, которая открывает файл, и не лечит файл, если имя программы:
UUENCODE.EXE, PKLITE.EXE, LZEXE.EXE, NDD.EXE, DIET.EXE, AFD.EXE, SD.EXE,
SPEEDDSK.EXE, DEFRAG.EXE, TLINK.EXE, LINK.EXE
При открытии в режиме ReadOnly вирус выполняет действия, которые выглядят
как модификация кода какого-то антивируса: вирус проверяет код, откуда идет
вызов на открытие, и каким-то образом корректирует его. К счастью, в вирусе
в этом месте ошибка, и данная процедура не получает управление.
При открытии файлов также получает управление стелс-подпрограмма, которая
уменьшает длину файла в System File Table.
При чтении из файлов, при вызове команд LSeek, FindFirst/Next и перед
уничтожением файлов вирус также вызывает стелс-подпрограмму, которая либо
подставляет незараженный код файла, либо блокирует LSeek на код вируса,
либо уменьшает длины зараженных файлов, либо лечит удаляемый файл в
соответствии с вызванной функцией.
Вызовы FindFist/Next ASCII также используются вирусом для поиска файлов и
их последующего заражения. Вирус сохраняет имя файла, который обнаружен
командой FindFirst, и имя примерно каждого 5-го файла (с вероятностью 3/16)
при вызовах FindNext. Вирус сохраняет только одно имя, поэтому заражаетсся
последний файл, имя которого попадает в буфер.
Заражение файла, имя которого попало в буфер, происходит при закрытии файла
(этого или любого другого). Вирус с вероятностью 1/4 также заражает сам
закрываемый файл.

Заражение

Перед заражением вирус проверяет несколько условий:

- файл не должен быть создан только что (сравнивает номер дня создания
файла с текущей датой, так же, как и при заражении памяти)
- файл находится на локальном диске, и диск не флоппи (HD или Ramdrive)
- имя файла не является *.?V? (*.OVL ?)
- на диске имеется достаточно свободного места

Если все условия выполнены, то вирус считывает заголовок файла, проверяет
его формат и заражает EXE/OBJ/LIB-файлы и архивы.

Заражение EXE-файлов

Вирус заражает EXE-файлы тремя различными методами: «appending»,
«inserting» и заражение содержимого самораспаковывающихся
ZIP/ARJ/RAR-архивов (например, ZIP-архивы, созданные утилитой ZIP2EXE).
Сначала вирус проверяет EXE-файл на наличие архива и, если таковой
обнаружен, дописывает в архив COM-дроппер (см. ниже). Затем вирус проверяет
длину файла (заражает только файлы длиной более 1024 байт) и длину
загружаемого модуля. Если длина загружаемого модуля больше 32K, то вирус
заражает его методом «inserting», в противном случае — методом «appending».

Заражение EXE-файлов (Appending)

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

Заражение EXE-файлов (Inserting)

Если длина модуля больше 32K, то вирус ищет в модуле C/Pascal-процедуры и
записывает в них свой загрузчик. В результате код вируса получает
управление не непосредственно при запуске зараженного файла, а при вызове
этой процедуры. Причем эта подпрограмма может быть крайне редко выполняемой
(например, при выводе сообщения о какой-либо специфической ошибке). В
результате вирус может долгие годы «спать» внутри файла и вырваться на
свободу только при некоторых ограниченных условиях.
При заражении этим методом вирус считывает первые 6K загружаемого модуля
(сразу после EXE-заголовка) и ищет стандартные заголовки
C/Pascal-подпрограмм. Эти подпрограммы обычно начинаются с команд:

PUSH BP
MOV  BP,SP

Если такие команды найдены, то вирус сканирует следующие 54h байта на
наличие команд RET и CALL FAR. Если таковая команда найдена, то вирус не
заражает файл. Вирус делает это для того, чтобы не испортить код другой
подпрограммы или настраиваемый (relocated) адрес.
Затем вирус считывает 54h байта этой подпрограммы, записывает в нее код
своего загрузчика, шифрует свое тело и записывает в конец файла, после
этого он сохраняет в конце файла код подпрограммы и вторую часть кода
своего загрузчика (и то и другое шифруется командой SUB) и в заключение
дописывает блок случайных данных:

Перед заражением     Зараженный файл
----------------     ---------------
+--------------+     +--------------+
|Заголовок Exe |     |Заголовок Exe |
|--------------|     |--------------|
|Код EXE-файла |     |Код EXE-файла |
|--------------|     |--------------|
|C/Pascal subr |--+  |Код загрузчика| 52h байта, не зашифрованы
|--------------|  |  |--------------|
|              |  |  |Код EXE-файла |
|              |  |  |(продолжение) |
+--------------+  |  |--------------|
|  |Вирус         | зашифрован (полиморфик)
|  |--------------|
|  |Код загрузчика| часть 2, зашифрована SUB'ом
|  |--------------| 70h байт
+->|Код C/Pascal  | первоначальный код C/Pascal subr,
|--------------| 52h байта, зашифрованы SUB'ом
|Random data   |
+--------------+

Если код загрузчика получает управление, то он определяет имя
файла-носителя (используя PSP), считывает из файла и расшифровывает свое
продолжение, а затем передает на него управление. Продолжение загрузчика
восстанавливает код C/Pascal-подпрограммы, выделяет блок памяти
(conventional или UMB), считывает туда код вируса и передает на него управление.

Заражение архивов

При заражении архивов вирус создает в памяти зараженный COM-файл и
записывает его в архив. Такие COM-файлы начинаются с команды JMP на
расшифровщик вируса, затем идут случайные данные и зашифрованный код
вируса. Имя COM-файлов выбирается случайно, например:

HAIF.COM, UCM.COM, DOO.COM, VLG.COM

(реальные имена, полученные при экспериментах с вирусом)
При дописывании файлов в архив вирус не использует никаких внешних утилит,
а модифицирует служебные поля самостоятельно. Вирус также не пакует файл, а
записывает его «как есть» методом «stored». Не заражает архивы дважды.

Заражение OBJ- и LIB-файлов

При заражении объектных модулей вирус проверяет записи модуля, ищет записи
с кодом/данными (LEDATA), сканирует эти записи на наличие C/Pascal
подпрограмм (как и при заражении EXE-файлов методом «inserting»), замещает
C/Pascal-заголовок командой CALL NEAR и дописывает в LEDATA свой
зашифрованный код.
Как и при заражении EXE-файлов методом «inserting», вирус может долгое
время находиться «в спячке», прежде чем заразит компьютер.

Обработчик INT 25h

Данная процедура реализует стелс-механизм на уровне INT 25h: при чтении
сектора с заголовком зараженного файла вирус подставляет первоначальный
заголовок, а при просмотре секторов каталога вирус указывает длины файлов
до заражения.
Конечно же, реализован не 100%-ный стелс, и при некоторых условиях вирус
становится виден, однако во многих случаях он остается невидимым.

Проявление

При заражении ZIP-файлов вирус проверяет поля заголовков и, если обнаружена
запись «stored», и файл создан/модифицирован в 1996 году (или позже), вирус
аккуратно проходит все каталоги всех доступных дисков от C: до Z:, стирает
все обнаруженные файлы, а затем и каталоги.