Иллюстрированный самоучитель по программированию систем защиты

Драйвер контроля доступа

Определение имени процесса

Реализация драйвером функции получения имени обращающегося к ресурсу процесса необходима для создания системы защиты от НСД не ниже 3 класса по классификации Руководящих документов Государственной технической комиссии РФ, определяющих защищенность средств вычислительной техники (СВТ) или класса 1В по классификации защищенности автоматизированных систем (АС). При этом может быть поддержана полная модель полномочного (мандатного) доступа, определяющая возможность контроля доступа обращений к ресурсу от имени конкретного процесса.

Имя обращающегося к ресурсу процесса находится в структуре, описывающей объект-процесс. Чтобы получить смещение имени процесса в объекте-процессе, надо во время инициализации драйвера в функции DriverEntry (которая всегда исполняется в контексте процесса System) найти строку "System" в объекте-процессе, описывающем процесс:

System: ULONG GetProces'sNameOffset ().
PEPROCESS int
curproc;
i; curproc = PsGetCurrentProcess (); for(i = 0; i < 3*PAGE_SIZE; i++) {
if(!strncmp("System", (PCHAR) curproc + i, strlen ("System"))) {
return i;.
//имя не найдено return 0;

После удачного завершения этой функции можно использовать возвращенное ею значение ProcessNameOffset для определения имени процесса:

VOID GetProcess (PCHAR Name)
{
PEPROCESS curproc;
char *nameptr;
ULONG i;
if(ProcessNameOffset) { s
curproc = PsGetCurrentProcess ();
nameptr = (PCHAR) -curproc + ProcessNameOffset;
strncpy(Name, nameptr, 16); } else {
strcpy(Name, "???");

Получив имя процесса, можно определить его конкретные полномочия по доступу к объектам. Например, далее по тексту будет использоваться возможность вызова функций драйвера только процессом Winlogon, в контексте которого работает GINA. Таким образом, можно гарантировать передачу параметров и управление драйвером только со стороны модифицированной библиотеки.

Вывод сообщений на "синий" экран

Если флаг Start в реестре у драйвера установлен в SERVICE_BOOT_ START(0) или SERVICE_SYSTEM_START(1), то можно использовать функцию вывода на "синий" экран – ZwDisplayString для вывода информации о действиях драйвера во время инициализации.

Например:

UNICODE_STRING 'bootMessagpUnicodeString;
WCHAR bootMessage [] = L"\nMessage on blue screen. \n\n";
CTL CODE(FILE DEVICE TDRV, 0x01,
CTL CODE(FILE DEVICE TDRV, 0x02,
RtlInitUnicodeString(sbootMessageUnicodeString, bootMessage);
 ZwDisplayString(SbootMessageUnicodeString);

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.