ZF

                     АНАЛИЗ ВИРУСА Nutcracker.AB2.6982.
                      Перепечатка из эл/журнала LMD N1
                           (c) 1997 SPS Group


----------------------------------
АНАЛИЗ ВИРУСА 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 в основной памяти.

    Для драйвера   инсталляция   вируса   в   память   имеет  некоторые
особенности.  В этом случае вирус  создает  свою  резидентную  копию  в
сегменте   6E0h: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 (AJ
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 (AJ
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.


(C) NF, 1998-2004