2012-03-17 3 views
1

다음 4 줄의 코드를 foo.exe라는 파일에 컴파일하여 전역 변수 'i'(즉, 9)의 값이 다음과 같은 데이터 섹션에 포함되기를 기대했습니다. 에서 foo.exe는 exe의 데이터 섹션에있는 데이터

int i = 9;  
int main() 
{ 
} 

은 그럼 내가 정말에서 foo.exe의 데이터 섹션에 있었다 있는지 확인하려면 다음 코드를 사용하지만, 사람이 무엇이 잘못되었는지 설명해 주시겠습니까 .. 아무것도 찾지 못했습니다. . ??

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


int main() 
{ 

HANDLE hFile; 
HANDLE hFileMapping; 
LPVOID lpFileBase; 
PIMAGE_DOS_HEADER dosHeader; 

hFile = CreateFile(TEXT("foo.exe"), GENERIC_READ, FILE_SHARE_READ, NULL, 
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 

if (hFile == INVALID_HANDLE_VALUE) 
{ 
    printf("Couldn't open file with CreateFile()\n"); 
    return 0; 
} 

hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); 
if (hFileMapping == 0) 
{ 
    CloseHandle(hFile); 
    printf("Couldn't open file mapping with CreateFileMapping()\n"); 
    return 0; 
} 

lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0); 
if (lpFileBase == 0) 
{ 
    CloseHandle(hFileMapping); 
    CloseHandle(hFile); 
    printf("Couldn't map view of file with MapViewOfFile()\n"); 
    return 0; 
} 


PIMAGE_DOS_HEADER pimdh; 
pimdh = (PIMAGE_DOS_HEADER)lpFileBase; 

PIMAGE_NT_HEADERS pimnth; 
pimnth = (PIMAGE_NT_HEADERS)((char *)lpFileBase + pimdh->e_lfanew); 

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

PIMAGE_IMPORT_DESCRIPTOR pimid; 
long delta; 

for(int i = 0; i<pimnth->FileHeader.NumberOfSections;i++) 
{ 
    if(!strcmp((char *)pimsh->Name,".data")) 
    { 
     DWORD base = (DWORD)lpFileBase; 
     for(DWORD start = pimsh ->PointerToRawData; start <= (pimsh->PointerToRawData + pimsh->SizeOfRawData); start++) 
     { 
      if(*((int *)(start + base)) == 9) 
      { 
       printf("found"); 
       break; 
      } 
     } 
    } 
    pimsh++; 
} 

} 

답변

3

컴파일러 (링커)는 변수가 코드에서 사용되지 않았기 때문에 이미지 파일에 변수를 넣지 않았습니다!