在C中读取PE文件

时间:2015-10-17 04:48:40

标签: portable-executable

我正在尝试用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;但是,我想从中学习并自己动手。

3 个答案:

答案 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。