Programming/System Programming

VirtualQueryEx를 이용한 할당된 Memory Listing

Winduck 2020. 5. 28. 20:03
반응형

프로젝트를 진행하며 특정 프로세스에 할당된 메모리 리스트를 뽑고 싶었다.

근데, 이게 웬일(?) 편의성 좋은 api로 분명 지원할 거라 생각했는데 없었다.

그래서 이래저래 방법을 찾아본 결과 해답은 VirtualQueryEx였다.

원래 알고 있던 api지만 메모리 리스팅을 하는데 사용될 줄은 몰랐다.

 

VirtualQueryEx 원하는 프로세스의 원하는 메모리 영역에 대한 정보를 가져오는 함수인데

나의 목적인 MSDN 검색 결과 메모리 리스팅에 대한 정보는 없었다.

(msdn : https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualqueryex )

검색해 본 결과 Process Hacker에서 아래와 방법으로 메모리 리스트와 그 정보를 출력시킨다는 것을 알게 되었다.

설마 설마했는데 특정 프로세스의 UserMode 영역(0x00000000~0x7FFFFFFFF)을 모두 Query 하는 것이었다니...

조잡하지만 간단하게 현재 프로세스 메모리 리스팅하는 코드를 짜보았다.

(현재 프로세스로 할 경우 VirtualQyery도 가능하다.)

#include
#include
#include

int main(void)
{
DWORD dwPid = 0;
HANDLE hProc = NULL;
LPVOID lpScanAddress = 0;
MEMORY_BASIC_INFORMATION MmInfo = { 0, };

hProc = GetCurrentProcess();
while (VirtualQueryEx(hProc, lpScanAddress, &MmInfo, sizeof(MEMORY_BASIC_INFORMATION)))
{
printf("Base Address : %X |", MmInfo.BaseAddress);
printf("Allocation Base : %X | ", MmInfo.AllocationBase);
printf("AllocationProtect : %X | ", MmInfo.AllocationProtect);
printf("RegionSize : %X |", MmInfo.RegionSize);
printf("State : %X |", MmInfo.State);
printf("Protect : %X |", MmInfo.Protect);
printf("Type : %X\n", MmInfo.Type);
lpScanAddress = (LPVOID)((DWORD)lpScanAddress + (DWORD)MmInfo.RegionSize);
memset(&MmInfo, 0, sizeof(MEMORY_BASIC_INFORMATION));
}
CloseHandle(hProc);

return 0;
}

 

진행하며 알게 된 사실 당연한 것이지만 할당되지 않은 메모리는 MEM_FREE로 관리되고 Size도 별도로 있다는 것이다.

뭔가 당연하지만 괜스레 새롭다는 느낌...

끝으로 UserMode영역을 넘어간 영역을 Query 할 경우 Inavalid Parameter error가 발생한다. 

아무튼 오늘은 이렇게 블로깅을 마무리한다.

반응형