Download
<사용 방법>
"fastdd64 [덤프할 파일 이름]"
알림) fastdd32, 64의 실행파일 및 드라이버 바이너리의 디지털서명은 Four&Six Tech.의 지원을 받아 수행되었습니다. http://4n6tech.com
개인적인 사정으로 인해 현재 포스팅 중단 중입니다. :(
시간되는 대로 다시 시작하도록 하지요.
오늘 'Paradox Conference 2011'에서 윈도우즈 물리 메모리 포렌식과 관련하여 발표를 하고 왔습니다. 아래는 발표자료 다운로드 링크입니다.
Download
재미있었는지는 모르겠지만, 경청해주신 많은 분들께 감사드립니다.
윈도우즈 시스템에서의 물리 메모리는 일반적으로 win32dd 또는 mdd 등의 도구를 이용하여 수집합니다. 이러한 도구들은 여러가지 방법을 이용하여 물리 메모리에 접근하게 되는데, 이번 포스팅은 윈도우즈 시스템에서 물리 메모리에 접근하여 이를 덤프하는 방법에 대한 글입니다.
UNICODE_STRING usPhysicalMemory; OBJECT_ATTRIBUTES oa; RtlInitUnicodeString( &usPhysicalMemory, L"\\Device\\PhysicalMemory"); InitializeObjectAttributes( &oa, &usPhysicalMemory, OBJ_CASE_INSENSITIVE, NULL, NULL ); status = ZwOpenSection( &hPhysicalMemory, SECTION_MAP_READ, &oa ); if( !NT_SUCCESS(status) ) { DbgPrint("Failed to open %wZ! Status %p\n", usPhysicalMemory, status); hPhysicalMemory = NULL; goto done; } DbgPrint("Opened section handle %p in driver\n", hPhysicalMemory); *(HANDLE*)pIrp->AssociatedIrp.SystemBuffer = hPhysicalMemory; pIrp->IoStatus.Information = 4; status = 0;
typedef struct _PHYSICAL_MEMORY_RANGE { PHYSICAL_ADDRESS BaseAddress; LARGE_INTEGER NumberOfBytes; } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; NTKERNELAPI PPHYSICAL_MEMORY_RANGE MmGetPhysicalMemoryRanges ( VOID );
PVOID MmMapIoSpace( IN PHYSICAL_ADDRESS PhysicalAddress, IN ULONG NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType );
typedef struct _MDL { struct _MDL *Next; CSHORT Size; CSHORT MdlFlags; struct _EPROCESS *Process; PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL; NTKERNELAPI VOID MmMapMemoryDumpMdl ( __inout PMDL MemoryDumpMdl );
typedef struct _MY_MDL { MDL Mdl; DWORD_PTR PageFrameNumber; } MY_MDL, *PMY_MDL; PVOID GetMappedAddr( IN ULONG PageFrameNumber ) { MY_MDL mymdl; mymdl.Mdl.Next = NULL; mymdl.Mdl.Size = 0x20; // MDL size 0x1C + 4 bytes mymdl.Mdl.MappedSystemVa = NULL; mymdl.Mdl.StartVa = NULL; mymdl.Mdl.ByteCount = SIZE_MEM_PAGE; // 4096 bytes mymdl.Mdl.ByteOffset = 0; mymdl.PageFrameNumber = PageFrameNumber; MmMapMemoryDumpMdl(&mymdl.Mdl); return mymdl.Mdl.MappedSystemVa; }