2012-03-13 3 views
0

PEファイルのインポートテーブルに最初のエントリ(user32.dllと仮定します)の名前を出力しようとしていますが、プログラムは予期せず "メモリを読み込めません"と言って終了します。PEファイルのインポートテーブルの最初のエントリの名前を出力する

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


int main() 
{ 


HANDLE hFile,hFileMapping; 
LPVOID lpFileBase; 
LPVOID lp; 

if((hFile = CreateFile(TEXT("c:\\linked list.exe"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)) == INVALID_HANDLE_VALUE) 
    std::cout<<"unable to open"; 

if((hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL)) == 0) 
{ 
    CloseHandle(hFile); 
    std::cout<<"unable to open for mapping"; 
} 

if((lpFileBase = MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0))== 0) 
{ 
    CloseHandle(hFile); 
    CloseHandle(hFileMapping); 
    std::cout<<"couldn't map view of file"; 
} 

PIMAGE_DOS_HEADER pimdh; 
pimdh = (PIMAGE_DOS_HEADER)lpFileBase; 

PIMAGE_NT_HEADERS pimnth; 
pimnth = (PIMAGE_NT_HEADERS)((char *)pimdh + pimdh->e_lfanew); 

PIMAGE_SECTION_HEADER pimsh; 
pimsh = (PIMAGE_SECTION_HEADER)(pimnth + 1); 

int i; 
for(i = 0; i<pimnth->FileHeader.NumberOfSections; i++) 
{ 
    if(!strcmp((char *)pimsh->Name,".idata")) 
    { 
     char *p; 

     PIMAGE_IMPORT_DESCRIPTOR pimid; 
     pimid = (PIMAGE_IMPORT_DESCRIPTOR)(pimnth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (char *)lpFileBase); 
     p = (char *)((char *)lpFileBase + pimid->Name); 
     printf("%s",p); 
    }; 

    pimsh++; 
} 



} 

答えて

1

You asked a similar question数日前に、あなたが私の答えの三分の二を読んだあなたのコードを見ています。

もう1つは、pimid->Nameはファイルオフセットではなく、相対的な仮想アドレス(RVA)で、ファイルオフセットに変換する必要があると言います。だからこそあなたは誤りを抱えています。 RVAs read the MSDN articleを理解する。変換を行うサンプルコードについては、記事で参照されているpedumpをご覧ください。

関連する問題