2012-03-09 16 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

0

はい、画像からDOSスタブを除去することが可能です。このスタブが存在する場合、Windowsローダーはそれを無視します。このスタブが存在しない場合、Windowsローダーはそれに満足しています。