windows - Udskriv navnet på den første post i importtabellen af ​​en PE-fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at udskrive navnet på den første post (som jeg formoder er user32.dll) i importtabellen af ​​en PE-fil, men programmet afslutter uventet med at 'kan ikke læse hukommelse', kan nogen venligst forklare mig hvorfor ??


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



}

Bedste reference


Du stillede et lignende spørgsmål for et par dage siden og kigger på din kode, du har læst to tredjedele af mit svar.


Den anden tredje siger, at pimid->Name ikke er en filforskydning, det er en relativ virtuel adresse (eller RVA), som du skal konvertere til en filforskydning. Det er derfor du får en fejl. RVA'er læser MSDN-artiklen. For eksempelkode skal konverteringen se på pedump, der henvises til i artiklen. [5]