从字节缓冲区到结构的转换有什么作用?
What does a cast from byte buffer to a struct do?
我正在尝试理解以下代码。
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 调用将在其中更新它的 return。我不明白的是之后会发生什么。什么操作
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER)lpBuffer;
做吗?据我所知,它是一个演员表,但我无法找到任何名为 PIMAGE_DOS_HEADER 的结构。我开始认为这不是演员表,这让我对这是什么操作感到困惑。下一行进一步伴随着:
pImage->FileHeader =
(PIMAGE_NT_HEADERS32)(lpBuffer + pDOSHeader->e_lfanew);
据我了解,lpBuffer 是一个字节数组,那么 () 这里的作用是什么?如何将字节数组添加到其他内容?
根据 Microsoft 惯例,类型 PIMAGE_DOS_HEADER
是定义指向 IMAGE_DOS_HEADER 结构的指针的类型定义。
因此,
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER)lpBuffer;
正在将 BYTE *
指针 lpBuffer
转换为更具体类型的 IMAGE_DOS_HEADER *
变量 pDOSHeader
,大概是希望 lpBuffer
在fact 指向 IMAGE_DOS_HEADER
结构(因为否则当您尝试通过指针读取结构成员变量时将调用未定义的行为)。
From what I gathered lpBuffer is a Byte Array, so what is the role of
the () here? How can you add a byte array to something else?
他们正在做指针数学。特别是他们将 pDOSHeader->e_lfanew
添加到 lpBuffer
的值,然后将结果指针转换为 PIMAGE_NT_HEADERS32
.
我正在尝试理解以下代码。
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 调用将在其中更新它的 return。我不明白的是之后会发生什么。什么操作
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER)lpBuffer;
做吗?据我所知,它是一个演员表,但我无法找到任何名为 PIMAGE_DOS_HEADER 的结构。我开始认为这不是演员表,这让我对这是什么操作感到困惑。下一行进一步伴随着:
pImage->FileHeader =
(PIMAGE_NT_HEADERS32)(lpBuffer + pDOSHeader->e_lfanew);
据我了解,lpBuffer 是一个字节数组,那么 () 这里的作用是什么?如何将字节数组添加到其他内容?
根据 Microsoft 惯例,类型 PIMAGE_DOS_HEADER
是定义指向 IMAGE_DOS_HEADER 结构的指针的类型定义。
因此,
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER)lpBuffer;
正在将 BYTE *
指针 lpBuffer
转换为更具体类型的 IMAGE_DOS_HEADER *
变量 pDOSHeader
,大概是希望 lpBuffer
在fact 指向 IMAGE_DOS_HEADER
结构(因为否则当您尝试通过指针读取结构成员变量时将调用未定义的行为)。
From what I gathered lpBuffer is a Byte Array, so what is the role of the () here? How can you add a byte array to something else?
他们正在做指针数学。特别是他们将 pDOSHeader->e_lfanew
添加到 lpBuffer
的值,然后将结果指针转换为 PIMAGE_NT_HEADERS32
.