Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Программирование

Добавлен: 16.02.2019

Просмотров: 29200

Скачиваний: 1689

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Глава 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, который запускает программу по 
требованию пользователя. Если так, то после того, как запущенная программа от-
работает, резидент копирует сохраненную таблицу из своего буфера в таблицу век-
торов прерываний. Таким образом, если какая-либо программа, в том числе и рези-
дентный вирус, перехватила некоторое прерывание, то наш резидент "вырубит" его 
вызов. Получится, что вирус и находится в памяти, но не может активизироваться. 

Этот способ имеет два недостатка: 

 

пока  работает  запущенная  зараженная  программа,  вирус  находится  в  памяти  
и уже может заражать другие файлы; 

 

если  запускается  обычный  резидент,  то  наша  программа  также  "отсечет"  его, 
вследствие чего загруженный резидент также не сможет активизироваться. 
Эти недостатки можно исключить, усовершенствовав наш резидент. Например, 

его можно включить в собственную оболочку, а в ней самой организовать возмож-
ность  переключения  опции  сохранения/восстановления  таблицы  векторов  преры-


background image

 

Часть III. Файловая оболочка, вирус, резидент 

300 

ваний после каждого запуска программы. Ведь перед запуском программ часть лю-
бой  файловой  оболочки  так  или  иначе  остается  в  памяти.  Если  пользователь  не 
уверен,  что  запускаемый  файл  "чистый",  он  может  установить  опцию сохранения  
и восстановления таблицы векторов прерываний путем простого нажатия комбина-
ции некоторых клавиш. И наоборот. 

Более  того,  программа-резидент  или  оболочка  могут получить количество сво-

бодной  памяти  перед  запуском  программы,  и,  как  только  она  отработала,  прове-
рить,  изменился  ли  объем  основной  памяти  или  нет.  Если  уменьшился,  значит,  
в памяти осталась какая-то программа, о чем следует немедленно сообщить поль-
зователю. 

Здесь  стоит  отметить,  что  не  все  резидентные  вирусы  уменьшают  объем  сво-

бодной  памяти.  Некоторые  из  них  располагаются  в  специальных  областях  либо 
"обманывают" ОС, не уменьшая память. Но ни один резидентный вирус не сможет 
запретить нашей программе-резиденту восстановить предварительно сохраненную 
таблицу  векторов  прерываний.  Кроме  случаев,  когда  разработчик  вируса  знал  о 
существовании  нашей  программы  и  специально  разработал  процедуру  против  на-
шего резидентного модуля. Но для этого ему придется сперва разобрать нашу про-
грамму, а уж затем написать обработчик, отключающий наш резидент. 

Если вы пишете свою оболочку, то рекомендую написать такую подпрограмму, 

а затем попробовать ее действие на любой резидентной программе.  

31.2.2. Как защитить компьютер  
от программ-разрушителей дисковой информации 

Как  правило,  программы  для  работы  с  файлами  используют  прерывание  MS-

DOS 

21h

, которое обращается к прерыванию BIOS 

13h

. Прерывание 

13h

 позволяет 

читать, писать и форматировать секторы жесткого или гибкого диска.  

В ПЗУ есть мощные, но довольно сложные процедуры для выполнения указан-

ных выше действий. В очень редких случаях программы работают с диском напря-
мую, т. е. используют свои процедуры чтения и записи секторов. К таким програм-
мам можно отнести DiskEditor из утилит Norton. Вирусы также очень редко имеют 
подобные  собственные  подпрограммы,  т. к.  процедура  чтения  одного  сектора  до-
вольно-таки громоздка и не универсальна. Тем не менее, такие экзотические виру-
сы существуют. К сожалению, следить за их действиями практически невозможно. 

Однако  программы,  которые  используют  прерывание  BIOS 

13h

  или  DOS 

25h

 

(чтение  сектора)  / 

26h

  (запись  сектора)  для  работы  с  дисками,  легко  контролиро-

вать.  Достаточно  перехватить  прерывание 

13h

  и  следить  за  вызовом  соответствую-

