┌──┌─┐┌──
──┘├─┘──┘ Presents
┐  ┌┐┐┌─┤ VMag, Issue 1, 1 June 1997
└─┘┘ ┘└─┘ ──────────────────────────

АНАЛИЗ ВИРУСА Nutcracker.AB2.6982.
----------------------------------


Сразу скажу, что существует достаточно большое количество вирусов
семейства Nutcracker.AB2. Однако я остановлюсь на последнем из из-
вестных в этой "блестящей когорте". Мой выбор представляется мне
вполне оправданным, т.к. эпидемия именно этого вируса наблюдалась
в БрПИ в декабре-феврале 1996-97 гг. Итак, добро пожаловать в мир
компьютерных инфекций... ;)


ОБЩЕЕ ОПИСАНИЕ.

Формально данный вирус является файлово-загрузочным, полиморфичес-
ким, резидентным, стелс-вирусом, поражающим файлы формата COM, EXE,
драйверы (SYS, BIN), а также Главную Загрузочную Запись (MBR) вин-
честера и Загрузочную Запись (BOOT-сектор) дискет. Вирус является
полиморфным как в файлах, так и в загрузчиках. По информации Е.В.
Касперского вирус является вторым по сложности в мире.


ФАЙЛОВАЯ КОМПОНЕНТА.

При загрузке пораженного файла первоначально управление передается
на первую полиморфную подпрограмму-расшифровщик. Эта подпрограмма
выполняет дешифровку следующей подпрограммы, находящейся "выше" в
памяти и передает на нее управление. Та, получив управление, про-
делывает соответствующую операцию со следующей подпрограммой и
т.д. Последняя подпрограмма декодирует вирусный код вместе
с полиморфной подпрограммой декодировки основного тела вируса и
передает на нее управление. Данная подпрограмма декодирует основ-
ное вирусное тело, исходя из значения первого байта векторов 01
(трассировка) или 03 (точка останова). В нормальной ситуации (т.е.
вне отладчика) данные вектора содержат одну единственную команду
IRET (код 0CFh). Однако, в некоторых случаях, начальное значение
может и не учитываться, в частности, при использовании для деко-
дировки команд NOT,NEG,ROL,ROR.

Пример полиморфной подпрограммы из цепочки декодировщиков (1):

