gpt4 book ai didi

c++ - 为什么我的驱动程序只读取字符串的一部分?

转载 作者:行者123 更新时间:2023-11-27 23:43:59 25 4
gpt4 key购买 nike

我正在尝试使用内核驱动程序从虚拟程序中读取字符串。但只有前 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 个字符。

最佳答案

问题出在这里:

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

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

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

关于c++ - 为什么我的驱动程序只读取字符串的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52249392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com