Драйвер контроля доступа
Процедура распределения 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 для тестирования криптографических функций и других функций обеспечения безопасности с заданной периодичностью, например, один раз в минуту.