АНАЛИЗ ВИРУСА 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.
|