2A7A:4BE6 3E            DS:                    ; мусор
2A7A:4BE7 8CD9          MOV     CX,DS          ;
2A7A:4BE9 49            DEC     CX             ;
2A7A:4BEA 02BF3106      ADD     BH,[BX+0631]   ;
2A7A:4BEE 840B          TEST    CL,[BP+DI]     ;
2A7A:4BF0 8D2EB800      LEA     BP,[00B8]      ; длина декодирумой подпрограммы
2A7A:4BF4 89E9          MOV     CX,BP          ; пересылаем в р-р счетчика
2A7A:4BF6 54            PUSH    SP             ; мусор
2A7A:4BF7 3A2A          CMP     CH,[BP+SI]     ;
2A7A:4BF9 44            INC     SP             ;
2A7A:4BFA 44            INC     SP             ;
2A7A:4BFB E300          JCXZ    4BFD           ;
2A7A:4BFD 8D3E294B      LEA     DI,[4B29]      ; смещение декодирумой подпрограммы
2A7A:4C01 8CD6          MOV     SI,SS          ; мусор
2A7A:4C03 57            PUSH    DI             ; запоминаем смещение в стеке
2A7A:4C04 0A734F        OR      DH,[BP+DI+4F]  ; мусор
2A7A:4C07 D2CF          ROR     BH,CL          ;
2A7A:4C09 B0CD          MOV     AL,CD          ; маска для декодировки
2A7A:4C0B 0295D2FB      ADD     DL,[DI+FBD2]   ; мусор
2A7A:4C0F FFC6          INC     SI             ;
2A7A:4C11 8CCE          MOV     SI,CS          ;
2A7A:4C13 F8            CLC                    ; CF=0
2A7A:4C14 1805          SBB     [DI],AL        ; декодируем байт
2A7A:4C16 8A7178        MOV     DH,[BX+DI+78]  ; мусор
2A7A:4C19 7C01          JL      4C1C           ;
2A7A:4C1B 43            INC     BX             ;
2A7A:4C1C F6D0          NOT     AL             ; изменяем маску
2A7A:4C1E 2A5F85        SUB     BL,[BX-7B]     ;
2A7A:4C21 F8            CLC                    ; CF=0
2A7A:4C22 F5            CMC                    ; CF=1
2A7A:4C23 1805          SBB     [DI],AL        ; декодируем байт
2A7A:4C25 7B03          JPO     4C2A           ; мусор
2A7A:4C27 D0DF          RCR     BH,1           ;
2A7A:4C29 FB            STI                    ;
2A7A:4C2A D0C0          ROL     AL,1           ; изменяем маску
2A7A:4C2C 9F            LAHF                   ; мусор
2A7A:4C2D 0005          ADD     [DI],AL        ; декодируем байт
2A7A:4C2F F7DD          NEG     BP             ; мусор
2A7A:4C31 51            PUSH    CX             ;
2A7A:4C32 8D5855        LEA     BX,[BX+SI+55]  ;
2A7A:4C35 44            INC     SP             ;
2A7A:4C36 44            INC     SP             ;
2A7A:4C37 D3CB          ROR     BX,CL          ;
2A7A:4C39 2805          SUB     [DI],AL        ; декодируем байт
2A7A:4C3B 3217          XOR     DL,[BX]        ; мусор
2A7A:4C3D F8            CLC                    ; CF=0
2A7A:4C3E 1005          ADC     [DI],AL        ; декодируем байт
2A7A:4C40 0E            PUSH    CS             ; мусор
2A7A:4C41 83C402        ADD     SP,+02         ;
2A7A:4C44 347F          XOR     AL,7F          ; изменяем маску
2A7A:4C46 8DB39217      LEA     SI,[BP+DI+1792] ; мусор
2A7A:4C4A 3ABBA802      CMP     BH,[BP+DI+02A8] ;
2A7A:4C4E 7D00          JGE     4C50           ;
2A7A:4C50 24C2          AND     AL,C2          ; изменяем маску
2A7A:4C52 47            INC     DI             ; берем следующий байт
2A7A:4C53 49            DEC     CX             ; уменьшаем счетчик
2A7A:4C54 75B9          JNZ     4C0F           ; если декодировано не все, перйти
2A7A:4C56 F7D6          NOT     SI             ; мусор
2A7A:4C58 26            ES:                    ;
2A7A:4C59 847605        TEST    DH,[BP+05]     ;
2A7A:4C5C 56            PUSH    SI             ;
2A7A:4C5D 81F573BB      XOR     BP,BB73        ;
2A7A:4C61 83C402        ADD     SP,+02         ;
2A7A:4C64 D3E2          SHL     DX,CL          ;
2A7A:4C66 0228          ADD     CH,[BX+SI]     ;
2A7A:4C68 22A640C8      AND     AH,[BP+C840]   ;
2A7A:4C6C 5B            POP     BX             ; выталкиваем из стека смещение след. подпрограммы
2A7A:4C6D FFE3          JMP     BX             ; передаем на нее управление

Пример полиморфной подпрограммы из цепочки декодировщиков (2):

