                                                            Приложение 4

             НЕКОТОРЫЕ СВЕДЕНИЯ О ФАЙЛОВОЙ СИСТЕМЕ MS DOS

   Существуют два  основных типа  дисков, используемых  в MS DOS: гибкие
диски (дискеты) и жесткие диски (винчестеры). В дальнейшем мы будем рас-
сматривать преимущественно  дискеты, поскольку отличия в организации ин-
формации между  дискетами и  винчестерами незначительны и касаются в ос-
новном количественных  характеристик. Впрочем, количественные характери-
стики отличаются  и для  разных типов  дискет (5-  и 3-дюймовых, одно- и
двухсторонних и  пр.). Поэтому для упрощения изложения далее везде будет
предполагаться дискета  360К (2  стороны по  40 треков,  9  секторов  на
трек).

   Информация записывается на фиксированное число концентрических окруж-
ностей, называемых  треками или дорожками, на которые может быть выстав-
лена магнитная головка. Их количество зависит от типа дисковода и диске-
ты. Обычная  360K   пятидюймовая дискета (DS/DD) рассчитана на запись 40
треков на  каждой стороне. Треки нумеруются, начиная с нуля, причем трек
0 расположен  ближе к  внешнему краю  диска (имеет наибольший радиус), а
трек 39 -- к внутреннему отверстию дискеты.

   Имеются дискеты и другой емкости. Так, дискеты DS/QD (720K) рассчита-
ны для  записи 80  треков (0-79).  Опыт показал,  что большинство дискет
DS/DD можно успешно размечать на 80 дорожек и использовать как DS/QD без
снижения надежности  записи информации. Кроме того, дисковод может вести
запись на  40 и  более старшие дорожки (до 43) или на 80-83. В частности
41 дорожка часто используется для "защиты от копирования" -- часть инфор-
мации размещается  на ней  и пропадает при обычном копировании. Впрочем,
имеются специальные  программы (CopyIIPC,  CopyWrite), позволяющие обхо-
дить простейшую  реализацию такой защиты за счет копирования "всего под-
ряд". Бутовые  вирусы также  иногда используют  40 дорожку  для хранения
своего хвоста.

   Каждый трек  разделен на секторы, которые являются единицами считыва-
ния и  записи информации на диск. Любая операция чтения или записи в ко-
нечном счете  сводится к чтению или записи определенного числа секторов.
На одном треке для обычной дискеты располагаются девять секторов. Каждый
сектор обычно  содержит 512 байтов. Операционная система выделяет файлам
единицы дискового пространства, называемые кластерами. Для обычных двух-
сторонних дискет  360 К (DS/DD) кластер состоит из двух секторов и имеет
размер 1024  байта (1К).  Даже если размер файла меньше 1К, операционная
система выделяет  файлу целый  кластер. Таким  образом, кластер является
минимальной единицей  распределения дискового пространства, что приводит
к потере  значительного количества  секторов в "хвостах" файлов. Следует
отметить, что  чем меньше  размер кластера,  тем  более  оптимально  ис-
пользуется дисковое  пространство. Например, при переходе на обычном 20M
винчестере от  стандартного кластера размером 2K к уменьшенному размером
1K  увеличивается   полезная  емкость   винчестера  почти   на  20%  при
практически неизменной скорости ввода-вывода.

   Количество секторов,  которое можно  записать на  дискету, зависит от
качества дисковода.  Обычные дисководы позволяют записывать до 10 секто-
ров на  трек (формат  10 секторов:40 треков -- 400K и 10 секторов:80 тре-
ков -- 800K), а дисководы повышенного качества -- 17 секторов на трек (для
дискет HD  емкостью 1,2М  используется разметка  80 дорожек по 15 секто-
ров). Следует  отметить, что если разметить дискету DS/DD (DS/QD) в фор-
мате HD, то после записи информации обычно ее нельзя прочитать.

   Хотя дискета имеет форму диска, операционная система рассматривает ее
как последовательность  секторов от нулевого до максимального. Последний
зависит от  емкости дискеты. При этом первые 12 секторов (0-11) содержат
управляющие блоки  MS DOS для  любого типа  диска. Следует отметить, что
размеры управляющих блоков на дискете (FAT и каталога) приведены для ди-
скеты 360K  и могут отличаться от стандартных: их размер хранится в бут-
секторе и не является фиксированным. Дальнейшее содержимое диска зависит
от того,  является ли  он системным или нет. Для обычного диска сектора,
начиная с 12, содержат данные.

   Для системного  диска сектора  с 12-го  заняты файлами  IBMBIO.COM  и
