【问题标题】:Printing out the name of the first entry in the imports table of a PE file打印出 PE 文件导入表中第一个条目的名称
【发布时间】:2012-03-13 16:48:30
【问题描述】:

我试图在 PE 文件的导入表中打印出第一个条目的名称(我想是 user32.dll),但程序意外终止说“无法读取内存”,有人可以解释一下吗为什么??

#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++;
}



}

【问题讨论】:

    标签: windows executable exe portable-executable


    【解决方案1】:

    You asked a similar question 几天前,看着你的代码,你已经阅读了我三分之二的答案。

    另外三分之一表示pimid-&gt;Name 不是文件偏移量,它是相对虚拟地址(或 RVA),您需要将其转换为文件偏移量。这就是为什么你得到一个错误。了解 RVA read the MSDN article。有关进行转换的示例代码,请查看文章中引用的pedump

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多