2A54:4BF9 1C74          SBB     AL,74          ; мусор
2A54:4BFB 52            PUSH    DX             ;
2A54:4BFC 5D            POP     BP             ;
2A54:4BFD 045D          ADD     AL,5D          ;
2A54:4BFF 7C00          JL      4C01           ;
2A54:4C01 2D3F1B        SUB     AX,1B3F        ;
2A54:4C04 8D0EDB00      LEA     CX,[00DB]      ; длина декодируемой подпрограммы
2A54:4C08 221C          AND     BL,[SI]        ; мусор
2A54:4C0A BF1B4B        MOV     DI,4B1B        ; смещение декодирумой подпрограммы
2A54:4C0D 9E            SAHF                   ; мусор
2A54:4C0E 91            XCHG    CX,AX          ;
2A54:4C0F 91            XCHG    CX,AX          ;
2A54:4C10 57            PUSH    DI             ; запоминаем значение смещение в стеке
2A54:4C11 81EDB649      SUB     BP,49B6        ; мусор
2A54:4C15 45            INC     BP             ;
2A54:4C16 B055          MOV     AL,55          ; начальное значение маски декодировки
2A54:4C18 80EBB2        SUB     BL,B2          ; мусор
2A54:4C1B D1ED          SHR     BP,1           ;
2A54:4C1D 1A27          SBB     AH,[BX]        ;
2A54:4C1F 2805          SUB     [DI],AL        ; декодируем байт
2A54:4C21 AE            SCASB                  ; берем следующий
2A54:4C22 49            DEC     CX             ; это все?
2A54:4C23 75F6          JNZ     4C1B           ; нет - декодировать следующий
2A54:4C25 8CD0          MOV     AX,SS          ; мусор
2A54:4C27 81DEC1B2      SBB     SI,B2C1        ;
2A54:4C2B 2F            DAS                    ;
2A54:4C2C 7B00          JPO     4C2E           ;
2A54:4C2E 7000          JO      4C30           ;
2A54:4C30 93            XCHG    BX,AX          ;
2A54:4C31 80F63A        XOR     DH,3A          ;
2A54:4C34 7F00          JG      4C36           ;
2A54:4C36 5D            POP     BP             ; выталкиваем из стека смещение след. подпрограммы
2A54:4C37 FFE5          JMP     BP             ; передаем на нее управление

Следует отметить, что инструкции, непосредственно декодирующие подпрограммы
являются лишь SUB/SBB/ADD/ADC. Однако список операций над маской куда более
разнообразен: INC/DEC/SUB/ADD/XOR/NOT/NEG/ROL/ROR/SHR/SHL/OR/AND. В качестве
регистров адресации могут использоваться SI/DI/BX. Типы адресации могут быть:
[BaseRegister], [BaseRegister+XX], [BaseRegister+XXXX]. Различны также и спо-
собы передачи управления: JMP WordRegister/RETN/RETN 0000/RETF/RETF 0000/IRET.


Пример полиморфной подпрограммы декодировки основного тела (1):

2A54:0100 38EC          CMP     AH,CH          ; \
2A54:0102 FFC3          INC     BX             ;  - мусорные инструкции
2A54:0104 383A          CMP     [BP+SI],BH     ; /
2A54:0106 8D1E0000      LEA     BX,[0000]      ; BX=0
2A54:010A 53            PUSH    BX
2A54:010B 07            POP     ES             ; ES=0
2A54:010C 26            ES:
2A54:010D C5770C        LDS     SI,[BX+0C]     ; берем адрес Int 03h
2A54:0110 FA            CLI                    ; запрещаем прерывания
2A54:0111 3E            DS:                    ; мусорная инструкция
2A54:0112 8A04          MOV     AL,[SI]        ; получаем в AL значение первого байта Int 03h
2A54:0114 B9D91B        MOV     CX,1BD9        ; длина декодируемого участка
2A54:0117 BE9E52        MOV     SI,529E        ; относительное смещение участка
2A54:011A 2E            CS:
2A54:011B F6949AAD      NOT     BYTE PTR [SI+AD9A]   ;декодируем байт
2A54:011F 80E0F9        AND     AL,F9          ; изменяем маску (в данном случае не используется)
2A54:0122 46            INC     SI             ; берем следующий байт
2A54:0123 E2F5          LOOP    011A
2A54:0125 F6D4          NOT     AH             ;
2A54:0127 8A2E3B6D      MOV     CH,[6D3B]      ;
2A54:012B F602BF        TEST    BYTE PTR [BP+SI],BF  ;
2A54:012E 2251AD        AND     DL,[BX+DI-53]  ;
2A54:0131 F7D9          NEG     CX             ;  мусорные инструкции
2A54:0133 227A94        AND     BH,[BP+SI-6C]  ;
2A54:0136 A6            CMPSB                  ;
2A54:0137 47            INC     DI             ;
2A54:0138 ??            Основное тело вируса

Пример полиморфной подпрограммы декодировки основного тела (2):