IBMDOS.COM (IO.SYS  и MSDOS.SYS). Эти файлы являются скрытыми и не видны
командой DIR.  Чтобы рассмотреть  их,  можно  воспользоваться  утилитами
(Norton Commander,  PCTools и  т.д.).   Систему с  файлами  IBMBIO.COM и
IBMDOS.COM   правильнее называть  не MS DOS,  а  PC DOS,  поскольку  она
является  версией  MS DOS,  распространяемой  фирмой  IBM.  Хотя  версии
функционально эквивалентны, размеры большинства файлов в них отличаются.
На системной  дискете  файл  IBMBIO.COM  (IO.SYS)  должен  располагаться
первым. Сразу за ним должен следовать файл IBMDOS.COM (MSDOS.SYS).

   Помимо IBMBIO.COM  и IBMDOS.COM,  на системном  диске содержится файл
COMMAND.COM (командный процессор), размер которого для MS DOS версии 3.3
составляет 25276  байтов, а  для PC DOS  версии 3.3  -- 25307 байтов. Эта
программа обеспечивает обработку вводимых команд и является наиболее ча-
сто используемой  компонентой MS DOS.  Поэтому она  является излюбленной
мишенью для  атаки файловыми вирусами. Дискета, содержащая указанные три
файла, является минимальной конфигурацией операционной системы MS DOS, и
ее удобно  использовать в качестве дрозофилы для бутовых вирусов. Приво-
димые далее  примеры ориентированы в основном на указанную  конфигурацию
(рис.1):


                ╔════════════╤═══ A:\ ═╤════════╤══════╗
                ║    Name    │   Size  │  Date  │ Time ║
                ║Ibmbio  ░com│    22100│ 3-17-87│12:00p║
                ║Ibmdos  ░com│    30159│ 3-17-87│12:00p║
                ║command  com│    25307│ 3-17-87│12:00p║
                ║            │         │        │      ║

                Рис.1. Фрагмент панели Norton Commander
                 с каталогом дискеты с минимальной DOS.

            Структура управляющей  информации на  дискете

    Первые 12 секторов (0- 11) содержат три управляющих таблицы: загруз-
чик (BOOT), таблицу распределения файлов (FAT) и корневой каталог  (root
directory). Схема расположения этих секторов приведена на рис.2.  Карта,
выдаваемая такими утилитами,  как PC Tools  (рис.2б) и Norton  Utilities
4.5, позволяет легко определить наличие,  а в случае Norton Utilities  и
просмотреть содержимое сбойных кластеров. Если содержимое секторов клас-
тера, отмеченного как сбойный, читается нормально, то скорее всего  этот
кластер является псевдосбойным и,  возможно, создан бутовым вирусом  для
хранения своего хвоста.

                            ┌────────────┐
                            │ 0   BOOT   │
                            ├────────────┤
                            │ 1   FAT    │
                            ├────────────┤
                            │ 2   FAT    │
                            ├────────────┤
                            │ 3 Копия FAT│
                            ├────────────┤
                            │ 4 Копия FAT│
                            ├────────────┤
                            │ 5   ROOT   │
                            ├────────────┤
                            ...  ...   ...
                            ├────────────┤
                            │ 11  ROOT   │
                            ├────────────┤
                            │ 12  IO.SYS │
                            ├────────────┤
                            ...  ...   ...

                                  а

PC Tools Deluxe R4.30                                   Vol Label=None
────────────────────────────Disk Mapping Service──────────────────────-
Path=A:\*.*
Entire disk mapped                                      78% free space
                   Track    1    1    2    2    3    3   3
                   0    5    0    5    0    5    0    5   9
Double sided       Bhhhhhhrrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
                   Fhhhhhhrrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
           Side 0  Fhhhhhhrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
                   Dhhhhhhrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
               ----Dhhhhhrrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
                   Dhhhhhrrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
           Side 1  hhhhhhrrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
                   hhhhhhrrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
                   hhhhhhrrr▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
                             Explanation of Codes

                         B Boot record      h hidden
                         F File Alloc Table r Read Only
                         D Directory        x Bad Cluster

                        "F" to map files. ESC to return.

                                        б

                Рис.2. Расположение секторов на дискете


                              Бут-сектор

    Первый сектор дискеты или раздела винчестера называется бут-сектором
и содержит сведения о формате дискеты, а также короткую программу -- заг-
рузчик. Структура бут-сектора показана на рис.3.

      0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
    ╓───────┬───╥───┬───────┬───────┬───────┬───╥───┬───╥───╥───────╖
 00 ║JMP  xx NOP║'I' 'B' 'M'         '3' '.' '3'║SectSiz║CS ║ResSecs║
    ╟───╥───┼───╫───┼───╥───╥───┴───╥───┴───╥───╨───╥───╨───╫───┴───╢
 10 ║Fat║RootSiz║TotSecs║Med║FatSize║TrkSecs║HeadCnt║HidnSec║       ║
    ╟───╨───┼───╨───┼───╨───╨───┴───╨───┴───╨───┴───╨───┴───╨───┴───╜
 20 ║ код загрузчика (в конце загрузчика всегда расположены диагно-
    ╙───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┤
 30   стические сообщения и имена системных файлов)
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┤
     ...  ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───╥───┴───┤
