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

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

Процедура распределения IRP_MJ_DEVICE_CONTROL драйвера контроля доступа

Для взаимодействия с драйвером модифицированная библиотека GINA может использовать определенные контрольные коды, которые должен обрабатывать драйвер, например:

tdefine TDRV_hook (ULONG) CTL_CODE(FILEJ)EVICE_TDRV, 0x00,
METHOD_BUFFERED, FILE_ANY_ACCESS)
#define TDRV_unhook (ULONG)
METHOD_BUFFERED, FILE_ANY_ACCESS
#define TDRV_setkey (ULONG)
METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define TDRV_test (ULONG) CTL_CODE(FILE_DEVICE_TDRV, 0x03,
METHOD_BUFFERED, FILE_WRITE_ACCESS).

Тогда процедура обработки контрольных кодов драйвера Tdrv может быть следующей:

BOOLEAN TdrvDeviceCon.trol (IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
IN PVOID InputBuffer, IN ULONG InputBufferLength,
OUT PVOID OutputBuffer, IN ULONG OutputBufferLength,
IN ULONG loControlCode, OUT PIO_STATUS_BLOCK loStatus,
IN PDEVICE_OBJECT DeviceObject) { UCHAR ProcName[256];
int tg_gina_work, i;
IoStatus › Status = STATUS_SUCCESS; IoStatus › Information = 0;
switch (loControlCode) { case TDRV_version:
//возвратить версию драйвера контроля доступа *(ULONG *)OutputBuffer = TDRVVERSION;
 IoStatus › Information = sizeof(ULONG);
break;
case TDRV_hook:
//заменить обработчики открытия, //создания и удаления файлов HookFileOperation(); break;
case TDRV_unhook:
//восстановить обработчики открытия, //создания и удаления файлов UnhookRegistry(); break;
case TDRV_test:
//протестировать криптографические функции в //процедуре test_crypto {
tg_no_work=0;
if(test_crypto()!=0) tg_no_work=l; break;
}
case TDRV_setkey:
//передать ключ шифрования драйверу, //если текущий процесс winlogon {
tg_gina_work=0;. GetProcess(ProcName); ToLowerStr(ProcName);
// условная процедура перевода символов в // строчные
if(strcmp(ProcName,"winlogon.exe")==0) tg_gina_work=l;
if ((InputBufferLength!= sizeof(TDRV_IOCTL)) || (InputBuffer == NULL) I I (tg_gina_work==0))
{
IoStatus › Status = 1; break;
} RtlMoveMemory(UserKey,,
((PTDRV_IOCTL)InputBuffer) › UserKey,
KEY_SIZE); RtlMoveMemory(Userld,
((PTDRV_IOCTL)InputBuffer)-XJserld, USER ID SIZE); "
RtlMoveMemory(UserStatus, l
((PTDRV_IOCTL)InputBuffer) › UserStatus,
USER_STATUS_SIZE); IoStatus › Status = STATUS_/_SUCCESS; break;
default:
IoStatus › Status – STATUS_INVALID_DEVICE_REQUEST; break;
return TRUE;

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

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