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