Неожиданный вывод - PullRequest
       40

Неожиданный вывод

0 голосов
/ 09 марта 2012

Следующий код должен распечатывать имена всех разделов в указанном exe-файле (в данном случае c: \ connected 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 ]

1 голос
/ 09 марта 2012

проблема с вашим кодом, которую вы не читаете для правильного местоположения 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.

0 голосов
/ 01 мая 2012

Да, можно удалить заглушку DOS из образа. Если эта заглушка существует, загрузчик Windows игнорирует ее. Если эта заглушка не существует, загрузчик Windows будет доволен ею.

...