┌──┌─┐┌──
──┘├─┘──┘ 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