Tag Archive for 'dump'

[debugging] dmp2bmp - dump로 장난하기..

디미트리 아저씨가 공개한 dmp2picture 라는 프로그램을 조금 수정하여 만들어 봤습니다.
http://www.dumpanalysis.org/blog/index.php/2008/02/05/dump2picture-v11-source-code/

.dmp format을 .bmp로 변환해주는 프로그램인데 디미트리 아저씨와 다른 점은 실재 Memory 영역만을 bmp로 변환한다는 점입니다. dump의 Header 부분을 잘라내고 Physical Memory 영역만을 화면상에 보여주지요.

download :  dump2bmp ( 이 프로그램은 커널 덤프와만 함께 동작합니다. )

32bit Complete Dump ( resize 화면 )

 

32bit Summary Dump ( resize 화면 )

이 이미지로 Dump 분석을 한다는 마음 보다는 재미로 한번 해보시길 바랍니다. 생각보다 재미 있습니다. 그리고 잼있는 내용은 덤프 Complete Dump Bitmap으로는 User 영역의 Physical Memory 사용양과 Kernel 영역의 Physical Memory 사용양의 차이를 Visual 하게 확인 할 수 있다는점..  디미트리 아저씨 말로는 메모리 전체 상태를 보면 Thread 상태확인이 된다는데 .. 훔 도대체 무슨 이야기인지 이해할 수준이 아직 되지 못하기 때문에 ㅜ.ㅜ

그냥 즐기십시요..~~

Enjoy Debugging

[debugging] Kernel Dump File 구조 ( Enjoy Programming )

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 …