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

       

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



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

 



Содержание раздела