首页
社区
课程
招聘
[求助]用 VirtualQueryEx 查询到某块内存后,如果如何知道该块内存用途
发表于: 2008-5-12 17:27 4852

[求助]用 VirtualQueryEx 查询到某块内存后,如果如何知道该块内存用途

2008-5-12 17:27
4852
用 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日开班!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 321
活跃值: (275)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
2
这个恐怕要在内核中才能得到。VirtualQueryEx调用到内核的NtQueryVirtualMemory。基本流程是:
eprocess -- VadRoot -- ControlArea -- FilePointer ---FileName
2008-5-13 13:08
0
游客
登录 | 注册 方可回帖
返回