Почему мой драйвер читает только часть строки? - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь прочитать строку из фиктивной программы с драйвером ядра. Но читаются только первые 4 символа, я не могу понять, почему.

Часть кода IOCTL для чтения строки:

else if (ControlCode = IO_READ_STRING_REQUEST)
{
    PREAD_REQUEST Values = (PREAD_REQUEST)buffer;
    PREAD_REQUEST ValuesOutput = (PREAD_REQUEST)buffer;
    PEPROCESS process;

    if (NT_SUCCESS(PsLookupProcessByProcessId(PID, &process)))
    {
        KeReadProcessMemory(process, Values->Address, &ValuesOutput->buffer, Values->Size);
        DbgPrint((PCSTR)Values->buffer);
        status = STATUS_SUCCESS;
    }
    else
        status = STATUS_INVALID_PARAMETER;

    BytesIO = sizeof(READ_REQUEST);
}

Это структура чтения:

typedef struct ReadStruct
{
    ULONGLONG Address;
    ULONGLONG Response;
    ULONGLONG Size;
    char buffer[128];

} READ_REQUEST, *PREAD_REQUEST;

DbgPrint всегда печатает stri, когда должен печатать stringChar, и stri возвращается в пользовательский режим.

Вот как он вызывается из пользовательского режима:

void ReadString(std::string *string, DWORD64 address)
{
    ReadValues Values;
    std::memset(Values.buffer, '\0', 128);
    Values.Address = address;
    Values.Response = 0;    
    Values.Size = sizeof(128);

    if (!(DeviceIoControl(hDriver, IO_READ_STRING_REQUEST, &Values, sizeof(Values), &Values, sizeof(Values), 0, 0)))
    {
        std::cout << "RPM Failed!\n";
        exit(1);
    }

    *string = (std::string)Values.buffer;
}

Структура такая же:

struct ReadValues
{
    ULONGLONG Address;
    ULONGLONG Response;
    ULONGLONG Size;
    char buffer[128];
};

Я думал, что это размер, но когда я указал размер 11 (10 + \ 0), он также прочитал только 4 символа.

1 Ответ

0 голосов
/ 10 сентября 2018

Проблема здесь:

Values.Size = sizeof(128);
              ^^^^^^^^^^^

Это то же самое, что и sizeof(int) (который, я бы предположил, равен 4 в вашей платформе).

Либо используйте 128, либо sizeof(buffer) (последний, возможно, лучше, поскольку вы не будете жестко кодировать одну и ту же константу в нескольких местах).

...