从字节缓冲区到结构体的转换有什么作用?

问题描述

我正在尝试理解以下代码

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