щей функции. Если вызывается функция записи или форматирования, то просто вер-
нуть вызывающей это прерывание программе код ошибки. Программа, пытающаяся 
что-либо записать на диск или его отформатировать, получит сообщение об ошибке 
и посчитает, что либо диск защищен от записи, либо сектор не найден, либо что-
нибудь другое (все зависит от того, какой код ошибки вернет наша процедура). 

Можно  поступить  еще  хитрее.  Фактически  запись/форматирование  не  про-

изводить, но передавать программе сообщение об успешном выполнении того или 


background image

Глава 31. Обзор дополнительных возможностей оболочки 

301 

иного  действия,  при  этом  зафиксировав  попытку  записи/форматирования  в  свой 
файл отчета, который может посмотреть пользователь. 

Этот способ можно также включить в свою оболочку, причем в разных вариан-

тах. Например: 

 

производить запись/форматирование всегда; 

 

производить запись/форматирование только в оболочке; 

 

не производить запись/форматирование вообще. 
При этом пользователь должен выбрать тот вариант, который ему больше всего 

подходит в определенное время. Таким образом, можно исключить на 99% вероят-
ность заражения других файлов вирусом, который находится на незнакомой диске-
те и запускается пользователем. 

Обращаем  ваше  внимание,  что  все  функции  работы с дисками и файлами MS-

DOS работают с помощью прерывания 

13h

. Поэтому достаточно перехватить толь-

ко прерывание BIOS. 

Комбинируя первый и второй способы в вашей оболочке или программе, можно 

довольно надежно защитить компьютер от заражения неизвестным вирусом и спо-
койно запускать любые новые программы с чужих дисков.  

 


background image

 

 

 

Глава 32 

 

Все о диске и файловой системе 

 

32.1. Что находится на диске? 

В этой главе мы рассмотрим, что располагается в определенных участках жест-

кого  и  гибкого  дисков.  Для  более  детального  и  практического  изучения  следует 
воспользоваться  специальными  программами.  Оптимальной  является  DiskEdit  из 
пакета известных утилит Norton Commander (Norton Utilities). Любому ассемблер-
щику рано или поздно придется прибегнуть к помощи этой программы или подоб-
ной ей, особенно если он пишет код для работы с дисками. 

32.

1.1. Таблица разделов жесткого диска 

После включения или перезагрузки компьютера, первое, что считывается в па-

мять, — таблица разделов жесткого диска, представляющая собой специально на-
писанную программу с информацией о жестком диске. Она выполняет определен-
ные  действия,  а  затем  загружает  и  передает  управление  загрузочному  сектору 
(см. далее).  Таблица  разделов  жесткого  диска  считывается  в  память  всегда,  если  
в компьютере присутствует винчестер, который должным образом разбит на разде-
лы. Даже в случае, если пользователь загружает операционную систему с гибкого 
диска.  Дискеты  не  содержат  эту  таблицу,  и  первое,  что  на  них  находится, —  это 
загрузочный сектор. 

Таблица  разделов  хранит  в  себе  информацию  о  разделах  винчестера:  название 

раздела, стартовый сектор, количество секторов и пр. Эту информацию изначально 
заносит  в  нулевой  цилиндр,  нулевую  дорожку,  первый  сектор  программа  FDISK 
(или  подобная  ей)  перед  тем,  как винчестер будет отформатирован. Пользователь 
может создать всего один раздел (тогда буква С будет относиться к жесткому дис-
ку,  D —  к  CD-ROM  и  к  прочим  устройствам),  а  может  разбить  винчестер  на  не-
сколько разделов (С, D, E — жесткие диски, F — CD-ROM и т. п.). 

Если вручную или программно обнулить этот сектор, то вся информация о раз-

делах  будет  уничтожена,  вследствие  чего  операционная  система  не  сможет  полу-
чить  доступ  к  диску.  ОС  вообще  не  распознает,  что  это  жесткий  диск,  т. к.  про-
грамма,  расположенная  в  этом  секторе,  не  загрузится  в  память.  Писать  в  эту 
область диска можно только с помощью прерывания 

13h

 или прямого программи-

рования контроллера жесткого диска. 


background image

Глава 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 

Общее количество секторов на диске