Создание антивирусного программного обеспечения с применением языка программирования низкого уровня: Методические указания по выполнению лабораторных работ по курсу «Информационная безопасность», страница 3

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

Все драйвера Windows работают на 0-м кольце защиты (Ring 0) (наиболее высокие привилегии), что обеспечивает им возможность работы с устройствами напрямую. Естественно, что это значительно повышает вероятность сбоев, поэтому написание драйверов лежит на производителях оборудования, которые должны подвергать свои драйвера различным тестированиям и делать их код наиболее безошибочным. Также, все драйвера виртуальных устройств (VxD) считаются составной частью VMM, а не приложениями (программами), выполняемыми в контексте какой-либо виртуальной машины. Они выполняются как бы над всеми приложениями операционной системы, управляя их выполнением.

Более того, если читая MSDN и другие руководства по программированию под Windows Вы найдете огромное количество информации, программ и примеров программ с комментариями, то при написании собственного драйвера вы столкнетесь с проблемой отсутствия полной документации. Достаточно сравнить объемы – MSDN занимает около 1,5 гигабайт, в то время как Windows 98 DDK (точнее, его часть, содержащая описания и файлы справки) – только 10 Мб. Скорее всего Microsoft не особенно приятно разглашать все секреты и основополагающие концепции своей ОС.

Тем не менее, писать драйвера под Windows, начиная с 95-го (только OSR2) стало значительно проще, чем под Windows 3.1. Основным отличием является возможность динамической загрузки и выгрузки драйвера в процессе работы операционной системы (в Win 3.1 драйвер мог грузиться только до загрузки ОС). Это позволяет, вооружившись MASM, Windows 98 DDK и некоторыми знаниями в области программирования написать собственный драйвер, реализующий заданную функцию, выполнение которой просто программированием под Windows было бы затруднительно или вообще невозможно.

Структура VxD файла

Если Вы подумали, что здесь будет описана структура готового VxD файла, то, скорее всего Вы ошиблись. Здесь пойдет речь о структуре исходного ассемблерного файла, написанного для MASM.

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

Первые строчки, присутствующие в любом исходном коде драйвера должны подключать стандартные файлы, входящие в состав DDK:

.686p

include vmm.inc

include vwin32.inc

include shell.inc

include ifs.inc

include ifsmgr.inc

(Здесь все строчки, кроме первой, указывают на подключаемый файл, первая необходима для задания типа процессора, буква p при этом указывает MASM, что процессор находится в защищенном режиме).

За подключаемыми файлами следует описательная часть драйвера:

DECLARE_VIRTUAL_DEVICE  AV,4,0, AV_Control,\

UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER

Здесь «DECLARE_VIRTUAL_DEVICE» является именем макроса, определенного где-то в глубинах DDK.

«AV» – это имя драйвера, которое Вы можете выбрать по своему вкусу (в нашем случае, AV = AntiVirus). Запомните это имя и обозначьте его для себя как «имя», т.к. оно еще не раз нам пригодится.

4, 0 – это версия ОС, под которой может быть выполнен код этого драйвера. 4, 0 соответствует Windows 95 OSR 2. Это поле следует так и оставить.

«AV_Control» – это имя процедуры управления для драйвера, получается как «имя» (которое мы ввели ранее) + «_Control».

«UNDEFINED_DEVICE_ID» – идентификатор драйвера. Если загружаемый драйвер предназначен для замещения уже запущенного драйвера, эти идентификаторы у них должны быть одинаковыми, в противном случае необходимо указать «UNDEFINED_DEVICE_ID». Более того, начиная с Windows 95 OSR2 нет никакой необходимости получать идентификатор драйвера у Microsoft – просто укажите «UNDEFINED_DEVICE_ID».