1F0                                                         ║ 55  AA│
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───╨───┴───┘

                         Рис.3. Структура бут-сектора:
    Используемые обозначения: JMP - NEAR-переход на начало загрузчика; 8
байтов, содержащих произвольную информацию, обычно заносимую  программой
форматирования диска;  SectSiz- количество  байтов в  одном секторе;  CS
(ClustSiz)- количество  секторов в  одном кластере;  ResSecs- количество
резервных секторов (перед FAT);  Fat (FatCnt)- количество FAT;  RootSiz-
макс.число 32-байтовых элементов корневого каталога; TotSecs- общее чис-
ло секторов на носителе (разделе диска); Med (Media)- дескриптор носите-
ля (то же, что 1-й байт FAT); FatSize- количество секторов в одной  FAT;
TrkSecs- количество секторов в одном треке; HeadCnt- число головок  чте-
ния/записи (поверхностей); HidnSec- количество спрятанных секторов;  да-
лее - размер форматированной порции корневого сектора.


    Программа-загрузчик   находит  на диске  и загружает  в  оперативную
память системный  файл IO.SYS (или IBMBIO.SYS). Если  файл не найден, то
выдается сообщение  "Non-System disk  or disk  error. Replace and strike
any key  when ready"  ("Несистемный  диск  или  ошибка  при  считывании.
Замените и  нажмите любую клавишу") и процесс загрузки прекращается. Эта
ситуация обычно  возникает, когда  на компьютере  с винчестером пытаются
перезагрузиться   при установленной и защелкнутой дискете в дисководе А.
Если  дискета   заражена  бутовым   вирусом,  то   при  выполнении  этой
рекомендации винчестер  также будет  заражен. Поэтому  в ответ на данное
сообщение следует  всегда нажимать клавищу Reset. Даже если дискета была
вакцинирована  с  помощью  бутовой  вакцины  VitaminB,  перезагрузка  не
является гарантией  предотвращения заражения  (некоторые бутовые  вирусы
успевают к  этому моменту  заразить винчестер).  В  то  же  время,  если
вакцина выдала  какие-то предупреждающие  сообщения, то  необходимо обя-
зательно проверить  содержимое бут-сектора  дискеты, с которой произошла
попытка загрузки.  Если программа  загрузки на  дискете  повреждена,  то
система зависает.  При этом   мигающий курсор расположен в левом верхнем
углу экрана.

   Второй  компонентой  бут-сектора  является  таблица  параметров.  Она
содержит важную  информацию о  структуре дискеты  или логического  диска
(положение и  размер FAT,  количество секторов  в кластере  и др.).  Эта
структура устанавливается  при разметке  и является  статической, т.е. в
дальнейшем не меняется. Если таблица параметров испорчена, то информацию
с диска  прочитать нельзя  и при загрузке система зависает. Как видно из
рис.3, сведения  о программе, с помощью которой выполнялось форматирова-
ние, расположены с 4 байта.

   На рис.4  показан бут-сектор  двухсторонней дискеты двойной плотности
(2D-2S), содержащей  40 треков  и размеченной программой Format в MS DOS
3.3. Бут-сектор  винчестера отличается  только таблицей параметров. Про-
грамма-загрузчик остается неизменной. Другие версии операционной системы
имеют несколько  отличающийся  от  приведенного  загрузчик,  однако  его
структура неизменна:  в конце  сектора всегда имеется текст диагностиче-
ского  сообщения   и  имена  системных  файлов  (на  рис.4  --  IO.SYS  и
MSDOS.SYS; для  PC DOS используются  имена IBMBIO.COM  и IBMDOS.COM).  В
конце бут-сектор всегда содержит два идентификационных байта : 55h AAh.

   Следует обратить  внимание, что  первые три  байта стандартного  бут-
