如何解决从字节缓冲区到结构体的转换有什么作用?
我正在尝试理解以下代码。
PLOADED_IMAGE ReadRemoteImage(HANDLE hProcess,LPCVOID lpImageBaseAddress) {
BYTE* lpBuffer = new BYTE[BUFFER_SIZE];
BOOL bSuccess = ReadProcessMemory
(
hProcess,lpImageBaseAddress,lpBuffer,BUFFER_SIZE,0
);
if (!bSuccess)
return 0;
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER)lpBuffer;
PLOADED_IMAGE pImage = new LOADED_IMAGE();
pImage->FileHeader =
(PIMAGE_NT_HEADERS32)(lpBuffer + pDOSHeader->e_lfanew);
pImage->NumberOfSections =
pImage->FileHeader->FileHeader.NumberOfSections;
pImage->Sections =
(PIMAGE_SECTION_HEADER)(lpBuffer + pDOSHeader->e_lfanew +
sizeof(IMAGE_NT_HEADERS32));
return pImage;
}
该代码由 Windows API 调用 ReadProcessMemory 组成,该调用请求指向缓冲区的指针,API 调用将在该缓冲区中更新其返回值。我不明白的是之后是什么。什么操作
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER)lpBuffer;
做吗?据我所知,它是一个演员表,但是我无法找到任何名为 PIMAGE_DOS_HEADER 的结构。我开始认为它不是演员表,这让我难以理解这是什么操作。下一行进一步伴随:
pImage->FileHeader =
(PIMAGE_NT_HEADERS32)(lpBuffer + pDOSHeader->e_lfanew);
从我收集到的lpBuffer是一个Byte Array,那么这里的()有什么作用呢?如何将字节数组添加到其他内容中?
解决方法
遵循 Microsoftian 约定,类型 PIMAGE_DOS_HEADER
是定义指向 IMAGE_DOS_HEADER 结构的指针的 typedef。
因此,
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER)lpBuffer;
正在将 BYTE *
指针 lpBuffer
转换为更具体类型的 IMAGE_DOS_HEADER *
变量 pDOSHeader
,大概是希望 lpBuffer
实际上指向到 IMAGE_DOS_HEADER
结构体(否则,当您尝试通过指针读取结构成员变量时,您将调用未定义的行为)。
从我收集到的lpBuffer是一个字节数组,那么它的作用是什么 () 在这里?如何将字节数组添加到其他内容中?
他们正在做指针数学。特别是他们将 pDOSHeader->e_lfanew
添加到 lpBuffer
的值,然后将结果指针转换为 PIMAGE_NT_HEADERS32
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。