我正在尝试用C读取一个PE文件。
我有代码MZ
然后,我不知道代码e_lfanew
。
#include <stdio.h>
#include <Windows.h>
int main()
{
errno_t err;
FILE *fp = NULL;
char *buffer;
err = fopen_s(&fp, "D:\\pe.exe", "rb");
printf("----------dos header---------- \n");
buffer = new char[3]; // malloc: cap phat bo nho//
memset(buffer, 0x0, sizeof(char)* 3); // memset: gan gia tri cho buffer//
fread(buffer, 2 * sizeof(char), 1, fp);
printf("e_magic: %s \n", buffer);
}
此外,我知道这可以通过Win32 API
;但是,我想从中学习并自己动手。
答案 0 :(得分:0)
通常,人们会定义一个名为DOS_Header的结构,并从文件中读取完整的结构。那个结构有一个字段e_lfanew
,可以在没有指针算术等的情况下直接访问。
e_lfanew
指向PE签名(PE\0\0
),然后指向COFF标头。然后故事重复:创建一个名为COFF_Header的结构,并从文件中读取完整的结构...
答案 1 :(得分:0)
正如@thomas weller所说,你需要将缓冲区强制转换为IMAGE_DOS_HEADER。
最后一个字段告诉您PE头的位置,然后读取该偏移量并将缓冲区强制转换为IMAGE_NT_HEADER。另一种方法是仅将文件映射并对相关的缓冲区内存进行类型转换。
答案 2 :(得分:0)
要获取有关任何标题信息的详细信息,您可以直接将其填充到结构中,例如` IMAGE_DOS_HEADER imgDosHdr = {0};
FILE * fp = fopen(&#34; Path_to_Pe&#34;,&#34; rb&#34;);
if(fp == NULL)return;
FSEEK(FP,0,SEEK_SET);
的fread(安培; imgDosHdr,1,的sizeof(IMAGE_DOS_HEADER),FP);
fclose(fp);因此您可以通过设置获取PE文件标题的所有详细信息 FSEEK。