сектора MS DOS  3.3 содержат  EB3490. Несовпадение  этих байтов при про-
смотре бут-сектора должно сразу настораживать, т.к. может свидетельство-
вать о заражении вирусом.

          000: EB34904D53444F53 332E330002020100  .4.MSDOS3.3.....
          010: 027000D002FD0200 0900020000000000  .p..............
          020: 0000000000000000 0000000000000012  ................
          030: 000000000100FA33 C08ED0BC007C1607  .......3.....|..
          040: BB780036C5371E56 1653BF2B7CB90B00  .x.6.7.V.S.+|...
          050: FCAC26803D007403 268A05AA8AC4E2F1  ..&.=.t.&.......
          060: 061F894702C7072B 7CFBCD137267A010  ...G...+|...rg..
          070: 7C98F726167C0306 1C7C03060E7CA33F  |..&.|...|...|.?
          080: 7CA3377CB82000F7 26117C8B1E0B7C03  |.7|. ..&.|...|.
          090: C348F7F30106377C BB0005A13F7CE89F  .H....7|....?|..
          0A0: 00B80102E8B30072 198BFBB90B00BED6  .......r........
          0B0: 7DF3A6750D8D7F20 BEE17DB90B00F3A6  }..u... ..}.....
          0C0: 7418BE777DE86A00 32E4CD165E1F8F04  t..w}.j.2...^...
          0D0: 8F4402CD19BEC07D EBEBA11C0533D2F7  .D.....}.....3..
          0E0: 360B7CFEC0A23C7C A1377CA33D7CBB00  6.|...<|.7|.=|..
          0F0: 07A1377CE84900A1 187C2A063B7C4038  ..7|.I...|*.;|@8
          100: 063C7C7303A03C7C 50E84E005872C628  .<|s..<|P.N.Xr.(
          110: 063C7C740C010637 7CF7260B7C03D8EB  .<|t...7|.&.|...
          120: D08A2E157C8A16FD 7D8B1E3D7CEA0000  ....|...}..=|...
          130: 7000AC0AC07422B4 0EBB0700CD10EBF2  p....t".........
          140: 33D2F736187CFEC2 88163B7C33D2F736  3..6.|....;|3..6
          150: 1A7C88162A7CA339 7CC3B4028B16397C  .|..*|.9|.....9|
          160: B106D2E60A363B7C 8BCA86E98A16FD7D  .....6;|.......}
          170: 8A362A7CCD13C30D 0A4E6F6E2D537973  .6*|.....Non-Sys
          180: 74656D206469736B 206F72206469736B  tem disk or disk
          190: 206572726F720D0A 5265706C61636520   error..Replace
          1A0: 616E642073747269 6B6520616E79206B  and strike any k
          1B0: 6579207768656E20 72656164790D0A00  ey when ready...
          1C0: 0D0A4469736B2042 6F6F74206661696C  ..Disk Boot fail
          1D0: 7572650D0A00494F 2020202020205359  ure...IO      SY
          1E0: 534D53444F532020 2053595300000000  SMSDOS   SYS....
          1F0: 0000000000000000 00000000000055AA  ..............U.
                                           └─┬─┘
                                             └ идентификационные
                                               байты

    Рис.4. Бут-сектор дискеты 2D-2S, размеченной программой FORMAT


   При интерпретации  дампа следует  обратить внимание на то, что микро-
процессор 8086  записывает в  память машинное  слово (2 байта) в формате
<младший байт><старший байт>. Поэтому при интерпретации двухбайтовых по-
лей для получения правильного значения следует переставить байты  места-
ми. Например,  поле SectSiz  содержит "00  02", т.е.  его значение равно
0200h -- 512 байт.

                  Таблица распределения файлов (FAT)

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

   С помощью  FAT MS DOS  отслеживает последовательность кластеров, при-
надлежавших файлу,  независимо от фактического расположения их на диске.
Для незанятых  кластеров указатель имеет вид 000. Если кластер поврежден
и MS DOS  не может считать или записать в него информацию, то такой кла-
стер содержит  FF7 (признак  сбойного кластера),  и MS DOS не использует
отмеченные таким образом кластеры при распределении.

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

   FAT может состоять из 12-битовых или 16-битовых элементов. 12-битовые
элементы используются  для дискет. 16-битовые элементы FAT были введены,
начиная с DOS 3.0, когда возникла необходимость управления 20М винчесте-
ром. На  дискетах 360К под FAT отведены четыре сектора -- текущее состоя-
ние FAT в секторах 1,2 и его копия в секторах 3,4. Дискеты 720К содержат
основную FAT в секторах 1,2,3 и ее копию в секторах 4,5,6.

   Поскольку 12-битовые  элементы трудно анализировать на обычном дампе,
для анализа  FAT целесообразно  использовать Norton  Utilities, выдающую
разобранный  на   12-битовые  элементы   (полуинтерпретированный)   дамп
(рис.5).


╔ FAT area ═══════════════════════════════════════════════════════ FAT format ═╗
║ Sector 1 in 1st copy of FAT                                 Cluster 2, hex 2 ║
║                                                                              ║
║       3     4     5     6     7     8     9    10    11    12    13    14    ║
║      15    16    17    18    19    20    21    22    23 <EOF>    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 <EOF>    55    56    57    58    59    60    61    62    ║
║      63    64    65    66    67    68    69    70    71    72    73    74    ║
║      75    76    77    78 <EOF>     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║       0     0     0     0     0     0     0     0     0     0     0     0    ║
║                                                                              ║
║                           Press Enter to continue                            ║
1Help   2Hex    3Text   4Dir    5FAT    6Partn  7       8Choose 9Undo   10QuitNU

            Рис.5. Полуинтерпретированный дамп FAT минимальной DOS,
                       полученный с помощью Norton Utilities



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

   Повреждение FAT  является тяжелой аварией, и при отсутствии резервных
