用 VirtualQueryEx 查询到某块内存后,如果该块内存的类型为内存映射即MEM_MAPPED,那么用什么方法可以知道该块内存映射为哪一个文件?
下列函数只能查询进程中已经被分配的内存,但这些内存块各自用于和什么用途如何才能知道呢?
BOOL ShowProcMemInfo(DWORD dwPID)
{ HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,false,dwPID);
if(hProcess == NULL) return FALSE;
MEMORY_BASIC_INFORMATION mbi;
char *pAddress = NULL;
char szInfo[2000];
while(1)
{
if(VirtualQueryEx(hProcess,pAddress,&mbi,sizeof(mbi))!= sizeof(mbi)) break;
if(mbi.State==MEM_COMMIT)
{
sprintf(szInfo, "%08X %08X ",mbi.BaseAddress,mbi.RegionSize);
char *pStr;
switch(mbi.Type)
{
case MEM_IMAGE:
pStr = "MEM_IMAGE "; break;
case MEM_MAPPED: pStr = "MEM_MAPPED "; break;
case MEM_PRIVATE: pStr = "MEM_PRIVATE "; break;
default: pStr = "----------- "; break;
}
strcat(szInfo,pStr);
switch(mbi.AllocationProtect)
{
case PAGE_READONLY: pStr ="PAGE_READONLY "; break;
case PAGE_READWRITE: pStr ="PAGE_READWRITE "; break;
case PAGE_WRITECOPY: pStr ="PAGE_WRITECOPY "; break;
case PAGE_EXECUTE: pStr ="PAGE_EXECUTE "; break;
case PAGE_EXECUTE_READ: pStr ="PAGE_EXECUTE_READ "; break;
case PAGE_EXECUTE_READWRITE:pStr ="PAGE_EXECUTE_READWRITE"; break;
case PAGE_EXECUTE_WRITECOPY:pStr ="PAGE_EXECUTE_WRITECOPY"; break;
case PAGE_GUARD: pStr ="PAGE_GUARD "; break;
case PAGE_NOACCESS: pStr ="PAGE_NOACCESS "; break;
case PAGE_NOCACHE: pStr ="PAGE_NOCACHE "; break;
default: pStr ="----------------------"; break;
}
strcat(szInfo, pStr);
Form1->Memo1->Lines->Add(szInfo);
}
pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize);
}
CloseHandle(hProcess);
return TRUE;
}
[培训]科锐逆向工程师培训第53期2025年7月8日开班!