Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29200
Скачиваний: 1689
Глава 31. Обзор дополнительных возможностей оболочки
299
реализовать какой-нибудь алгоритм редактирования файлов. Это будет для вас
очень хорошей практикой применения ассемблера.
Для чего мы привели именно этот алгоритм? Дело в том, что в главе 32 мы рас-
смотрим таблицу размещения файлов. Принцип хранения очередной порции (оче-
редного сектора) практически полностью совпадает с данным алгоритмом.
31.2. Антивирусные возможности оболочки
31.2.1. Как защитить компьютер
от заражения его резидентными вирусами
Любой резидентный вирус в определенный момент должен перехватывать неко-
торые прерывания для своей активизации. Как правило, перехватываются следую-
щие прерывания:
21h
— сервис DOS,
1Ch
— таймер, вызываемый автоматически
приблизительно 18,2 раза в секунду,
13h
— работа с дисками средствами BIOS,
25h
и
26h
— работа с дисками средствами DOS. Если вирус не перехватит ни одно пре-
рывание, то он так и останется в памяти, но активизироваться не будет, а следова-
тельно, и ничего сделать не сможет. Вспомните все резидентные программы из
книги, которые мы рассматривали. Каждый резидент в обязательном порядке пере-
хватывал то или иное прерывание.
Возникает вопрос: можно ли сделать так, чтобы вирус не смог перехватить ни
одно прерывание?
Один из самых надежных способов защиты от резидентных вирусов заключает-
ся в следующем. Пишется простой резидент, который сразу после загрузки считы-
вает в свой буфер текущее состояние таблицы векторов прерываний при помощи
команды
movs
или подобной ей. Как известно, таблица располагается по адресу
0000:0000h
и занимает 256 (количество векторов прерываний) 4 (сегмент + сме-
щение вектора) = 1024 байта. Резидент также следит за тем, вызывает ли какая-
нибудь программа функцию
4Bh
прерывания
21h
— загрузка и запуск программы.
Ее может вызвать, например, Norton Commander, который запускает программу по
требованию пользователя. Если так, то после того, как запущенная программа от-
работает, резидент копирует сохраненную таблицу из своего буфера в таблицу век-
торов прерываний. Таким образом, если какая-либо программа, в том числе и рези-
дентный вирус, перехватила некоторое прерывание, то наш резидент "вырубит" его
вызов. Получится, что вирус и находится в памяти, но не может активизироваться.
Этот способ имеет два недостатка:
пока работает запущенная зараженная программа, вирус находится в памяти
и уже может заражать другие файлы;
если запускается обычный резидент, то наша программа также "отсечет" его,
вследствие чего загруженный резидент также не сможет активизироваться.
Эти недостатки можно исключить, усовершенствовав наш резидент. Например,
его можно включить в собственную оболочку, а в ней самой организовать возмож-
ность переключения опции сохранения/восстановления таблицы векторов преры-
Часть III. Файловая оболочка, вирус, резидент
300
ваний после каждого запуска программы. Ведь перед запуском программ часть лю-
бой файловой оболочки так или иначе остается в памяти. Если пользователь не
уверен, что запускаемый файл "чистый", он может установить опцию сохранения
и восстановления таблицы векторов прерываний путем простого нажатия комбина-
ции некоторых клавиш. И наоборот.
Более того, программа-резидент или оболочка могут получить количество сво-
бодной памяти перед запуском программы, и, как только она отработала, прове-
рить, изменился ли объем основной памяти или нет. Если уменьшился, значит,
в памяти осталась какая-то программа, о чем следует немедленно сообщить поль-
зователю.
Здесь стоит отметить, что не все резидентные вирусы уменьшают объем сво-
бодной памяти. Некоторые из них располагаются в специальных областях либо
"обманывают" ОС, не уменьшая память. Но ни один резидентный вирус не сможет
запретить нашей программе-резиденту восстановить предварительно сохраненную
таблицу векторов прерываний. Кроме случаев, когда разработчик вируса знал о
существовании нашей программы и специально разработал процедуру против на-
шего резидентного модуля. Но для этого ему придется сперва разобрать нашу про-
грамму, а уж затем написать обработчик, отключающий наш резидент.
Если вы пишете свою оболочку, то рекомендую написать такую подпрограмму,
а затем попробовать ее действие на любой резидентной программе.
31.2.2. Как защитить компьютер
от программ-разрушителей дисковой информации
Как правило, программы для работы с файлами используют прерывание MS-
DOS
21h
, которое обращается к прерыванию BIOS
13h
. Прерывание
13h
позволяет
читать, писать и форматировать секторы жесткого или гибкого диска.
В ПЗУ есть мощные, но довольно сложные процедуры для выполнения указан-
ных выше действий. В очень редких случаях программы работают с диском напря-
мую, т. е. используют свои процедуры чтения и записи секторов. К таким програм-
мам можно отнести DiskEditor из утилит Norton. Вирусы также очень редко имеют
подобные собственные подпрограммы, т. к. процедура чтения одного сектора до-
вольно-таки громоздка и не универсальна. Тем не менее, такие экзотические виру-
сы существуют. К сожалению, следить за их действиями практически невозможно.
Однако программы, которые используют прерывание BIOS
13h
или DOS
25h
(чтение сектора) /
26h
(запись сектора) для работы с дисками, легко контролиро-
вать. Достаточно перехватить прерывание
13h
и следить за вызовом соответствую-
щей функции. Если вызывается функция записи или форматирования, то просто вер-
нуть вызывающей это прерывание программе код ошибки. Программа, пытающаяся
что-либо записать на диск или его отформатировать, получит сообщение об ошибке
и посчитает, что либо диск защищен от записи, либо сектор не найден, либо что-
нибудь другое (все зависит от того, какой код ошибки вернет наша процедура).
Можно поступить еще хитрее. Фактически запись/форматирование не про-
изводить, но передавать программе сообщение об успешном выполнении того или
Глава 31. Обзор дополнительных возможностей оболочки
301
иного действия, при этом зафиксировав попытку записи/форматирования в свой
файл отчета, который может посмотреть пользователь.
Этот способ можно также включить в свою оболочку, причем в разных вариан-
тах. Например:
производить запись/форматирование всегда;
производить запись/форматирование только в оболочке;
не производить запись/форматирование вообще.
При этом пользователь должен выбрать тот вариант, который ему больше всего
подходит в определенное время. Таким образом, можно исключить на 99% вероят-
ность заражения других файлов вирусом, который находится на незнакомой диске-
те и запускается пользователем.
Обращаем ваше внимание, что все функции работы с дисками и файлами MS-
DOS работают с помощью прерывания
13h
. Поэтому достаточно перехватить толь-
ко прерывание BIOS.
Комбинируя первый и второй способы в вашей оболочке или программе, можно
довольно надежно защитить компьютер от заражения неизвестным вирусом и спо-
койно запускать любые новые программы с чужих дисков.
Глава 32
Все о диске и файловой системе
32.1. Что находится на диске?
В этой главе мы рассмотрим, что располагается в определенных участках жест-
кого и гибкого дисков. Для более детального и практического изучения следует
воспользоваться специальными программами. Оптимальной является DiskEdit из
пакета известных утилит Norton Commander (Norton Utilities). Любому ассемблер-
щику рано или поздно придется прибегнуть к помощи этой программы или подоб-
ной ей, особенно если он пишет код для работы с дисками.
32.
1.1. Таблица разделов жесткого диска
После включения или перезагрузки компьютера, первое, что считывается в па-
мять, — таблица разделов жесткого диска, представляющая собой специально на-
писанную программу с информацией о жестком диске. Она выполняет определен-
ные действия, а затем загружает и передает управление загрузочному сектору
(см. далее). Таблица разделов жесткого диска считывается в память всегда, если
в компьютере присутствует винчестер, который должным образом разбит на разде-
лы. Даже в случае, если пользователь загружает операционную систему с гибкого
диска. Дискеты не содержат эту таблицу, и первое, что на них находится, — это
загрузочный сектор.
Таблица разделов хранит в себе информацию о разделах винчестера: название
раздела, стартовый сектор, количество секторов и пр. Эту информацию изначально
заносит в нулевой цилиндр, нулевую дорожку, первый сектор программа FDISK
(или подобная ей) перед тем, как винчестер будет отформатирован. Пользователь
может создать всего один раздел (тогда буква С будет относиться к жесткому дис-
ку, D — к CD-ROM и к прочим устройствам), а может разбить винчестер на не-
сколько разделов (С, D, E — жесткие диски, F — CD-ROM и т. п.).
Если вручную или программно обнулить этот сектор, то вся информация о раз-
делах будет уничтожена, вследствие чего операционная система не сможет полу-
чить доступ к диску. ОС вообще не распознает, что это жесткий диск, т. к. про-
грамма, расположенная в этом секторе, не загрузится в память. Писать в эту
область диска можно только с помощью прерывания
13h
или прямого программи-
рования контроллера жесткого диска.
Глава 32. Все о диске и файловой системе
303
Однако следует иметь в виду, что в случае уничтожения информации из табли-
цы разделов пользователь сможет все-таки получить доступ и даже восстановить
ее, если:
он предварительно сохранил таблицу разделов на дискету. Это позволяют де-
лать многие специальные программы. Например: Norton Utilities, Nuts&Bolts
и пр.;
жесткий диск имеет всего один раздел. В таком случае опытный пользователь
может вручную записать начальный и конечный секторы напрямую в таблицу
разделов (которые известны, т. к. весь диск отведен для одного раздела);
получить доступ к файлам с помощью специальных программ. Например, с по-
мощью DiskEdit из пакета утилит Norton Commander или с помощью DOS
Navigator.
В любом случае, на восстановление таблицы разделов жесткого диска может
понадобиться много времени и нервов, поэтому эксперименты с ней требуют от
программиста двойной бдительности и осторожности.
32.1.2. Загрузочный сектор
После таблицы разделов следует загрузочный сектор (BOOT-сектор), к которо-
му можно получить доступ не только с помощью прерывания
13h
, но
25h
(чтение
сектора) /
26h
(запись сектора) DOS.
Как уже упоминалось ранее, и таблица разделов, и загрузочный сектор — это
программы, которые загружаются перед всеми остальными файлами операционной
системы. Чтобы в этом убедиться, а также разобрать программы (например, для
изучения их работы, если вы пишете собственную ОС), достаточно прочитать эти
секторы в память, сохранить в файле и посмотреть в отладчике или в Hacker's View.
Загрузочный сектор хранит следующую информацию (табл. 32.1).
Таблица 32.1. Поля загрузочного сектора
Смещение
Описание
00h
"Прыжок" на метку инициализации
03h
Идентификатор — содержит сведения о программе, создавшей этот сектор
0Bh
Количество байт на сектор — как правило — 512, хотя есть и 128, 256, 1024
0Dh
Количество секторов на кластер
0Eh
Количество зарезервированных секторов — после них идет таблица раз-
мещения файлов (FAT)
10h
Количество копий таблицы размещения файлов (FAT) — как правило, две
11h
Количество файлов и подкаталогов, которые могут храниться в корневом
каталоге — их количество зависит от объема диска
13h
Общее количество секторов на диске