Учебник по программированию систем безопасности

Глава 2. Общая архитектура Windows NT

Глава 3. Сетевая архитектура Windows NT

  • Глава 4. Анализ сетевой архитектуры ОС Windows NT с точки зрения возможностей реализации средств защиты и анализа сетевого трафика
  • Глава 5. Общие вопросы обеспечения безопасности в операционной среде Windows NT/2000

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