2A5E:0100 86E7          XCHG    AH,BH          ; мусор
2A5E:0102 3270C4        XOR     DH,[BX+SI-3C]  ; мусор
2A5E:0105 31C0          XOR     AX,AX          ; AX=0
2A5E:0107 50            PUSH    AX
2A5E:0108 07            POP     ES             ; ES=0
2A5E:0109 26            ES:
2A5E:010A C4360C00      LES     SI,[0004]      ; получить адрес Int 01h
2A5E:010E 26            ES:
2A5E:010F 8A3C          MOV     BH,[SI]        ; значение первого байта вектора Int 01h
2A5E:0111 8D0E191B      LEA     CX,[1B19]      ; длина декодируемого участка
2A5E:0115 BFEA03        MOV     DI,03EA        ; относительное смещение
2A5E:0118 FA            CLI                    ; запретить прерывания
2A5E:0119 F6D7          NOT     BH             ; обратить маску
2A5E:011B 2E            CS:
2A5E:011C 283D          SUB     [DI],BH        ; декодировать байт
2A5E:011E 83EFFF        SUB     DI,-01         ; взять следующий
2A5E:0121 81E90100      SUB     CX,0001        ; счетчик исчерпан ?
2A5E:0125 75F2          JNZ     0119           ; нет - декодировать следующий байт
2A5E:0127 84B80050      TEST    BH,[BX+SI+5000]  ;
2A5E:012B 8CD1          MOV     CX,SS          ;
2A5E:012D F6475CC2      TEST    BYTE PTR [BX+5C],C2 ;
2A5E:0131 81CB536C      OR      BX,6C53        ;
2A5E:0135 95            XCHG    BP,AX          ;  мусор
2A5E:0136 FA            CLI                    ;
2A5E:0137 FA            CLI                    ;
2A5E:0138 ??            Основное вирусное тело

После декодировки вирус определяет, в каком файле он находится и инсталлирует-
ся на винчестер и (возможно) в память. Вирус производит следующую последова-
тельность действий:

   1) инсталляция на винчестер (полиморфное заражение MBR);

Вирус получает адрес дискового драйвера Fn=13h (Int 2Fh) и в дальнейшем вы-
зывает Int 13h через полученный адрес. Это позволяет обходить некоторые за-
щиты винчестера от записи (ADM-подобные). Тело вируса размещается в последних
14-ти секторах первой дорожки первого винчестера. Первоначально тело записывает-
ся в незашифрованном виде. Вирус предварительно проверяет, начинается ли ка-
кой-либо из разделов на первой дорожке и, если начинается, то инфицирования
MBR не происходит. В MBR вирус записывает полиморфную подпрограмму загрузки
основного кода вируса. Она внедряется внутрь оригинального MBR-кода (при на-
хождении команды CLD в первых 45-ти байтах оригинального MBR, начиная с ее
адреса) или в начало MBR-кода. Предварительно вирус проверяет первую команду
кода на ее соответствие JMP SHORT, JMP NEAR, CALL NEAR и получает точку вхо-
да в код MBR.

   2) при невозможности поразить MBR вирус обрезает текущий MCB и остается
      резидентно в памяти, перехватывая Int 13h и Int 21h. В этом случае
      будут поражаться все файлы на всех дисках.

      Инсталляция в память из файла.

Первоначально вирус пытается выделить себе блок в UMB или в основной памяти.
При неудаче (отсутствии свободного блока подходящей длины) вирус обрезает
текущий MCB (MCB программы) на необходимую величину, а затем обычным образом
выделяет себе блок памяти и создает там резидентную копию. В поле владельца
MCB вирус ставит 0008 (принадлежит DOS). После этого происходит перехват век-
торов прерываний 13h, 21h. Для этого вирус формирует два прямых длинных перехода
(JMP FAR) по адресам 0:4F6h (Int 13h) и 0:4FBh (Int 21h) на собственные обра-
ботчики прерываний Int 13h и Int 21h, а в таблицу прерываний заносит ссылки на
соответствующие JMP FAR. Следует отметить, что сегмент и смещение векторов пре-
рываний вычисляются вирусом каждый раз по-новому, но таким образом, чтобы фи-
зический адрес всегда указывал на 0:4F6h и 0:4FBh соотвественно. В дальнейшем
вирус старается переместить себя в UMB или ближе к резидентной части DOS в
основной памяти.
Для драйвера инсталляция вируса в память имеет некоторые особенности. В этом
случае вирус создает свою резидентную копию в сегменте 6E00h:0000. И перехва-
тывает Int 13h/21h указанным выше способом. В дальнейшем, при запуске первой
программы через Fn=4b00h/Int 21h вирус выделяет себе память и переносит ак-
тивную копию в этот выделенный сегмент.

   3) производится запуск программы.

