2012-03-09 172 views
0

下面的代碼應該打印出指定的exe中的所有部分(在這種情況下是c:\ linked list.exe)的名稱,但它會產生一些奇怪的輸出。意外的輸出

#include<iostream> 
#include<Windows.h> 
#include<stdio.h> 
#include<WinNT.h> 

int main() 
{ 
    FILE *fp; 
    int i; 

    if((fp = fopen("c:\\Linked List.exe","rb"))==NULL) 
     std::cout<<"unable to open"; 


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


    IMAGE_NT_HEADERS imnth; 
    fread(&imnth,sizeof(imnth),1,fp); 

    IMAGE_SECTION_HEADER *pimsh; 
    pimsh = (IMAGE_SECTION_HEADER *)malloc(sizeof(IMAGE_SECTION_HEADER) * imnth.FileHeader.NumberOfSections); 

    fread(pimsh,sizeof(IMAGE_SECTION_HEADER),imnth.FileHeader.NumberOfSections,fp); 

    for(i=0;i<imnth.FileHeader.NumberOfSections;i++) 
    { 
     printf("%s\n",pimsh->Name); 
     pimsh++; 
    } 

} 

回答

1

的問題與你的代碼,是你是不是閱讀的正確位置IMAGE_NT_HEADERS結構,具有較好必須使用fseek(fp, imdh.e_lfanew, 0);設置文件的imdh.e_lfanew值的偏移量,然後讀取IMAGE_NT_HEADERS記錄。

試試這個修改後的代碼。

#include "stdafx.h" 
#include<iostream> 
#include<Windows.h> 
#include<stdio.h> 
#include<WinNT.h> 

int main() 
{ 
    FILE *fp; 
    int i; 

    if((fp = fopen("c:\\Linked List.exe","rb"))==NULL) 
     std::cout<<"unable to open"; 

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

    //set the pointer of the file to the location of the IMAGE_NT_HEADERS record 
    fseek(fp, imdh.e_lfanew, 0); 
    IMAGE_NT_HEADERS imnth; 
    fread(&imnth,sizeof(imnth),1,fp); 

    IMAGE_SECTION_HEADER *pimsh; 
    pimsh = (IMAGE_SECTION_HEADER *)malloc(sizeof(IMAGE_SECTION_HEADER) * imnth.FileHeader.NumberOfSections); 

    fread(pimsh,sizeof(IMAGE_SECTION_HEADER),imnth.FileHeader.NumberOfSections,fp); 

    for(i=0;i<imnth.FileHeader.NumberOfSections;i++) 
    { 
     printf("%s\n",pimsh->Name); 
     pimsh++; 
    } 

    getchar(); 
} 

另外看看這些關於PE格式的文章。

+0

我也想問你,是否有可能從PE中刪除DOS存根。 – user1232138 2012-03-09 17:08:07

0

是有可能從圖像中刪除DOS存根。如果此存根存在,Windows加載程序將忽略它。如果這個存根不存在,Windows Loader對此感到滿意。