意外的输出

时间:2012-03-09 15:34:43

标签: winapi executable exe portable-executable

以下代码应打印出指定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++;
    }

}

2 个答案:

答案 0 :(得分:1)

您的代码存在的问题是,您没有阅读IMAGE_NT_HEADERS结构的正确位置,您必须使用imdh.e_lfanew将文件的偏移量设置为fseek(fp, imdh.e_lfanew, 0);的值,然后阅读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格式的文章。

答案 1 :(得分:0)

是的,可以从图像中删除DOS存根。如果存在此存根,则Windows Loader会忽略它。如果此存根不存在,Windows Loader会对此感到满意。