Добрый день. Я пишу драйвер, который смог бы правильно отображать данные лишь на компе, на котором установлен специальный драйвер. Именно так.
То есть мне нужно при записи / чтении шифровать и дешифровывать данные соответственно. Изучал статьи Хакера —
http://www.xakep.ru/post/26996/default.asp , книгу Солдатова, но так и не понял, как мне правильно перехватывать команды чтения и записи, чтобы можно было изменять передаваемые данные.
Также мне нужно будет как то хранить ключ, с помощью которого и будет происходить шифрование.. Думаю, что на самом накопителе его можно будет запрятать и запретить для любых действий, разве что форматирование сможет его стереть.
ЗЫ. Собирал несколько драйверов через WinDDK для XP (в нем есть исходники USB \osrusbfx2\), собрал успешно. Но когда их пытался поставить через KmdManager, то он выдавал ошибку: "Не удается найти указанный файл". Скорее всего была ошибка при сборке, так как эти драйвера не могут содержать ошибок — все таки сам мелкософт писал...
Если нужно шифровать сразу весь дисковый том, то хорошим началом может быть изучение проекта TrueCrypt (
http://www.truecrypt.org/).
А хранение ключа на самом накопителе — это не секьюрно вообще нифига. Лучше каким-то образом генерить ключ из пароля или хранить его где-то отдельно (откуда его никто не сможет достать).
Здравствуйте, 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>А хранение ключа на самом накопителе — это не секьюрно вообще нифига. Лучше каким-то образом генерить ключ из пароля или хранить его где-то отдельно (откуда его никто не сможет достать).
Конечно же не хранить полностью ключ на накопителе )) Лишь часть, а остальное доставать, к примеру, из номера накопителя и из этого набора генерировать...