본문 바로가기

프로그래밍/미분류

[WINDOWS] 메모리상의 맵파일과 이미지 비교

반응형
김성우 해킹, 파괴의 광학 6장 예제 6-3을 조금 변형했다. 소스의 저작권이 좀 아리까리한데, 일반적인 예제코드라 생각하여 저자의 허락없이 변형하여 올렸다. (혹시 저작권자가 이 글을 보고, 문제를 제기한다면 요청대로 처리하겠다.)


#include <windows.h>
#include <stdio.h>

int CompareMappedAndAutoLoaded(char *szDllPath)
{
       int i, result;
       //char szDllPath[] =
       BYTE *pMapFile, *pDll;
       DWORD dwSize;
       DWORD dwSameSize = 1;
       HANDLE hFile, hFileMap;
       char c;

       hFile = CreateFile(szDllPath,
                       GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL, NULL);

       hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
       dwSize = GetFileSize(hFile, 0);
       pMapFile = (BYTE*)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, dwSize);

       pDll = (BYTE*) GetModuleHandle(szDllPath);

       printf("For %s\n", szDllPath);
       if(!memcmp(pDll, pMapFile, dwSize/2))
               printf("Same!!");
       else
       {
               printf("Different!!\n");
               while(!memcmp(pDll, pMapFile, dwSameSize))
               {
                       dwSameSize++;
               }
               dwSameSize--;
               printf("pDll(0x%X) and pMapFile(0x%X) is same for the first 0x%X  bytes (%d/%d = %f %%)"
                               , pDll
                               , pMapFile
                               , dwSameSize
                               , dwSameSize
                               , dwSize
                               , dwSameSize*1.0/dwSize);
       }

       scanf("%c", &c);

       UnmapViewOfFile(pMapFile);
       CloseHandle(hFileMap);
       CloseHandle(hFile);


       return 0;
}

int main()
{
       char szDllPath[MAX_PATH];

       sprintf(szDllPath, "c:\\windows\\system32\\KERNEL32.dll");
       CompareMappedAndAutoLoaded(szDllPath);
       sprintf(szDllPath, "c:\\windows\\system32\\NTDLL.dll");
       CompareMappedAndAutoLoaded(szDllPath);
       return 0;
}
이 결과에 대해 좀 더 알고 싶어서 vmmap과 ollydbg로 좀 봤다.

우선 vmmap 에서, 아래 kernel32.dll 이 메모리 상에 두 개가 있고, 하나는 하늘색의 Mapped File, 다른 하나는 자주색의 Image이다.
사용자 삽입 이미지

아래는 ollydbg로 그 메모리 부분의 내용을 본 것. 프로그램으로 읽어볼 수도 있었겠다.

사용자 삽입 이미지

0x400 크기 만큼이 동일하고, 이건, Image의 Header의 크기와 같다. 이에 대해서는 PE 포맷에 대한 책을 다시 훑어보고, 어떻게 각 섹션이 로딩되며 배치되는지 살펴보면 이해가 될 것이겠다.



728x90