windows - læsning af PE32 + sektionens rå data

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at læse .pdata sektionen af ​​en x64 exe.
Jeg mapper filen til hukommelsen og finder .pdata sektionen, og så bruger jeg det s PointerToRawData for at komme til de faktiske data i sektionen ...

Men så peger min 'pdata' peger på en ulovlig adresse :(

Dette er hvad jeg gør:


void* mappingHandle = CreateFileMapping(fileHandle,
                    NULL,
                    PAGE\_READONLY,
                    0,
                    1,
                    NULL);
char* fileMemory  = (char*)MapViewOfFile(mappingHandle, FILE\_MAP\_READ, 0, 0, 1);
IMAGE\_DOS\_HEADER* dosHeader = (IMAGE\_DOS\_HEADER*)fileMemory;
IMAGE\_SECTION\_HEADER* pdataSectionHeader = NULL;
if (dosHeader->e\_magic == IMAGE\_DOS\_SIGNATURE) // "MZ" signature
{
    IMAGE\_NT\_HEADERS* ntHeaders = (IMAGE\_NT\_HEADERS*)(fileMemory + dosHeader->e\_lfanew);
    if (ntHeaders->Signature == IMAGE\_NT\_SIGNATURE) // Supposed to be "PE"
    {
        unsigned int sectionCount = ntHeaders->FileHeader.NumberOfSections; 
        IMAGE\_SECTION\_HEADER* sectionHeaders = IMAGE\_FIRST\_SECTION(ntHeaders);
        pdataSectionHeader = sectionHeaders + 3; // Going to .pdata section.
    }
}
unsigned long pdataSize = pdataSectionHeader->SizeOfRawData;
char* pdata = fileMemory + pdataSectionHeader->PointerToRawData; 


kan nogen fortælle mig, hvad jeg gør forkert?

Bedste reference


Problemet var i den måde, jeg kortfilede filen til hukommelsen.

Jeg burde have gjort det på denne måde:


void* mappingHandle = CreateFileMapping(fileHandle,
                    NULL,
                    PAGE\_READONLY,
                    0,
                    0, //Here: 0 instead of 1
                    NULL);