Доступ к дисковым накопителям
Способ программирования доступа на физическом уровне к дисковым накопителям. Изучение метода прерываний. Разработка программы, которая ищет на заданном диске загрузочные записи, разделяя последние два байта каждого сектора на наличие в них сигнатуры.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 19.11.2010 |
Размер файла | 184,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное агентство по образованию Российской Федерации
ГОУ ВПО УГТУ - УПИ
Имени первого Президента Российской Федерации Б. Н. Ельцина
Кафедра автоматики и информационных технологий
Курсовой проект по дисциплине
«Системное програмное обеспечение»
Екатеринбург 2010
Содержание
Введение
Постановка задачи
Теоретическая часть
Инструкция программиста
Заключение
Приложение
Введение
Данный вопрос очень интересен со стороны защиты информации, а именно является одним из способов защитить важную информацию, записанную на дискету или жесткий диск. Так же по ходу выполнения курсовой работы будут рассмотрены и изучены другие немало важные знания по работе с дисковым накопителем, а именно использование прерываний и физический доступ к диску.
Постановка задачи
Написать программу, которая ищет на заданном диске загрузочные записи. Для этого в выбранном диске программа проверяет последние два байта каждого сектора на наличие в них сигнатуры (55АА).
Теоретическая часть
Таблица разделов и логические диски
При использовании специальных утилит для разбиения диска на части (диск-менеджеров) возможна установка для отдельных логических дисков защиты от записи. Вы можете записывать на такие диски неизменяющуюся информацию. Вред от программ-вирусов также будет меньше - вирус не сможет записать себя на защищенный диск.
Один диск может содержать несколько различных операционных систем, расположенных в разных разделах диска. В ходе начальной загрузки вы можете указать раздел диска, из которого должна производиться загрузка операционной системы.
По своей внутренней структуре логический диск полностью соответствует дискете, поэтому сначала рассмотрим логическую структуру жесткого диска, затем сделаем некоторые замечания, касающиеся дискет.
Самый первый сектор жесткого диска (сектор 1, дорожка 0, головка 0) содержит так называемую главную загрузочную запись (Master Boot Record). Эта запись занимает не весь сектор, а только его начальную часть. Сама по себе главная загрузочная запись является программой. Эта программа во время начальной загрузки операционной системы с жесткого диска помещается по адресу 7C00:0000, после чего ей передается управление. Загрузочная запись продолжает процесс загрузки операционной системы.
В конце самого первого сектора жесткого диска располагается таблица разделов диска (Partition Table). Эта таблица содержит четыре элемента, описывающих максимально четыре раздела диска. В последних двух байтах сектора находится число 55AA. Это признак таблицы разделов.
Элемент таблицы разделов диска- это структура размером 16 байтов, описывающая часть диска, называемую разделом. В структуре описаны границы раздела в терминах номеров сектора, дорожки и головки, там располагается информация о размере раздела в секторах и о назначении раздела. Разделы диска могут быть активными, активный раздел может быть использован для загрузки операционной системы. Диск может содержать одновременно несколько активных разделов, которые могут принадлежать разным операционным системам.
Формат первого сектора жесткого диска:
Смещение |
Размер |
Содержимое |
|
(+0) |
1BEh |
Загрузочная запись - программа, которая загружается и выполняется во время начальной загрузки операционной системы |
|
(+1BEh) |
10H |
Элемент таблицы разделов диска |
|
(+1CEh) |
10H |
Элемент таблицы разделов диска |
|
(+1DEh) |
10H |
Элемент таблицы разделов диска |
|
(+1EEh) |
10H |
Элемент таблицы разделов диска |
|
(+1FEh) |
2 |
Признак таблицы разделов - 55AAh |
Все элементы таблицы разделов диска имеют одинаковый формат:
Смещение |
Размер |
Содержимое |
|
(+0) |
1 |
Признак активного раздела:0 - раздел не активный;80h - раздел активный. |
|
(+1) |
1 |
Номер головки для начального сектора раздела. |
|
(+2) |
2 |
Номер сектора и цилиндра для начального сектора раздела в формате функции чтения сектора INT 13h. |
|
(+4) |
1 |
Код системы:0 - неизвестная система;1, 4 - DOS;5 - расширенный раздел DOS. |
|
(+5) |
1 |
Номер головки для последнего сектора раздела. |
|
(+6) |
2 |
Номер сектора и цилиндра для последнего сектора раздела в формате функции чтения сектора INT 13h. |
|
(+8) |
4 |
Относительный номер сектора начала раздела. |
|
(+12) |
4 |
Размер раздела в секторах. |
В самом первом секторе активного раздела расположена загрузочная запись (Boot Record), которую не следует путать с главной загрузочной записью (Master Boot Record). Загрузочная запись считывается в оперативную память главной загрузочной записью, после чего ей передается управление. Загрузочная запись и выполняет загрузку операционной системы.
Таким образом, загрузка операционной системы с жесткого диска - двухступенчатый процесс. Вначале модули инициализации BIOS считывают главную загрузочную запись в память по адресу 7C00:0000 и ей передается управление. Главная загрузочная запись просматривает таблицу разделов и находит активный раздел. Если активных разделов несколько, на консоль выводится сообщение о необходимости выбора активного раздела для продолжения загрузки.
После того как активный раздел найден, главная загрузочная запись считывает самый первый сектор раздела в оперативную память. Этот сектор содержит загрузочную запись, которой главная загрузочная запись и передает управление.
Загрузочная запись активного раздела выполняет загрузку операционной системы, находящейся в активном разделе.
Такой двухступенчатый метод загрузки операционной системы необходим по той причине, что способ загрузки зависит от самой операционной системы, поэтому каждая операционная система имеет свой собственный загрузчик. Фиксированным является только расположение загрузочной записи - самый первый сектор активного раздела.
Байт со смещением 0, является флагом активного раздела и может принимать одно из двух значений - 0 или 80h соответственно для неактивного и активного разделов диска.
Двухбайтовое слово, расположенное со смещением 8, содержит относительный номер первого сектора раздела.
Значение 0 соответствует дорожке 0, головке 0, сектору 1. При увеличении относительного номера сектора вначале увеличивается номер сектора на дорожке, затем номер головки, и, наконец, номер дорожки.
Для вычисления относительного номера сектора можно использовать следующую формулу:
RelSect = (Cyl * Sect * Head) + (Head * Sect) + (Sect -1)
В этой формуле:
Cyl - номер дорожки;
Sect - номер сектора на дорожке;
Head - номер головки.
Замечание, касающееся границ разделов диска: обычно разделы начинаются с четных номеров дорожек, за исключением самого первого раздела. Этот раздел может начинаться с сектора 2 нулевой дорожки (головка 0), так как самый первый сектор диска занят главной загрузочной записью.
Байт со смещением 4 - это код системы, использующей раздел диска. Для DOS зарезервированы значения 0, 1, 4, 5.
Значение 0 соответствует неиспользуемому разделу диска.
Если код системы в элементе таблицы раздела равен 1 или 4, это означает, что раздел используется DOS в качестве первичного раздела (Primary Partition). Первичный раздел используется DOS как логический диск. Этот раздел обычно является активным и из него выполняется загрузка операционной системы. В зависимости от того, какой код системы используется для обозначения первичного раздела DOS (1 или 4) меняется одна из характеристик логического диска - размер элемента таблицы размещения файлов (FAT). Код 1 используется для обозначения 12-битовой FAT, 4 - для 16-битовой FAT. Таблица размещения файлов будет описана ниже в этой главе.
Значение кода системы, равное 5, обозначает расширенный раздел DOS (Extended DOS Partiton).
Первичный раздел должен быть активным, он используется как диск С: и из него выполняется загрузка операционной системы. Расширенный раздел разбивается утилитой на логические диски D:, E: и т.д. Расширенный раздел не может быть активным, следовательно, невозможно выполнить загрузку операционной системы с логических дисков, расположенных в этом разделе.
Если в элементе таблицы разделов байт кода системы имеет значение 5, то в начале раздела, указанном в этом элементе, располагается сектор, содержащий таблицу логических дисков. Фактически эта таблица является расширением таблицы разделов диска, расположенной в самом первом секторе физического диска. Таблица логических дисков имеет формат, аналогичный таблице разделов диска, но имеет только два элемента. Один из них указывает на первый сектор логического диска DOS, он имеет код системы 1 или 4. Второй элемент может иметь код системы, равный 5 или 0. Если этот код равен 5, то элемент указывает на следующую таблицу логических дисков. Если код системы равен 0, то соответствующий элемент не используется.
Из сказанного выше следует, что таблицы логических дисков связаны в список, на начало этого списка указывает элемент таблицы разделов диска с кодом системы, равным 5.
Для таблицы логических дисков имеется отличие в использовании полей границ логических дисков: если код системы равен 1 или 4, эти границы вычисляются относительно начала расширенного раздела; для элемента с кодом системы 5 используется абсолютная адресация (относительно физического начала диска).
Загрузочная запись BOOT
Самый первый сектор логического диска (и самый первый сектор на системной дискете) занимает загрузочная запись (Boot Record). Эта запись считывается из активного раздела диска программой главной загрузочной записи (Master Boot Record) и запускается на выполнение. Задача загрузочной записи - выполнить загрузку операционной системы. Каждый тип операционной системы имеет свою загрузочную запись. Даже для разных версий одной и той же операционной системы программа загрузки может выполнять различные действия.
Кроме программы начальной загрузки операционной системы в загрузочной записи находятся параметры, описывающие характеристики данного логического диска. Все эти параметры располагаются в самом начале сектора, в его так называемой форматированной области.
Для MS-DOS BOOT-сектор имеет формат:
Смещение |
Размер |
Содержимое |
|
(+0) |
3 |
Команда JMP xxxx - переход типа NEAR на программу начальной загрузки |
|
(+3) |
8 |
Название фирмы-производителя операционной системы и версия |
|
(+11) |
25 |
Extended BPB - расширенный блок параметров BIOS |
|
(+36) |
1 |
Физический номер дисковода (0 -флоппи, 80h - жесткий диск) |
|
(+37) |
1 |
Зарезервировано |
|
(+38) |
1 |
Символ ')' - признак расширенной загрузочной записи |
|
(+39) |
4 |
Серийный номер диска (Volume Serial Number), создается во время форматирования диска |
|
(+43) |
11 |
Метка диска (Volume Label) |
|
(+54) |
8 |
Зарезервировано, обычно содержит запись типа 'FAT12, которая идентифицирует формат таблицы размещения файлов FAT |
Первые два поля в BOOT-секторе для DOS 4.0 аналогичны описанным раньше.
Поле со смещением (+38) всегда содержит символ ')'. Этот символ означает, что используется формат расширенной загрузочной записи операционной системы MS-DOS.
Серийный номер диска формируется во время форматирования диска на основе даты и времени форматирования. Это поле может быть использовано для определения факта замены диска в дисководе.
Метка диска формируется при форматировании и может быть изменена командой операционной системы LABEL. Одновременно метка диска помещается в корневой каталог.
Поле со смещением 11 содержит расширенный блок параметров BIOS. Он состоит из обычного BPB и дополнительного расширения:
(0) |
2 |
sect_siz |
Количество байтов в одном секторе диска. |
|
(+2) |
1 |
clustsiz |
Количество секторов в одном кластере. |
|
(+3) |
2 |
res_sect |
Количество зарезервированных секторов. |
|
(+5) |
1 |
fat_cnt |
Количество таблиц FAT. |
|
(+6) |
2 |
root_siz |
Максимальное количество дескрипторов файлов, содержащихся в корневом каталоге диска. |
|
(+8) |
2 |
tot_sect |
Общее количество секторов на носителе данных (в разделе DOS). |
|
(+10) |
1 |
media |
Байт-описатель среды носителя данных. |
|
(+11) |
2 |
fat_size |
Количество секторов, занимаемых одной копией FAT. |
|
---- Расширение стандартного BPB ----- |
||||
(+13) |
2 |
sectors |
Количество секторов на дорожке |
|
(+15) |
2 |
heads |
Количество магнитных головок |
|
(+17) |
2 |
hidden_l |
Количество скрытых секторов для раздела, который по размеру меньше 32 мегабайтов. |
|
(+19) |
2 |
hidden_h |
Количество скрытых секторов для раздела, превышающего по размеру 32 мегабайта. (Только для DOS 4.0). |
|
(+21) |
4 |
tot_secs |
Общее количество секторов на логическом диске для раздела, превышающего по размеру 32 мегабайта. |
Как обычный, так и расширенный блок параметров BIOS содержит байт-описатель среды media. Этот байт может служить для идентификации носителя данных и может содержать следующие величины, характеризующие носитель данных по количеству сторон диска и количеству секторов на дорожке.
DOS предоставляет программе возможность работы с так называемыми логическими номерами секторов. Это номера секторов внутри логического диска.
Для адресации сектора при помощи функций BIOS необходимо указывать номер дорожки, номер головки и номер сектора на дорожке. DOS организует "сквозную" нумерацию секторов, при которой каждому сектору логического диска присваивается свой уникальный номер. Порядок нумерации выбран таким, что при последовательном увеличении номера сектора вначале увеличивается номер головки, затем номер дорожки. Это сделано для сокращения перемещений блока головок при обращении к последовательным логическим номерам секторов.
Пусть, например, есть дискета с девятью секторами на дорожке. Сектор с логическим номером, равным 1, расположен на нулевой дорожке и для обращения к нему используется нулевая головка. Это самый первый сектор на дорожке, в терминах BIOS он имеет номер 1. Следующий сектор на нулевой дорожке имеет логический номер 2, последний сектор на нулевой дорожке имеет логический номер 9. Сектор с логическим номером 10 расположен также на нулевой дорожке. Это тоже самый первый сектор на дорожке, но теперь для доступа к нему используется головка с номером 1. И так далее, по мере увеличения логического номера сектора изменяются номера головок и дорожек.
Для работы с логическим диском (или дискетой) на уровне логических номеров секторов DOS предоставляет программам два прерывания - INT 25h (чтение сектора по его логическому номеру) и INT 26h (запись сектора по его логическому номеру). Вызов этих прерываний имеет различный формат для разных версий DOS.
INT 25h - Чтение сектора по его логическому номеру
дисковый накопитель программирование сигнатура
На входе: |
AL = Адрес дисковода (0 - A, 1 - B, ...) |
|
CX = Количество секторов, которые нужно прочитать |
||
DX = Логический номер начального сектора |
||
DS:BX = Адрес буфера для чтения |
||
На выходе: |
AH = Код ошибки при неуспешном завершении операции |
|
CF = 1, если произошла ошибка,0, если ошибки нет |
INT 26h - Запись сектора по его логическому номеру
На входе: |
AL = Адрес дисковода (0 - A, 1 - B, ...) |
|
CX = Количество секторов, которые нужно записать |
||
DX = Логический номер начального сектора |
||
DS:BX = Адрес буфера, сожержащего записываемые данные |
||
На выходе: |
AH = Код ошибки при неуспешном завершении операции |
|
CF = 1, если произошла ошибка,0, если ошибки нет |
Регистры DS:BX содержат адрес управляющего блока:
(0) |
4 |
Начальный номер логического сектора |
|
(+4) |
2 |
Количество секторов для чтения/записи |
|
(+6) |
4 |
FAR-адрес буфера для передачи данных |
Так как для задания начального номера логического сектора в этом управляющем блоке отводится 4 байта.
Очень важное замечание, касающееся только что рассмотренных прерываний DOS. Эти прерывания оставляют в стеке одно слово - старое значение регистра флагов. Поэтому после вызова прерывания должна следовать, такая команда:
pop ax
Содержимое BOOT-сектора может быть использовано для определения общего количества секторов на логическом диске (например, в программах проверки читаемости секторов диска), для работы с таблицей размещения файлов FAT, для определения других характеристик логического диска.
Инструкция программиста
Используемые функции:
BOOL GetDriveGeometry(DISK_GEOMETRY *pdg,char * let)
Функция возвращает информацию о диске. Параметр pdg выходной параметр в котором содержится информация о диске. Параметр let задает букву диска.
Структура Главной загрузочной записи (MBR) |
||
Адрес |
Содержимое |
|
0x0000 |
Код загрузчика |
|
0x01B8 |
4-х байтная сигнатура диска (только в Windows 2000, XP, но не в Windows 95/98) |
|
0x01BE |
Четыре 16-байтных записи таблицы основных разделов (только схема таблицы основных разделов MBR) |
|
0x01FE |
2-х байтная сигнатура MBR (0xAA55) |
Заключение
В результате проделанной курсовой работы, мной были получены важные знания об устройстве, и способе программирования доступа на физическом уровне к дисковым накопителям, рассмотрены различные способы обращения к данным на устройстве. А так же разработана программа, которая позволяет найти загрузочные записи диска.
Список литературы
1. Александр Фролов, Григорий Фролов Том 18, М.: Диалог-МИФИ, 1995, 254 стр
2. Александр Фролов, Григорий Фролов Том 19, М.: Диалог-МИФИ, 1995, 253 стр
3. Александр Фролов, Григорий Фролов Том 26, М.: Диалог-МИФИ, 1996, 272 стр
4. Александр Фролов, Григорий Фролов Том 27, М.: Диалог-МИФИ, 1996, 288 стр
5. http://www.excode.ru
6. http://www.hardline.ru/
Приложение
//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
BOOL GetDriveGeometry(DISK_GEOMETRY *pdg,char * let)
{
HANDLE hDevice; // дескриптор проверяемого устройства
BOOL bResult; // флажок результата
DWORD junk; // сбрасываем результаты
// strcat(str1, trimr(let));
// strcat(str1, ":dsf");
hDevice = CreateFile(strcat("\\\\.\\",strcat(let, ":")), // открываемое устройство
GENERIC_READ, // нет доступа к устройству
FILE_SHARE_READ | // режим совместного использования
FILE_SHARE_WRITE,
NULL, // атрибуты безопасности по умолчанию
OPEN_EXISTING, // расположение
0, // атрибуты файла
NULL); // не копировать атрибуты файла
if (hDevice == INVALID_HANDLE_VALUE) // невозможно открыть устройство
{
return (FALSE);
}
bResult = DeviceIoControl(hDevice, // запрошенное устройство
IOCTL_DISK_GET_DRIVE_GEOMETRY, // выполняемая операция
NULL, 0, // буфера ввода нет
pdg, sizeof(*pdg), // буфер вывода
&junk, // # возвращено байтов
(LPOVERLAPPED) NULL); // синхронизация ввода/вывода (I/O)
CloseHandle(hDevice);
return (bResult);
}
int main(int argc, char *argv[])
{
char * str = (char*)malloc (1);
printf ("Enter drive letter: ");
scanf ("%1s",str);
DISK_GEOMETRY pdg; // геометрическая структура дискового устройства
BOOL bResult; // флажок общих результатов
ULONGLONG DiskSize; // размер диска, в байтах
bResult = GetDriveGeometry (&pdg,str);
if (bResult)
{
printf("Cylinders = %I64d\n", pdg.Cylinders);
printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);
DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
printf("Disk size = %I64d (Bytes) = %I64d (Gb)\n", DiskSize,
DiskSize / (1024 * 1024 * 1024));
}
else
{
printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
}
HANDLE hDevice; // дескриптор проверяемого устройства
// сбрасываем результаты
hDevice = CreateFile(strcat("\\\\.\\",str), // открываемое устройство
GENERIC_READ, // нет доступа к устройству
FILE_SHARE_READ | // режим совместного использования
FILE_SHARE_WRITE,
NULL, // атрибуты безопасности по умолчанию
OPEN_EXISTING, // расположение
0, // атрибуты файла
NULL); // не копировать атрибуты файла
if (hDevice == INVALID_HANDLE_VALUE) // невозможно открыть устройство
{
printf ("Error %ld.\n", GetLastError ());
} else{
ULONGLONG i;
char* data = (char*)malloc (512);
DWORD dwBytesRead;
DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack ; //вычисляем размер диска
printf("Sectors = %I64d\n", DiskSize);
for (i=0; i<DiskSize; i++) {
ReadFile(hDevice, data, 512, &dwBytesRead, NULL); // считываем каждый сектор
int z55= (int) data[510];
int zaa= (int) data[511];
if (z55==85 && zaa==-86){ // если в конце сектора есть флаг 55АА
printf ("%02X",(unsigned char) data[510]);
printf ("%02X found ",(unsigned char) data[511]);
printf ("in sector: %ld \n", (ULONG)i); // выводим соответсвующее сообщение
3>4;
}
SetFilePointer (hDevice, (i*512), NULL, FILE_CURRENT); // сдвигаем указатель
}
CloseHandle(hDevice);
return ((int)bResult);
}
Результат работы программы:
Размещено на Allbest.ru
Подобные документы
Особенности работы и создания компьютерного вируса - вредоносной программы, которая самостоятельно может создавать свои копии и внедрять их в программы, файлы, документы, загрузочные сектора носителей данных. Признаки заражения ПК вирусом, способы защиты.
реферат [24,9 K], добавлен 26.03.2010Создание программы на языке программирования С#, которая проверяет наличие в матрице хотя бы одного столбца, содержащего положительный элемент, поиск его номера. Упорядочивание его элементов по возрастанию. Листинг программы и инструкция по работе с ней.
курсовая работа [1,9 M], добавлен 28.05.2014Особенности инициализации регистров для дисковых операций чтения, записи и верификации. Анализ метода доступа к дисковой памяти, поддерживающей использование оглавления, блокирование и разблокирование записей. Обеспечение адресации дисковых секторов.
лабораторная работа [43,4 K], добавлен 20.11.2012Принципы и алгоритмы обработки прерываний. Набор действий по реализации этапов обработки прерываний микропроцессора. Разработка структуры и алгоритма резидентной программы. Реализация программы на языке Ассемблер, методы её отладки и тестирования.
курсовая работа [348,7 K], добавлен 22.12.2014Разработка программы, обеспечивающей ввод и редактирование информации (новостей) об объектах в соответствии с заданной предметной областью. ER-модель базы. Исходный код программы. Доступ к данным, осуществляемый с использованием средств JDBC или ODBC.
лабораторная работа [624,1 K], добавлен 13.11.2014Наличие активного (регистрирующего) слоя в диске CD-R (заготовка для записи). Точные значения ширины, глубины и угла наклона боковых стенок. Требуемая мощность лазера при записи. Типы красителей, отражающий, защитный и декоративный слои компакт-диска.
реферат [251,6 K], добавлен 03.04.2010Основные задачи защиты операционных систем: идентификация, аутентификация, разграничение доступа пользователей к ресурсам, протоколирование и аудит. Проблема контроля доступа в компьютерную систему. Разработка программы управления матричным принтером.
курсовая работа [118,9 K], добавлен 22.06.2011Защита от несанкционированного доступа. Классификация автоматизированных систем и требования по защите информации. Средство защиты информации от несанкционированного доступа Secret Net 6.0. Разработка интерфейсной части программы, целевых функций.
дипломная работа [1,2 M], добавлен 20.12.2013Разработка программы FileInfo, выдающей полную информацию о заданном файле с применением языка программирования С++, используя API функции Win 32. Использование пространств имён .NetFramework. Руководство пользователя и системные требования программы.
курсовая работа [1,2 M], добавлен 25.04.2012Изучение основ программирования и создание полноценного приложения в среде программирования Delphi. Разработка эскизного и технического проектов программы. Внедрение выполнения программы. Разработка рабочего проекта, спецификация и текст программы.
курсовая работа [560,1 K], добавлен 18.07.2012