Запуск COM и EXE, приведенной вирусом к формату COM, программы производится
следующим образом. Т.к. вирус находится в середине программы, то первым делом
он создает свою копию в конце сегмента программы. При отсутвии достаточного
кол-ва места для копии вирус прерывает ее выполнение (INT 20h). По создании
копии, ей передается управление. Эта копия производит все необходимые действия
по инсталляции вируса на винчестер (и, возможно, в память), а затем:

- восстанавливаются первые 3 байта программы;
- декодируется сохраненный участок программного кода;
- этот участок переносится на место вируса в программе (программа восстанавли-
  вается в памяти);
- если загружаемый модуль - EXE, то выполняется настройка relocation table и
  программа переносится "под" PSP (затирается EXE Header и relocation table);
- выполняется настройка всех регистров в соответствии со значениями, переда-
  ваемыми DOS;
- управление передается орригинальному коду программы.

При наличии в памяти активной резидентной копии запуск программы производится
ею. В этом случае временная рабочая копия не создается.

Запуск EXE программы, инфицированной способом замены точки входа в заголовке
производится следующим образом:

- производится настройка CS:IP, SS:SP в соотвествии с сохраненными значениями;
- выполняется настройка всех регистров в соответствии со значениями, переда-
  ваемыми DOS;
- управление передается орригинальному коду программы.

Запуск драйвера (SYS/BIN):

- восстанавливается оригинальный адрес программы стратегий драйвера;
- декодируется сохраненный участок программного кода;
- этот участок переносится на место вируса в программе (программа восстанавли-
  вается в памяти);
- восстанавливаются значения всех регистров, сохраненных на входе в цепочку
  полиморфных декодировщиков;
- управление передается на оригинальную программу стратегий драйвера.


ЗАГРУЗОЧНАЯ КОМПОНЕНТА.

При загрузке вируса с дискеты первоначально управление получает полиморф-
ный вирусный загрузчик, находящийся в BOOT-секторе дискеты.

Пример полиморфного загрузчика для дискеты (1):

2B3E:013E 29C9          SUB     CX,CX         ; CX=0
2B3E:0140 F8            CLC                   ; мусор
2B3E:0141 8ED1          MOV     SS,CX         ; SS=0
2B3E:0143 BC007A        MOV     SP,7A00       ; SP=7A00h
2B3E:0146 1AE9          SBB     CH,CL         ; мусор
2B3E:0148 30E4          XOR     AH,AH         ; AH=0
2B3E:014A CD13          INT     13            ; сбросить диск
2B3E:014C 8EC4          MOV     ES,SP         ; ES=7A00h
2B3E:014E 8D1E0000      LEA     BX,[0000]     ; BX=0
2B3E:0152 FD            STD                   ; мусор
2B3E:0153 8D160000      LEA     DX,[0000]     ; головка=0/устройство=0 (A:)
2B3E:0157 90            NOP                   ; мусор
2B3E:0158 B9C250        MOV     CX,50C2       ; трек=80/сектор=194
2B3E:015B F8            CLC                   ; мусор
2B3E:015C 8D060E02      LEA     AX,[020E]     ; функция=2 (чтение)/кол-во секторов=14
2B3E:0160 3E            DS:                   ; мусор
2B3E:0161 CD13          INT     13            ; прочитать тело
2B3E:0163 F5            CMC                   ; обратить CF
2B3E:0164 73E2          JNB     0148          ; при ошибке, повторить операцию
2B3E:0166 80E895        SUB     AL,95         ; мусор
2B3E:0169 F6D4          NOT     AH            ; мусор
2B3E:016B 06            PUSH    ES            ; занести в стек сегмент
2B3E:016C 8D165600      LEA     DX,[0056]     ; смещение для передачи упр-ия на код
2B3E:0170 52            PUSH    DX            ; занести в стек смещение
2B3E:0171 CB            RETF                  ; передать управление на основной код

Пример полиморфного загрузчика для дискеты (2):

