2

FileDisk-17オープンソース プロジェクトに基づいて暗号化仮想ディスクを開発したいと考えています。

これが私の解決策です:

ではIPR_MJ_READ、 がZwReadFile戻ってきたときに、関数 ' DecryptData' を使用して、 によって読み取られたデータを復号化しますZwReadFile

ではIPR_MJ_WRITE、 を呼び出す前にZwWriteFile、関数 ' EncryptData' を使用して、ディスクに書き込まれるデータを暗号化します。

EncryptData&DecryptData関数を 1 つの C ソース ファイルに入れました。

質問は; ドライバーをロードすると、 or関数ERROR_PROC_NOT_FOUND(127)に 1 行しかない場合でも、毎回エラー コードが表示されます。EncryptDataDecryptData

これの原因と修正方法を誰が教えてくれますか?

filedisk.c

switch (io_stack->MajorFunction)
        {
        case IRP_MJ_READ:
            system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
            if (system_buffer == NULL)
            {
                irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                irp->IoStatus.Information = 0;
                break;
            }
            buffer = (PUCHAR) ExAllocatePool(PagedPool, io_stack->Parameters.Read.Length);
            if (buffer == NULL)
            {
                irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                irp->IoStatus.Information = 0;
                break;
            }
            ZwReadFile(
                device_extension->file_handle,
                NULL,
                NULL,
                NULL,
                &irp->IoStatus,
                buffer,
                io_stack->Parameters.Read.Length,
                &io_stack->Parameters.Read.ByteOffset,
                NULL
                );
            *if(bEncrypt)
            {
                cipher = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool, irp->IoStatus.Information, 'TAG');
                if(cipher)
                {   
                    **DecryptData**(buffer, cipher, irp->IoStatus.Information);
                    RtlCopyMemory(system_buffer, cipher, irp->IoStatus.Information);
                    ExFreePool(cipher);
                }
                else
                {
                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                    irp->IoStatus.Information = 0;
                    break;
                }
            }*
            else
            {
                RtlCopyMemory(system_buffer, buffer, io_stack->Parameters.Read.Length);
                ExFreePool(buffer);
            }

crypto.c

    VOID EncryptData(PUCHAR src, PUCHAR dst, ULONG length)
{
    BF_LONG data[2];
    BF_KEY  key;

    BF_set_key(&key, pCryptoInformation->CryptoKey, sizeof(pCryptoInformation->CryptoKey));
}

VOID DecryptData(PUCHAR src, PUCHAR dst, ULONG length)
{
    BF_LONG data[2];
    BF_KEY  key;

    BF_set_key(&key, pCryptoInformation->CryptoKey, sizeof(pCryptoInformation->CryptoKey));
}
4

0 に答える 0