копий обычно ведет к значительной потере информации. В некоторых случаях
поврежденной оказывается  только первая из двух копий FAT. В этом случае
можно переписать уцелевшую копию с помощью DiskEdit.
   Помимо стирания  части или  всей FAT,  возможны  мелкие  ошибки  типа
сращивания цепочек  кластеров (когда  один и  тот же кластер принадлежит
двум файлам  сразу) или  зацикливания дерева каталогов. Указанные ошибки
можно  устранить   с  помощью  утилит  DiskEdit  и  NDD.  Восстановление
облегчается при  наличии резервной копии FAT, полученной утилитой IMAGE,
которую рекомендуется включать в AUTOEXEC.BAT.


                           Корневой каталог

   MS DOS хранит информацию о файлах в каталогах, которые образуют  дре-
вовидную структуру. Корневой каталог хранит сведения о всех содержащихся
в нем файлах и подкаталогах. Он занимает семь секторов, начиная с секто-
ра 5. Каждый элемент корневого  каталога занимает 32 байта. Очевидно,  в
одном секторе может разместиться 16 элементов. Это означает, что в  семи
секторах корневого каталога могут быть описаны до 112 файлов и  подката-
логов. Структура каталога показана на  рис.6. Как видно из рисунка,  имя
файла состоит не более чем из восьми символов, дополненных справа пробе-
лами. За  именем следует  факультативное трехсимвольное  расширение. При
длине менее трех символов оно также дополняется пробелами.

     0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
   ╓───────┬───────┬───────┬───────╥───────┬───╥───╥───────┬───────┐
00 ║            name               ║    ext    ║atr║    резерв     │
   ╙───┴───┼───┴───┼───┴───╥───┴───╫───┴───╥───╨───╫───┴───┼───┴───┤
10         резерв          ║ time  ║ date  ║ClstrNo║ размер файла  │
   ├───┴───┼───┴───┼───┴───╨───┴───╨───┴───╨───┴───╨───┴───┼───┴───┼


                        Рис.6. Структура элемента каталога
   Границы полей отмечены двойной линией. Используются следующие
   обозначения (в квадратных скобках указаны смещение в 16-ричной
   системе счисления и длина):
            name   - имя файла [+0;8];
            ext     - расширение имени [+8;3];
            atr     - атрибут файла [+0Bh;1];
            резерв [+0Ch;0Ah];
            time   - время создания [+16h;2];
            date   - дата создания [+18h;2];
            ClstrNo- номер начального кластера данных
                   (связь с FAT) [+1Ah;2];
            размер файла - размер файла в байтах [+1Ch;4].



   Байт атрибутов позволяет MS DOS идентифицировать статус файла, по ко-
торому подразумевается некоторая (с точки зрения защиты от вирусов -- ил-
люзорная) степень  защиты от  несанкционированных действий пользователя.
Не все биты байта атрибутов используются. Первый (наименее значащий) бит
показывает, что  это скрытый файл (не выдается командой DIR). Второй бит
означает, что это системный файл, в отличие от пользовательских файлов.

   Номер первого  кластера позволяет  определить место в FAT, занимаемое
файлом. Если  файл является  каталогом (подкаталогом), то он имеет уста-
новленный бит 4 байта атрибутов.

   Дамп главного  кaталога  для  минимальной  конфигурации  приведен  на
