Драйвер, шифрующий данные
От: ReadOnly  
Дата: 09.10.12 14:08
Оценка:
Добрый день. Я пишу драйвер, который смог бы правильно отображать данные лишь на компе, на котором установлен специальный драйвер. Именно так.
То есть мне нужно при записи / чтении шифровать и дешифровывать данные соответственно. Изучал статьи Хакера — http://www.xakep.ru/post/26996/default.asp , книгу Солдатова, но так и не понял, как мне правильно перехватывать команды чтения и записи, чтобы можно было изменять передаваемые данные.

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

ЗЫ. Собирал несколько драйверов через WinDDK для XP (в нем есть исходники USB \osrusbfx2\), собрал успешно. Но когда их пытался поставить через KmdManager, то он выдавал ошибку: "Не удается найти указанный файл". Скорее всего была ошибка при сборке, так как эти драйвера не могут содержать ошибок — все таки сам мелкософт писал...
Re: Драйвер, шифрующий данные
От: x64 Россия  
Дата: 09.10.12 15:33
Оценка:
RO>Я пишу драйвер, который смог бы правильно отображать данные лишь на компе...

Какие именно данные шифровать собрался (файлы, том, диск, ...)?

RO>...на котором установлен специальный драйвер.


Этот момент требует дополнительных пояснений.
Re: Драйвер, шифрующий данные
От: angry.andrew Украина  
Дата: 09.10.12 20:14
Оценка:
Если нужно шифровать сразу весь дисковый том, то хорошим началом может быть изучение проекта TrueCrypt (http://www.truecrypt.org/).
А хранение ключа на самом накопителе — это не секьюрно вообще нифига. Лучше каким-то образом генерить ключ из пароля или хранить его где-то отдельно (откуда его никто не сможет достать).
Re[2]: Драйвер, шифрующий данные
От: x64 Россия  
Дата: 09.10.12 20:47
Оценка:
AA>...хорошим началом может быть изучение проекта TrueCrypt...

По теме ещё DiskCryptor, например, есть.
Re[2]: Драйвер, шифрующий данные
От: ReadOnly  
Дата: 10.10.12 12:47
Оценка:
Здравствуйте, x64, Вы писали:

x64>Какие именно данные шифровать собрался (файлы, том, диск, ...)?

Все. Сейчас поясню: любые файлы, которые будут передаваться на этот USB накопитель должны быть зашифрованы. В идеале — эти данные невозможно будет прочесть с компа, на котором не установлен ЭТОТ драйвер. Именно драйвер. (см. продолжение)

x64>Этот момент требует дополнительных пояснений.

(продолжение ->) Мне не нужны программы, которые шифруют данные, это я уже делал, правда не сильно хорошо получилось — но речь не об этом. Сейчас мне нужно свести шифрование на уровень драйвера. В исходниках некоторых драйверов (стандартных, прилагающихся к WinDDK) есть пример подобного драйвера и даже его поэтапное написание (видимо для самообучения). Вот код, который, по моему мнению, и нужно пускать на шифрование:
VOID 
EvtIoRead(
    IN WDFQUEUE         Queue,
    IN WDFREQUEST       Request,
    IN size_t           Length
    )   
{
    WDFUSBPIPE                  pipe;
    NTSTATUS                    status;
    WDFMEMORY                   reqMemory;
    PDEVICE_CONTEXT             pDeviceContext;
    BOOLEAN                     ret;
    
    UNREFERENCED_PARAMETER(Length);

    pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
    
    pipe = pDeviceContext->BulkReadPipe;
    
    status = WdfRequestRetrieveOutputMemory(Request, &reqMemory);
    if(!NT_SUCCESS(status)){
        goto Exit;
    }
   
    status = WdfUsbTargetPipeFormatRequestForRead(pipe,
                                        Request,
                                        reqMemory,
                                        NULL // Offsets
                                        ); 
    if (!NT_SUCCESS(status)) {
        goto Exit;
    }

    WdfRequestSetCompletionRoutine(Request,
                            EvtRequestReadCompletionRoutine,
                            pipe);
    ret = WdfRequestSend(Request, 
                    WdfUsbTargetPipeGetIoTarget(pipe), 
                    WDF_NO_SEND_OPTIONS);
    
    if (ret == FALSE) {
        status = WdfRequestGetStatus(Request);
        goto Exit;
    } else {
        return;
    }
   
Exit:
    WdfRequestCompleteWithInformation(Request, status, 0);

    return;
}

VOID
EvtRequestReadCompletionRoutine(
    IN WDFREQUEST                  Request,
    IN WDFIOTARGET                 Target,
    PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
    IN WDFCONTEXT                  Context
    )
{    
    NTSTATUS    status;
    size_t      bytesRead = 0;
    PWDF_USB_REQUEST_COMPLETION_PARAMS usbCompletionParams;

    UNREFERENCED_PARAMETER(Target);
    UNREFERENCED_PARAMETER(Context);

    status = CompletionParams->IoStatus.Status;
    
    usbCompletionParams = CompletionParams->Parameters.Usb.Completion;
    
    bytesRead =  usbCompletionParams->Parameters.PipeRead.Length;
    
    if (NT_SUCCESS(status)){
        KdPrint(("Number of bytes read: %I64d\n", (INT64)bytesRead));  
    } else {
        KdPrint(("Read failed - request status 0x%x UsbdStatus 0x%x\n",
                status, usbCompletionParams->UsbdStatus));

    }

    WdfRequestCompleteWithInformation(Request, status, bytesRead);

    return;
}


Это только процедуры чтения. Но какая из них работает напрямую с памятью разобраться не смог. Так же хочу обратить внимание, что при сборке драйвера и попытке его установки на XP системе происходит ошибка:
>ЗЫ. Собирал несколько драйверов через WinDDK для XP (в нем есть исходники USB \osrusbfx2\), собрал успешно. Но когда их пытался поставить через KmdManager, то он выдавал ошибку: "Не удается найти указанный файл".

AA>А хранение ключа на самом накопителе — это не секьюрно вообще нифига. Лучше каким-то образом генерить ключ из пароля или хранить его где-то отдельно (откуда его никто не сможет достать).

Конечно же не хранить полностью ключ на накопителе )) Лишь часть, а остальное доставать, к примеру, из номера накопителя и из этого набора генерировать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.