windows - Hvad returnerer MapViewOfFile?

Indlæg af Hanne Mølgaard Plasc

Problem




   Mulig duplikat:

  Hvorfor vil loaderen ikke belastes på det ønskede sted





'MapViewOfFile', lagrer denne funktion en fil i den virtuelle hukommelse og returnerer basisadressen til den kortlagte hukommelse ?? Hvis ja, så skal følgende kode udlæse 0X400000, beacuse som standard, exe ss er indlæst på dette sted, men output er 0X360000. Hvorfor ??


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


int main()
{


HANDLE  hFile,hFileMapping;
LPVOID lpFileBase;


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";
}

printf("\%x
",lpFileBase);

}

Bedste reference


Den undersøgte 0X400000 har intet at gøre med normal filmapping.


Du kan forestille MapViewOfFile som en malloc + memcpy af den fil, du åbner, intet mere (under hætten er det omvendt: malloc kan bruge en hukommelseskort). Så MapViewOfFile vælger normalt bare en adresse, hvor den kan tilpasses filvisningen i bytes kontinuerligt i hukommelsen.


Hvad du sandsynligvis vil have (da du forsøger at kortlægge en .exe), er at oprette en ny proces med det CreateProcess. [4]


Hvis du virkelig har brug for filen, der skal kortlægges på en bestemt adresse, kan du bruge MapViewOfFileEx, men der er ingen garantier. [5]

Andre referencer 1


Ja, MapViewOfFile returnerer den virtuelle hukommelsesadresse, hvor billedet er indlæst. Værdien (indholdet) af denne adresse afhænger af, om billedet er blevet indlæst på den foruddefinerede adresse (som er blevet opsat af linkeren) eller om billedet er flyttet (fordi den ønskede foruddefinerede adresse allerede er optaget eller fordi den billedet har opt-in til at understøtte ASLR). [6]

Andre referencer 2


At konvertere en RVA til en filforskydning, find et delta og brug det. Jeg antager, at du forsøger at gøre noget som at se på, hvor en RVA i data-katalogstrukturen i en PE-fil peger på efter hukommelseskortning af PE-filen? Se på IMAGE\_SECTION\_HEADER struct:


typedef struct \_IMAGE\_SECTION\_HEADER {  
BYTE    Name[IMAGE\_SIZEOF\_SHORT\_NAME];  
union {  
          DWORD   PhysicalAddress;  
          DWORD   VirtualSize;  
  } Misc;  
  DWORD   VirtualAddress;  
  DWORD   SizeOfRawData;  
  DWORD   PointerToRawData;  
  DWORD   PointerToRelocations;  
  DWORD   PointerToLinenumbers;  
  WORD    NumberOfRelocations;  
  WORD    NumberOfLinenumbers;  
  DWORD   Characteristics;  
} IMAGE\_SECTION\_HEADER, *PIMAGE\_SECTION\_HEADER;  


Du vil gerne lave et delta ved at finde forskellen i sektionens VirtualAddress og PointerToRawData værdi. Derefter, for en RVA i et givet afsnit, subtraherer deltaet for at få filen forskydet.


I min erfaring er det anderledes for hvert afsnit. Så hvis du har en RVA i den anden sektion, der er angivet i sektionstabellen, vil deltaet afvige fra det andet afsnit, der er angivet i sektionstabellen. Til dette hjælper det med at få en funktion til at bestemme, hvilken sektion en RVA peger på. Og du bør redigere dit spørgsmål for at vise, at dette er spørgsmålet, du spørger.