рис.7.

         000: 494F202020202020 5359532700000000 IO      SYS'....
         010: 0000000000000100 21100200875B0000 ........!....[..
         020: 4D53444F53202020 5359532700000000 MSDOS   SYS'....
         030: 0000000000000100 21101900B0750000 ........!....u..
         040: 434F4D4D414E4420 434F4D2000000000 COMMAND COM ....
         050: 0000000000000100 F80E3700BC620000 ..........7..b..
         060: 0000000000000000 0000000000000000 ................
         ***  последующие строки идентичны предыдущим ***

             Рис.7. Дамп главного каталога для минимальной DOS.


   Поле атрибутов файла. Поле атрибутов файла позволяет присваивать фай-
лу определенный "статус" относительно тех или иных операций. Не все биты
байта атрибутов  используются. Биты нумеруются с нуля. Наименее значащий
(нулевой) бит  соответствует атрибуту  READ ONLY, затем идут биты, соот-
ветствующие атрибутам  HIDDEN и  SYSTEM. Атрибут READ ONLY ("только чте-
ние") запрещает  выполнение операций удаления и модификации данного фай-
ла. Если установлен первый бит (атрибут HIDDEN), то данный файл является
так называемым скрытым файлом (не выдается командой DIR). Второй бит оз-
начает, что  это системный  файл, в  отличие от пользовательских файлов.
Используемые биты байта атрибутов показаны на рис.8.


╓7┬6┬5┬4┬3┬2┬1┬0╖
║   │a│d│v│s│h│r║
╙─┴─┴╥┴╥┴╥┴╥┴╥┴╥╜ бит                     *** маска ***
     ║ ║ ║ ║ ║ ╚═0:1=только чтение (READ  ONLY)   (01h)
     ║ ║ ║ ║ ╚═══1:1=спрятанный  (HIDDEN)         (02h)
     ║ ║ ║ ╚═════2:1=системный  (SYSTEM)          (04h)
     ║ ║ ╚═══════3:1=метка тома                   (08h)
     ║ ╚═════════4:1=элемент подоглавления        (10h)
     ╚═══════════5:1=копия файла НЕ архивировалась(20h)

                  Рис.8. Формат поля атрибутов файла.

   Как видно из рис.8, метка тома представляет собой просто  специальный
элемент каталога, для которого не существует соответствующего ему файла.
Одна из функций  DOS (21h-43h) позволяет  вирусу "молча" изменять  любой
бит  байта  атрибутов,  включая  "только  чтение",  что  является  явным
дефектом  реализации   этой  функции,   существенно  облегчающим   жизнь
создателям  вирусов.  Впрочем,  при  отсутствии  страничной  организации
памяти и режима супервизора (как в старой, доброй системе 360/370),  ра-
дикальных мер по исправлению этой ошибки, по сути, и предложить нельзя.

       Поля даты и времени
╓F┬E┬D┬C┬B╥A┬9┬8┼7┬6┬5╥4┬3┬2┬1┬0╖
║   час   ║  минута   ║  сек/2  ║
╙─┴─┴─┴─┴─╨─┴─┴─┼─┴─┴─╨─┴─┴─┴─┴─╜
 ╚═══╦═══╝ ╚════╦════╝ ╚═══╦═══╝
     ║          ║          ╚══ 2-секундные единицы(0-31)
     ║          ╚═════════════ минута (0-63)
     ╚════════════════════════ час (0-31)

╓F┬E┬D┬C┬B┬A┬9╥8┼7┬6┬5╥4┬3┬2┬1┬0╖
║     год     ║ месяц ║  день   ║
╙─┴─┴─┴─┴─┴─┴─╨─┼─┴─┴─╨─┴─┴─┴─┴─╜
 ╚═════╦═════╝ ╚══╦══╝ ╚═══╦═══╝
       ║          ║        ╚════ день (0-31)
       ║          ╚═════════════ месяц (0-15)
       ╚════════════════════════ год - 1980 (0-127)

                  Рис.9. Формат полей даты и времени.


   Следует обратить  внимание на то, что несовпадение систем представле-
ния часов, секунд и минут с двоичной системой приводит к наличию некото-
рого "запаса"  в формате поля даты, что позволяет устанавливать "абсурд-
ное" время типа 31 ч 63 мин 62 с (рис.9). Поскольку ни одна из стандарт-
ных команд  MS DOS  не выдает  количество секунд  во времени образования
файла, то зна чение "62 секунды" поля секунд может использоваться (и ис-
пользуется) вирусами для отметки зараженных файлов.

   Аналогично может использоваться поле даты. Год создания файла хранит-
ся в  IBM PC в  виде остатка после вычитания 1980 (даты создания данного
компьютера). Некоторые  вирусы используют этот факт для пометки заражен-
ных файлов:  при заражении  они добавляют 100 к году создания файла. Это
приращение не  видно "невооруженным  глазом", поскольку как команда DIR,
так и  большинство оболочек выдает только две последние цифры года. Один
из вирусов устанавливает для зараженных файлов 13 месяц.


                                    номер начального кластера
Элемент каталога                      ║
╓───────────────┬─────┬─┬───┬───┬───┬─V─┬───────╖
║E X A M P L E  │C O M│a│...│tim│dat│08 │ длина ║
╙─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴───┴─┴─┴─┴─┴─╫─┴─┴─┴─┴─╜
                                      ║
      00  01  02  03  04  05  06  07  ║8  09  0A  0B  0C  0D  0E  0F
     ┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌V─┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐
  00 │ID││FF││FF││03═>04═>05═>FF││00││09═>0A═>0B═>15││00││00││00││00│
     └──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└╫─┘└──┘└──┘└──┘└──┘
                          ╔═══════════════════════╝
     ┌──┐┌──┐┌──┐┌──┐┌──┐┌V─┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐
  10 │00││00││00││00││00││16═>17═>19││F7││1A═>1B═>FF││00││00││00││00│
     └──┘└──┘└──┘└──┘└──┘└──┘└──┘└╫─┘└──┘└A─┘└──┘└──┘└──┘└──┘└──┘└──┘
                                  ╚═══════╝


            Рис.10. Пример элемента каталога и цепочки элементов FAT.


   Пример элемента  каталога показан  на рис.10.  Как видно  из рисунка,
файл EXAMPLE.COM занимает 10 кластеров. Первый кластер -- это кластер 08,
последний кластер -- 1B. Цепочка кластеров -- 8,9,0A,0B,15,16,17,19,1A,1B.
Каждый элемент  указывает на следующий элемент цепочки, а последний эле-
мент содержит специальный код. Кластер 18 помечен как плохой и не входит
в цепочку  распределения. Кластеры  6,7, 0C-14  и 1C-1F пусты и доступны
для распределения.  Еще одна  цепочка, возможно, начинается с кластера 2
(при условии,  что не показанные на рис.10 элементы каталога равны нулю)
и кончается  кластером 5. Чтобы узнать имя соответствующего файла, нужно
отыскать элемент  каталога с начальным номером кластера 2. Как уже отме-
чалось, кластеры нумеруются, начиная с двух (нулевой элемент использует-
ся для маркировки свободных кластеров, а поле первого кластера использу-
ется для поля Media).



                              Подкаталоги

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

   Каждый подкаталог  содержит два элемента, создаваемые MS DOS, которые
обеспечивают координаты  данного подкаталога в дереве иерархической фай-
ловой системы. Первым является элемент с именем ".", указывающий на пер-
вый кластер  в самом  подкаталоге, а  второй с  именем ".." указывает на
первый кластер  родителя данного  каталога. Эти два элемента также имеют
установленный бит 4 байта атрибутов.



                            Удаление файлов

   Когда файл стирается с диска, первая буква его имени заменяется на Е5
и все  элементы FAT,  соответствующие занимаемым  этим файлом кластерам,
обнуляются. При занесении нового файла в каталог он будет размещен в пе-
рвом свободном элементе.  Таким образом, простого  метода восстановления
удаленных файлов в  MS DOS принципиально  не существует. В  то же время,
поскольку информация в кластерах не уничтожается, принципиально возможно
восстановить файл путем  просмотра всех свободных  кластеров. Существуют
методы  восстановления  файлов  с  помощью  системных  утилит,  например
PCTools, но она правильно восстанавливает лишь те файлы, у которых номе-
ра кластеров в FAT расположены подряд по возрастанию номеров. PCTools (и
аналогичные ей  утилиты) фактически  читает из  каталога бывший элемент,
определяет по длине файла, сколько ему было выделено кластеров, и запол-
няет FAT. Поэтому для  успешного восстановления файла необходимо,  чтобы
дискета или винчестер периодически обрабатывались утилитой SpeedDisk  из
пакета Нортона, Compress из пакета PC Shell или любой другой аналогичной
утилитой.


   Таблица разделов  диска --  Partition Table  (только для  винчестера)

   MS DOS различает два типа дисков: физические и логические. Физический
диск --  это установленное  устройство (винчестер).  Обычно на компьютере
установлен один винчестер, хотя их может быть два или больше. Этот физи-
ческий диск может быть  разделен на несколько логических  дисков (разде-
лов). Сведения о положении логических дисков на физическом содержатся  в
специальной таблице, обычно  называемой Partition Table  (таблица разде-
лов), которая является составной часть так называемого главного бут-сек-
тора винчестера -- Master  Boot Record (MBR). Название  "главный бут-сек-
тор" (буквальный перевод термина Master Boot Record -- главная  загрузоч-
ная запись) связано с тем, что MBR первым загружается в оперативную  па-
мять, если загрузка операционной системы выполняется с винчестера.


     0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
    ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬
 00 │             начало кода начальной загрузки MBR
    └───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┤
 10
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┤
...  ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───╥───┴───┤
1B0           конец кода начальной загрузки MBR             ║ Первый
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───╫───┴───┤
1C0   раздел винчестера                                     ║ Второй
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───╫───┴───┤
1D0   раздел винчестера                                     ║ Третий
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───╫───┴───┤
1E0   раздел винчестера                                     ║ Четвер-
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───╫───┴───┤
1F0   тый раздел винчестера                                 ║ 55 AA │
    ├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───╨───┴───┘


              Рис.11. Структура таблицы разделов винчестера.



   MBR всегда  занимает первый  сектор винчестера (цилиндр 0, сторона 0,
сектор 1).  Как видно  из рис.11 и 12, он состоит из выполняемого кода и
таблицы разделов. Последняя расположена в конце сектора и состоит из че-
тырех 16-байтовых  элементов. Информация  в таблицу  разделов  заносится
утилитой Fdisk  или аналогичной  ей несистемной  утилитой. Просматривать
таблицу разделов  удобнее всего  с помощью DiskEditor из 5 версии утилит
Нортона или  NU из  версии 4.5.  Наличие таблицы  разделов позволяет  не
только иметь  несколько логических  дисков, но  и несколько операционных
систем на  одном диске  (например, MS DOS  и XENIX  или несколько разных
версий MS DOS).

    ┌───────┬───────┬───────┬───────┬───────┬───────┬───────╥───╥───╖
 10                                                         ║Bot║HdS║
    ╓───┴───╥───┴───╥───┴───╥───┴───┼───┴───╥───┴───┼───┴───╫───╨───╜
 20 ║Sec Cyl║Sys HdE║Sec Cyl║ младш.  старш.║ младш.  старш.║
    ╙───┴───╨───┴───╨───┴───╨───┴───┼───┴───╨───┴───┼───┴───╨───┴───┤

                         Рис.12. Структура элемента раздела
(поля показаны в тех положениях, в которых они расположены в дампе).
 Bot - флаг загрузки ( 0 - не загружаемый, 80h - загружаемый) [+0,1];
 HdS - начало раздела: номер головки [+1,1];
 <Sec> <Cyl> - начало раздела: сектор/цилиндр бут-сектора[+2,2];
 Sys -    код системы: 0 - неизв., 1 - DOS 12-бит FAT, 4 - 16-бит[+4,1];
 HdE -    конец раздела: номер головки [+5,1];
 <Sec> <Cyl> - конец раздела: сектор/цилиндр последнего сектора[+6,2];
 <младш>   <старш> - относительный номер начального сектора[+8,4];
 <младш>   <старш> - размер (число секторов)[+0Ch,4];
 далее (со  смещением 10h)  следует начало  следующего элемента  раздела
(или 0AA55h  для последнего  элемента). В  таблице разделов используется
абсолютная адресация.

 Значения цилиндра и сектора занимают 10 и 6 бит соответственно:

 ╓F┬E┬D┬C┬B┬A┬9┬8┼7┬6╥5┬4┬3┬2┬1┬0╖
 ║c c c c c c c c C C║s s s s s s║
 ╙─┴─┴─┴─┴─┴─┴─┴─┼─┴─╨─┴─┴─┴─┴─┴─╜
                 └─┬─┘   биты, обозначенные большими буквами С,
                   └──── являются старшими, т.е. при дешифровке
                         номера цилиндра они приписываются слева,
                         а не справа.

   Во время  загрузки ROM-BIOS загружает MBR и передает управление на ее
код. Этот код считывает таблицу разделов, чтобы определить раздел, поме-
ченный как загружаемый (Bootable). Затем в память считывается бут-сектор
из этого раздела и ему передается управление. Отсюда следует, что, зара-
жая винчестер,  вирус может  заменять не  только бут-сектор, но и MBR. И
действительно, существует несколько вирусов, использующих этот способ.

   Повреждение  MBR  ведет  к  тому,  что  логические  диски  становятся
недоступными. В  результате система  зависает при  загрузке. Обычно  MBR
можно восстановить  с помощью  Norton Disk Dоctor, однако надежнее иметь
резервную копию первых секторов каждого логического диска на специальной
дискете. В  случае повреждения  MBR при  загрузке экран дисплея остается
пустым с  курсором, мигающим в левом верхнем углу экрана. Восстановление
таблицы в случае тяжелых повреждений и отсутствия эталона можно провести
вручную, пользуясь  шаблоном, приведенным  на рис.11,12. Особенно удобно
использовать для  этой цели  утилиту Disk  Editor  из  5  версии  утилит
Нортона.
   Значение "относительного  сектора" по смещению 8 в каждом разделе эк-
вивалентно цилиндру,  дорожке и сектору начального адреса раздела. Отно-
сительный сектор  0 совпадает с цилиндром 0, дорожкой 0, сектором 1. От-
носительный номер  сектора увеличивается  сначала по  каждому сектору на
головке, затем по каждой дорожке и, наконец, по каждому цилиндру.

   Применима формула:
     отн_сек = (#Цил * сек_на_дор * дор_на_цил)
          + (#Гол * сек_на_дор) + (#Сек-1)

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

   Следует отметить,  что помимо  бутовых вирусов  в указанных  секторах
могут  хранить  информацию  другие  программы,  например  Advanced  Disk
Manager.  В   этом  случае   заражение   винчестера   бутовым   вирусом,
истользующим те  же сектора  ведет к  потере соответствующей информации.
Поэтому всегда  необходимо  иметь  резервную  копию  их  содержимого  на
специальной дискете.  На этой  же дискете  следует  хранить  копии  MBR,
бутсекторов всех  логических дисков,  копию CMOS  и другую  полезную для
восстановления системных блоков информацию.
