расположение заголовка раздела в exe - PullRequest
0 голосов
/ 14 марта 2012

Указывает ли следующий код, что в exe заголовок раздела идет после самого раздела, или я что-то упустил?Также значение lpFileBase отличается от значения, хранящегося в pimnth-> OptionalHeader.ImageBase.Разве они не должны быть одинаковыми ??

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


int main()
{


HANDLE  hFile,hFileMapping;
LPVOID lpFileBase;
LPVOID lp;
long offset;

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)(pimdh->e_lfanew + (char *)lpFileBase);


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



printf("Address of section header:%x\n",pimsh);

for(int i = 0; i<pimnth->FileHeader.NumberOfSections; i++)
{
    if(!strcmp((char *)pimsh->Name,".text"))
    {
        printf("Virtual Address:%x\n\n\n",pimsh->VirtualAddress);
    }
    pimsh++;
}

}

1 Ответ

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

Значение (адрес), содержащееся в поле OptionalHeader.ImageBase, размещается компилятором / компоновщиком. Этот предопределенный адрес необходим компоновщику для того, чтобы можно было рассчитать скачки и смещение при вызове переменных и функций. Одна из самых первых задач загрузчика - проверить, занят ли этот предопределенный адрес в памяти (что часто случается с DLL). Если адрес НЕ будет занят, тогда ваш lpFileBase будет таким же, как OptionalHeader.ImageBase.

...