2015-10-17 21 views
1

我試圖讀取C中的PE文件。 我有代碼MZ,然後我不知道代碼e_lfanew讀取C中的PE文件

#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

通常會定義一個名爲DOS_Header的結構體並從文件中讀取完整的結構體。該結構然後具有場e_lfanew它可以直接無需指針算術等

e_lfanew然後指向PE簽名(PE\0\0),隨後COFF頭部進行訪問。然後重複這個故事:創建一個名爲COFF_Header的結構並從文件中讀取完整的結構...

0

由於@thomas weller說你需要將你的緩衝區轉換爲IMAGE_DOS_HEADER。

最後一個字段告訴你PE標題的位置,然後讀取該偏移量並將緩衝區轉換爲IMAGE_NT_HEADER。另一種方式是僅僅映射文件並對相關的緩衝存儲器進行類型轉換。

0

要獲得有關任何標題信息的詳細信息,您可以直接將其填充到結構中,例如IMAGE_DOS_HEADER imgDosHdr = {0};

FILE * fp = fopen(「Path_to_Pe」,「rb」);

if(fp == NULL)return;

fseek(fp,0,SEEK_SET);

fread(& imgDosHdr,1,sizeof(IMAGE_DOS_HEADER),fp);

fclose(fp);因此,您可以通過設置 fseek來獲取PE文件標題的所有詳細信息。