【问题标题】:Why is my driver only reading part of the string?为什么我的驱动程序只读取部分字符串?
【发布时间】:2019-02-14 09:25:07
【问题描述】:

我正在尝试从带有内核驱动程序的虚拟程序中读取字符串。但是只读取了前 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 在它应该打印 stringChar 时总是打印 stri,并将 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 个字符。

【问题讨论】:

  • *string = (std::string)Values.buffer -- 如果Values.buffer 可以包含空字节,则此分配不会将所有字节复制到*string。您想要的是使用带有指针和大小的std::string 构造函数。

标签: c++ string kernel driver


【解决方案1】:

问题出在这里:

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

这与sizeof(int) 相同(我猜,在您的平台上是4)。

使用128sizeof(buffer)(可以说后者更好,因为您不会在多个地方硬编码相同的常量)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 2017-09-15
    • 2014-12-22
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多