반응형
김성우 해킹, 파괴의 광학 6장 예제 6-3을 조금 변형했다. 소스의 저작권이 좀 아리까리한데, 일반적인 예제코드라 생각하여 저자의 허락없이 변형하여 올렸다. (혹시 저작권자가 이 글을 보고, 문제를 제기한다면 요청대로 처리하겠다.)
우선 vmmap 에서, 아래 kernel32.dll 이 메모리 상에 두 개가 있고, 하나는 하늘색의 Mapped File, 다른 하나는 자주색의 Image이다.
아래는 ollydbg로 그 메모리 부분의 내용을 본 것. 프로그램으로 읽어볼 수도 있었겠다.
0x400 크기 만큼이 동일하고, 이건, Image의 Header의 크기와 같다. 이에 대해서는 PE 포맷에 대한 책을 다시 훑어보고, 어떻게 각 섹션이 로딩되며 배치되는지 살펴보면 이해가 될 것이겠다.
#include <windows.h>이 결과에 대해 좀 더 알고 싶어서 vmmap과 ollydbg로 좀 봤다.
#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 에서, 아래 kernel32.dll 이 메모리 상에 두 개가 있고, 하나는 하늘색의 Mapped File, 다른 하나는 자주색의 Image이다.
아래는 ollydbg로 그 메모리 부분의 내용을 본 것. 프로그램으로 읽어볼 수도 있었겠다.
0x400 크기 만큼이 동일하고, 이건, Image의 Header의 크기와 같다. 이에 대해서는 PE 포맷에 대한 책을 다시 훑어보고, 어떻게 각 섹션이 로딩되며 배치되는지 살펴보면 이해가 될 것이겠다.
728x90
'프로그래밍 > 미분류' 카테고리의 다른 글
[MSDNArchive|번역] 내 프로세스는 가상화되었나? (0) | 2010.07.13 |
---|---|
윈도우즈 ntdll.dll 0x7c930000 (0) | 2010.04.28 |
[WINDOWS] DLL 매핑 주소 알아보기 (0) | 2009.12.30 |
[WINDOWS] 비스타 이후버전 무결성 (integrity level) 보기, 바꾸기 툴. (0) | 2009.12.02 |
2의 거듭제곱 (10만승까지) 벤포드 법칙 무식쟁이 방법으로 확인. (2) | 2009.07.30 |