2B3E:013E 31ED          XOR     BP,BP         ; BP=0
2B3E:0140 2E            CS:                   ; мусор
2B3E:0141 55            PUSH    BP
2B3E:0142 17            POP     SS            ; SS=0
2B3E:0143 BC0071        MOV     SP,7100       ; SP=7100h
2B3E:0146 26            ES:                   ; мусор
2B3E:0147 28E4          SUB     AH,AH         ; AH=0
2B3E:0149 CD13          INT     13            ; сбросить диск
2B3E:014B FD            STD                   ; мусор
2B3E:014C 8EC4          MOV     ES,SP         ; ES=7100h
2B3E:014E F8            CLC                   ; мусор
2B3E:014F 8D160000      LEA     DX,[0000]     ; головка=0/устройство=0 (A:)
2B3E:0153 B98D50        MOV     CX,508D       ; трек=80/сектор=141
2B3E:0156 26            ES:                   ; мусор
2B3E:0157 26            ES:                   ; мусор
2B3E:0158 B80E02        MOV     AX,020E       ; функция=2 (чтение)/кол-во секторов=14
2B3E:015B FA            CLI                   ; мусор
2B3E:015C BB0000        MOV     BX,0000       ; BX=0
2B3E:015F 36            SS:                   ; мусор
2B3E:0160 CD13          INT     13            ; читать тело
2B3E:0162 72E2          JB      0146          ; при ошибке, повторить
2B3E:0164 EA431B0071    JMP     7100:1B43     ; передать управление на основной код

Этот загрузчик производит подгрузку основного вирусного кода, находящегося
на нестандартно отформатированной инженерной дорожке дискеты и передает на
него управление. Получив управление, основной вирусный код восстанавливает
в памяти код BOOT-загрузчика в его оригинальном виде и производит свою ин-
сталляцию на винчестер. При ошибке инсталляции (нет винчестера, ошибка за-
писи...) вирус переключается в файловый режим работы (т.е. вирусом будут
порадаться файлы на всех дисках). В противном случае вирус будет поражать
файлы только на дискетах (в том числе и при копировании) и сетевых дисках.
Затем вирус перехватывает прерывание Int 13h и отдает управление оригиналь-
ному BOOT-сектору. В процессе обработки Int 13h вирус анализирует значение
сегмента вектора Int 21h и, когда оно становится меньше 0800h (т.е. DOS уже
загружена), перехватывает Int 21h.

Загрузка вируса с винчестера имеет некоторые особенности:

- если загрузка первая (т.е. вирус записан в незашифрованном виде), то
  вирус генерирует полиморфный декодировщик о шифрует свой код. Причем в
  качестве начальной маски для декодировки используется значение первого
  байта из обработчика BIOS Int 01h или Int 03h. Однако это значение мо-
  жет и не использоваться (при дешифрующих инчтрукциях NEG/NOT/ROR/ROL).
  Ввиду того, что при загрузке DOS эти вектора устанавливаются жестко на
  IRET без сохранения старого значениея адреса, расшифровать основной код
  вируса из-под DOS не представляется возможным!
  После вирус перезаписывает свой зашифрованный код поверх незашифрованного.
- далее вирус производит действия, аналогичные работе в режиме загрузки из
  BOOT дискеты (только не производится попытка инфицирования винчестера).


STEALTH КОМПОНЕНТА.

Находясь в памяти, вирус предпринимает следующие действия по сокрытию своего
присутствия на компьютере:

- при чтении секторов, содержащих вирусное тело с первого трека винчестера
  вирус подставляет в буфер чтения нули;
- при чтении инфицированной MBR вирус подставляет в памяти неинфицированный
  образ;
- при попытке записи, форматирования, длинной записи секторов инфицированной
  MBR или секторов вирусного тела вирус заменяет эти операции на операцию
  "сброс диска", т.о. выполнение этих операций блокируется;
- при попытке получить длину инфицированного файла через вызовы функции Find
  First/Find Next или Find First via FCB/Find Next via FCB, вирус подставляет
  в буфер оригинальную длину файла. Приращение файла при заражении вирус хра-
  нит в последних двух байтах инфицированного файла.


ПЕРЕМЕЩЕНИЕ АКТИВНОЙ КОПИИ В ПАМЯТИ.

Для затруднения своего обнаружения в памяти вирусом используется перемещение
активной копии в памяти. Для этого вирусом отслеживается выполнение DOS Fn=
4B00h (Exec) и :

