FileBuffer->ImageBuffer->NewBuffer->存盘
一.主要函数实现
1.PE文件到FileBuffer
这个过程还是单纯的只是PE文件的读取,详情见上一章,这里只截取部分代码
2.FileBuffer到ImageBuffer
这是个文件拉伸的过程,如果PE文件的SectionAlignment(内存对齐)和FileAlignment(硬盘对齐)不一样,而我们要读取到的ImageBuffer空间是要将PE文件进行拉伸的,那么申请的ImageBuffer空间大小就是可选PE头里面的SizeOfImage,这个函数在以后解析也会经常用到,所以单独写出来这个函数,如下
函数名称:
- Copy_FileBufferToImageBuffer
函数功能:
- 将读取到FileBuffer空间的PE文件拉伸存储到ImageBuffer空间
DWORD Copy_FileBufferToImageBuffer(IN void* FileBuffer, OUT void** ImageBuffer)
{
//先将用到的结构体指针定义出来
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
//判断传进来的FileBuffer指针是否存在
if (!FileBuffer)
{
printf("为空指针!!,无效!!");
return 0;
}
//上面如果有效,那么就给那些结构体指针赋值
pDosHeader = (PIMAGE_DOS_HEADER)FileBuffer;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)FileBuffer + pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader + 4);
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + 20);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);
//判断是否是MZ标志
if (*(WORD*)pDosHeader != IMAGE_DOS_SIGNATURE)
{
printf("这不是有效的MZ标志!!");
return 0;
}
//判断是否是有效的PE标志
if (*(DWORD*)pNTHeader != IMAGE_NT_SIGNATURE)
{
printf("这不是有效的PE标志!!");
return 0