在去除前面的那些東西之後,我們的內存塊裡面還有一堆MEM_MAPPED的內容,就像這樣的塊:
MSDN裡面這樣解釋MEM_MAPPED這種類型:
Indicates that the memory pages within the region are mapped into the view of a section.
很自然地我們想用GetMappedFileName來看看映射到這些 內存區域的文件名,於是發現了下面幾個塊的確是做了文件映射:
那麼其它東西是哪裡來的?
使用GetLastError取錯誤信息:“error: 000003ee : 文件所在 的卷已被外部改變,因此打開的文件不再有效。”,詭異得很!一怒之下使用UnmapViewOfFile將 這些內存塊給Unmap了,不幸的是程序就這樣掛掉了!
寫段代碼查詢一下當前打開的句柄,看看有沒 有file mapping的內容:
void enum_handles(HANDLE hProcess)
{
// 枚舉已經打 開的句柄,取其名稱
HMODULE hNtDll = NULL; // nt.dll句柄
ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
NTQUERYOBJECT NtQueryObject = NULL;
SYSTEM_HANDLE_INFORMATION *hInfo = NULL;
int nNumHandle = 0, i; // 句柄數 量
NTSTATUS Status;
ULONG nSize, nCount;
char cBuffer[0x40000], cInfoBuffer [0x1000];
OBJECT_ALL_INFORMATION *pInfo;
OBJECT_NAME_INFORMATION* pName;
DWORD nId = GetProcessId(hProcess);
// 取導出函數
hNtDll = GetModuleHandle( "ntdll.dll" );
ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( hNtDll, "ZwQuerySystemInformation" );
NtQueryObject = ( NTQUERYOBJECT )GetProcAddress( hNtDll, "NtQueryObject" );
// 查詢句柄信息
Status = ZwQuerySystemInformation (SystemHandleInformation,
cBuffer,
0x40000,
&nSize);
if (NT_SUCCESS(Status))
{
nNumHandle = *(PULONG)cBuffer;
hInfo = (SYSTEM_HANDLE_INFORMATION*)(cBuffer + 4);
nCount = 0;
for(i = 0; i < nNumHandle; i++)
{
if(hInfo[i].ProcessId != nId) continue;
Status = NtQueryObject(hInfo[i].Handle, ObjectAllInformation, cInfoBuffer, 0x1000, &nSize);
if(NT_SUCCESS(Status))
{
pInfo = (OBJECT_ALL_INFORMATION*)cInfoBuffer;
nCount++;
……………………….
}
}
}
}
網上有資料說NtQueryObject會讓程序掛掉,但是沒有發現有此現象,奇怪! 上面的代碼可以得到下面的句柄列表:
可以看到,系統映射過來的section對象著實不少!至於這些section對象與內存塊的對應關系,限於 水平,感覺無從下手,暫且做個記號。