- т.к. перед загрузкой файла под него освобождается память, вирус пытается
  выделить блок памяти необходимой длины (возможно, в UMB);
- если блок выделен успешно, то вирусом проверяется номер сегмента выделен-
  ного блока и вирус переносит свою копию в данный сегмент в случае, если:
  a) текущий сегмент находится в основной памяти, а выделенный в UMB;
  b) текущий сегмент в основной памяти находится в старших адресах по отно-
     шению к выделенному;
  c) текущий сегмент в UMB находится в старших адресах по отношению к выде-
     ленному.
  Если же ни одно из этих условий не выполняется, то вирус освобождает вы-
  деленный блок и остается в текущем.
- после перенесения тела в новый блок памяти вирус корректирует сегментные
  адреса в JMP FAR на обработчики прерываний.


ИНФИЦИРОВАНИЕ ФАЙЛОВ.

Инфицирование файлов происходит при запуске, переименовании, открытии,
создании. При заражении вирус определяет кол-во свободного места на диске
с поражаемым файлом и не инфицирует последний, если места недостаточно.
Перед заражением вирус отключает режим верификации, сбрасывает у файла
атрибуты. Файлы с атрибутом "системный" вирусом не заражаются. Вирус ин-
фицрует COM,SYS,BIN и некоторые EXE файлы методом внедрения в середину,
а основную массу EXE методом записи в конец и изменения точки входа.
Методом внедрения в середину поражаются только те EXE файлы, размер ко-
торых менее 50K, и имеющих смещение relocation table < 40h (т.е не Win-
файлы), в этом случае вирус приводит его к формату COM файла, т.е. встав-
ляет команду JMP или CALL NEAR в его начало.

Метод внедрения в середину:

- вирус генерирует случайное число в диапазоне и, в зависимости от него,
  считывает блок из произвольного места файла. Длина блока может колеба-
  ться в диапазоне 6982...7236 байт;
- после этого он шифрует данный блок по определенному закону с помощью
  двух случайных масок и записывает зашифрованный блок в конец файла;
- далее вирус шифрует копию собственного тела и записывает ее на место
  считанного участка;
- последовательно генерируется цепочка декрипторов, которые записываются
  в конец файла;
- в начало файла записывается команда JMP или CALL NEAR на последний ниж-
  ний декриптор (лежащий ближе к концу файла).

Метод внедрения в конец EXE - файлов:

- вирус шифрует копию своего тела в памяти и дописывает ее к концу файла;
- последовательно генерируется цепочка декрипторов, которые записываются
  в конец файла;
- значение CS устанавливается на вирусный сегмент, IP на нижний декодиров-
  щик. Значения SS:SP также устанавливаются таким образом, чтобы не испор-
  тить вирусный код.

EXE файлы, размер которых в файле отличается от размера модуля более, чем
на 511 байт (длина неполной последней страницы) не заражаются.
В конец файла дописываются два байта приращения длины.
Признак заражения файла устанавливается в поле секунд и вычисляется в за-
висимости от значения даты и времени создания файла, причем с вероятностью
1/29 признак в значение секунд не выставляется, т.е. такой файл может быть
инфицирован вирусом повторно.
При работе с файлами вирусом перехватываются прерывания: Int 23h (Ctrl/Break)-
IRET, Int 24h (I/O error), Int 2Ah (Microsoft Network) - IRET. На время ра-
боты через функции DOS вирус устанавливает Int 3 (Break Point) на адрес об-
работчика Int 21h и вызывает Int 21h через Int 3.
Вирусом также перехватывается DOS функция 5701h (Set File Data/Time) и, при
попытке изменить время, содержащее признак инфицированности в поле секунд,
вирус устанавливает признак в соответствии с новым значением.


ИНФИЦИРОВАНИЕ ДИСКЕТ.

Вирус, перехватывая Int 13h, отслеживает обращение по чтению BOOT-сектора
диска A: и B: и (после его чтения):

- проверяет в BOOT признак инфицированности и, если BOOT уже инфицирован,
  дальнейшие действия игнорируются;
- если секторов не треке менее, чем 14, BOOT не заражается;
- ищет точку входа в загрузочный код (по адресу JMP SHORT,JMP NEAR,CALL
  NEAR);
