【发布时间】: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构造函数。