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