download source : analyze
윈도우즈에서 기본적으로 제공 되는 Kernel Dump는 크게 3가지가 있습니다. Mini Dump, Summary Dump, Complete Dump… 이 3가지 덤프는 기본적으로 동일한 Header를 가지고 있으며 각 Dump File 마다 조금씩 다른 Sub Header를 가지고 있습니다.
typedef struct _DUMP_HEADER
{
CHAR szSignature[4];
CHAR szValidDump[4];
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwDirectoryTableBase;
PULONG pPfnDataBase;
PLIST_ENTRY pPsLoadedModuleList;
PLIST_ENTRY pPsActiveProcessHead;
DWORD dwMachineImageType;
DWORD dwNumberProcessors;
DWORD dwBugCheckCode;
DWORD dwBugCheckParameter1;
DWORD dwBugCheckParameter2;
DWORD dwBugCheckParameter3;
DWORD dwBugCheckParameter4;
CHAR dwVersionUser[32];
DWORD dwPaeEnabled:1;
PVOID pKdDebuggerDataBlock;
} DUMP_HEADER, *PDUMP_HEADER;
덤프 Header 부분에는 OS Version , Bugcheck 정도 , Active Thread Link, Loaded Module 등 여러가지 정보가 있지요. Windbg와 함께 설치되는 dumpchk 툴을 사용하면 쉽게 이러한 내용들을 볼 수 있습니다. (직접 확인해 보시길.. ) Summary Dump와 Mini Dump의 경우 이러한 header외에 각각의 Sub Header를 가지고 있습니다.
typedef struct _MINI_DUMP_HEADER
{
DWORD dwServicePackBuild;
DWORD dwSizeOfDump;
DWORD dwValidOffset;
DWORD dwContextOffset;
DWORD dwExceptionOffset;
DWORD dwMmOffset;
DWORD dwPrcbOffset;
DWORD dwProcessOffset;
DWORD dwThreadOffset;
DWORD Unknown[2];
DWORD dwDriverListOffset;
DWORD dwDriverCount
DWORD dwTriageOptions;
} MINI_DUMP_HEADER, *PMINI_DUMP_HEADER;
typedef struct _SUMMARY_DUMP_HEADER
{
DWORD dwUnkown1;
DWORD dwValidDump;
DWORD dwUnkown2;
DWORD dwHeaderSize;
DWORD dwBitmapSize;
DWORD dwPages;
DWORD dwUnknown3;
DWORD dwUnknown4;
}
SUMMARY_DUMP_HEADER, *PSUMMARY_DUMP_HEADER;;
이러한 Sub Header의 역할은 덤프에 포한된 Memory의 Access를 위해서 필요한 정보들을 담고 있지요 . Complete Dump의 경우는 PHYSICAL_MEMORY_DESCRIPTOR 정보를 통해서 Virtual Memory 또는 Physical Memory를 Access 하지만 Summery Dump의 경우는 Kernel Mode Memory Bitmap Block이라는 것을 사용해서 Virtual Memory와 Physical Memory를 Access 하게되죠 ..
( Physical Memory와 Virtual Memory간 상호 변환에 대한 것은 Windows Internals를 참고 하시길 )..
// Physical Memory Discriptor for Complete Dump
typedef struct _PHYSICAL_MEMORY_RUN
{
PFN_NUMBER BasePage;
PFN_NUMBER PageCount;
} PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
{
PFN_NUMBER NumberOfRuns;
PFN_NUMBER NumberOfPages;
PHYSICAL_MEMORY_RUN Run[1];
}
PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
// Kernel Mode Memory Bitmap for Summery Dump
typedef struct _RTL_BITMAP
{
DWORD dwSizeOfBitMap;
PULONG pBuffer;
}
RTL_BITMAP, *PRTL_BITMAP ;
이러한 구조를 잘 이해 하면 간단한 덤프 Analysis가 가능합니다. 사실 이러한 구조를 이해하고 Windbg와 같은 멋진 툴을 만들어 보면 좋겠지만 .. 사실 Windbg의 막강함을 구현하기는 쉽지 않죠 . 그래서 제가 할 수 있는 것을 해보았지요 .


Enjoy …
최근 답글