2012-03-14 2 views
0

다음 코드는 exe에서 섹션 헤더가 섹션 자체 뒤에 오거나 무언가 빠졌음을 나타 냅니까? 또한 lpFileBase의 값은 pimnth-> OptionalHeader.ImageBase에있는 값과 다릅니다. 그들은 동일하게되어 있지 않습니까 ?? OptionalHeader.ImageBase 필드에 포함exe의 섹션 헤더 위치

#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++; 
} 

} 
+0

가 [창에서 .EXE의 ImageBase와 정보] [1]이 질문에 대한 대답 [1] : http://stackoverflow.com/questions/3740976/about-imagebase-of-exe-in- 창문들 – mox

답변

0

값 (어드레스) 컴파일러/링커에 의해 배치된다. 변수와 함수가 호출 될 때 점프와 오프셋을 계산할 수 있으려면이 사전 정의 된 주소가 링커에 필요합니다. 로더의 첫 번째 작업 중 하나는 미리 정의 된 주소가 메모리에서 이미 사용되고 있는지 여부를 확인하는 것입니다 (DLL의 경우 종종 그렇습니다). 주소가 사용되지 않으면 lpFileBase는 OptionalHeader.ImageBase와 동일합니다.