- если переход производится слишком "далеко" по коду, то BOOT не инфици-
  руется;
- вирус записывает MBR на дискету (проверка защиты от записи);
- если запись прошла успешно, то вирус вычисляет номер инженерного цилиндра
  и нестандартно форматирует его (случайно задается номер начального сектора);
- вирус записывает свое тело на инж. трек, внедряет в BOOT свой полиморфный
  загрузчик и записывает загрузчик на дискету.


ПОЛИМОРФНЫЕ ГЕНЕРАТОРЫ.

В вирусе содержится три полиморфных генератора (или три подпрограммы гене-
рации полиморфного кода):

- генератор полиморфной подпрограммы дешифровки основного кода вируса;
- генератор полиморфного загрузчика (для MBR и BOOT);
- генератор цепочки полиморфных декодировщиков для файлов.

В виду достаточной сложности и громоздкости алгоритмов детальное описание
данных генераторов мною опускается. Если данный вопрос Вас заинтересовал,
рекомендую обратиться к дизассемблированию непосредственно вирусного кода.


ШИФРОВАНИЕ КАТАЛОГОВ.

Для затруднения излечения вирус, находясь в загрузочном режиме работы (т.е.
загрузка вируса происходит из MBR) шифрует первые сектора директорий вин-
честера. В качестве начальной маски шифрования используется время создания
данной директории, в качестве вторичной (маски коррекции) - значение смеще-
ния BIOS Int 00h. Данное значение на винчестер не записывается и получить
его в DOS невозможно, т.к. вектор Int 00h устанавливается при загрузке DOS
жестко на DOS-обработчик без сохранения BIOS-адреса. В виду этого, загрузив-
шись с чистой системной дискеты декодировать каталоги не представляется воз-
можным. Шифрование происходит следующим образом:

- после операции чтения или записи секторов на диск вирус ищет в буфере сиг-
  натуру, соответствующую началу директории и, если таковая найдена, прове-
  ряет: зашифрован ли данный сектор, если сектор незашифрован, то вирус шиф-
  рует и пишет его не диск;
- далее вирус дешифрует зашифрованные сектора в буфере.


БОРЬБА С АНТИВИРУСАМИ.

Вирусом отслеживаются и не инфицируются файлы со следующими именами:
SCAN,CLEAN,VSAFE,NAV,AVP,AIDS,GUARD,NOD,F-PROT,DESINF,VIRSTOP,VSH,
FINDVIRU,VIVERIFY,TB,RKSD,COMMAND,SETVER,WEB,DRWEB.

Вирусом удаляются следующие файлы при попытке доступа к ним:
CHKLIST  - файл контрольных сумм VSAFE.
ADINF    - антивирус-ревизор.
SMARTCHK - ???.
ANTI-VIR - файл контрольных сумм TBSCAN.
А также файлы с расширением ░░░ - стандартное расширение таблиц ADinf.

На время работы приведенных файлов вирусом отключается Stealth-режим:
CHKDSK,PKZIP,PKLITE,WEB,DRWEB.


РАБОТА В СЕТИ NOVELL.

Для функционирования в локальной сети Novell вирусом принимается ряд мер:

- если запускаемый на выполнение файл имеет имя NET?, EMSNEXT, XMSNET,
  (сетевые драйверы) то вирус восстанавливает прерывание Int 21h, сох-
  раненное в его обработчике;
- вирус производит загрузку и выполнение файла;
- после этого вирус снова перехватывает Int 21h и запоминает в своем теле
  значение Int 21h, указывающее на резидентную порцию сетевого драйвера.
  Т.е. вирус "видит" сетевые диски.


ДЕСТРУКТИВНАЯ КОМПОНЕНТА.

Деструктивная ветка вируса получает управление только при загрузке в пора-
женного винчестера или дискеты и только по 12-м января каждого года. При
выполнении данных условий вирус отключает клавиатуру и форматирует по 16ть
сторон на каждом цилиндре всех винчестерских дисков, установленных на ком-
пьютере. Причем форматирование идет не последовательно диск за диском, а
"параллельно", т.е. сначала форматируется один цилиндр на первом диске, за-
тем на втором и т.д., затем второй цилиндр на первом и т.д.

                    Nice // SPS06.
                    ■ 2:454/7.64@FidoNet