windows - sektionsoverskrift placering i en exe

Indlæg af Hanne Mølgaard Plasc

Problem



Indikerer følgende kode, at i en exe kommer sektionsoverskriften efter selve afsnittet, eller mangler jeg noget?
Også værdien af ​​lpFileBase er forskellig fra værdien i pimnth-> OptionalHeader.ImageBase. Aren t de skulle være det samme ??


#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
",pimsh);

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


",pimsh->VirtualAddress);
    }
    pimsh++;
}

}

Bedste reference


Værdien (adressen) indeholdt i feltet OptionalHeader.ImageBase placeres af kompilatoren/linkeren. Denne foruddefinerede adresse er nødvendig af linkeren for at kunne beregne spring og forskydning, når variabler og funktioner påberåbes. En af de allerførste opgaver for læseren er at kontrollere, om denne foruddefinerede adresse allerede er optaget i hukommelsen (hvilket ofte er tilfældet for DLL'er). Skulle adressen IKKE blive besat, så vil din lpFileBase være den samme som OptionalHeader.ImageBase.