чтение исходных данных раздела PE32 + - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь прочитать раздел .pdata в x64 exe. Я сопоставляю файл с памятью, нахожу раздел .pdata, а затем использую его PointerToRawData, чтобы получить фактические данные раздела ...
Но тогда мой указатель "pdata" указывает на недопустимый адрес: (
Вот что я делаю:

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; 

Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

0 голосов
/ 30 марта 2012

Проблема была в том, как я отобразил файл в память.
Я должен был сделать это следующим образом:

void* mappingHandle = CreateFileMapping(fileHandle,
                    NULL,
                    PAGE_READONLY,
                    0,
                    0, //Here: 0 instead of 1
                    NULL);
...