VitualAllocEx Function
출처: https://docs.microsoft.com/en-us/windows/desktop/api/memoryapi/nf-memoryapi-virtualallocex
VirtualAllocEx function (memoryapi.h)
Reserves, commits, or changes the state of a region of memory within the virtual address space of a specified process. The function initializes the memory it allocates to zero.
docs.microsoft.com
가. 명시된 프로세스의 가상 주소 공간 내에서 메모리 영역의 상태를 예약, 커밋, 변경한다.
나. 함수는 0에 할당하는 메모리를 초기화한다.
다. 물리적 메모리의 NUMA 노드를 지정하려면 VirtualAllocExNuma를 참조해라.
Syntax
LPVOID VirtualAllocEx(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);
Parameters
(1) hProcess
1) 프로세스의 핸들이다. 이 함수는 이 프로세스의 가상 주소 공간 내에 메모리를 할당한다.
2) 핸들은 PROCESS_VM_OPERATION 액세스 권한이 있어야 한다. 자세한 내용은 Process Security and Access Rights를 참조해라.
(2) lpAddress
1) 할당할 페이지 영역에 대해 원하는 시작 주소를 지정하는 포인터.
2) 메모리를 예약하는 경우, 함수는 이 주소를 할당된 영역에서 가장 가까운 배수로 round 한다.
3) 이미 예약된 메모리를 커밋하는 경우, 함수는 이 주소를 가장 가까운 페이지 경계로 round 한다. 페이지 크기와 호스트 컴퓨터의 할당 세부 정보를 확인하려면 GetSystemInfo 기능을 사용해라
4) IpAddress가 NULL인 경우, 함수는 영역을 할당할 위치를 결정한다.
5) 이 주소가 InitializeEnclave를 호출하여 초기화하지 않은 영역 내에 있는 경우, VirtualAllocEx는 해당 주소에 있는 영역에 0 페이지를 할당한다. 이 페이지는 커밋되지 않은 상태여야 하며 Intel Software Guard Extensions 프로그래밍 모델의 EEXTEND 명령으로 측정되지 않는다.
6) 초기화한 영역 내의 주소인 경우, 할당 명령이 ERROR_INVALID_ADDRESS 오류와 함께 실패한다.
(3) dwSize
1) 할당할 메모리 영역의 크기, 바이트
2) IpAddress가 NULL인 경우, 함수는 다음 페이지 경계까지 dwSize를 round 한다.
3) IpAddress가 NULL이 아닌 경우, 함수는 IpAddress에서 IpAddress+dwSize 범위에 1 bytes 이상의 모든 페이지를 할당한다. 이 것은 예를 들어 페이지 경계에 걸친 2 bytes 범위로 인해 함수로 하여금 두 페이지를 모두 할당하게 한다.
(4) flAllocationType
1) 메모리 할당 유형, 이 파라미터는 다음 값 중 하나를 포함해야 한다. (세부 내용은 맨 위 출처 참조)
MEM_COMMIT(0x00001000), MEM_RESERVE(0x00002000), MEM_RESET(0x00080000), MEM_RESET_UNDO(0x10000000)
2) 또한 파라미터는 다음과 같은 값을 지정할 수 있다. (세부 내용은 맨 위 출처 참조)
MEM_LARGE_PAGES(0x20000000), MEM_PHYSICAL(0x00400000), MEM_TOP_DOWN(0x00100000)
(5) flProtect
1) 할당될 페이지 영역에 대한 메모리 보호. 페이지가 커밋되는 경우, 메모리 보호 constants 중 하나를 지정할 수 있다.
2) IpAddress가 영역 내의 주소를 지정하는 경우, flProtect는 다음 값 중 하나가 될 수 없다.
PAGE_NOACCESS, PAGE_GUARD, PAGE_NOCACHE, PAGE_WRITECOMBINE
Return Value
(1) 함수가 성공하면, return value는 할당된 페이지 영역의 base address이다.
(2) 함수가 실패하면, return value는 NULL이며 extended error information을 얻으려면 GetLastError를 호출해라.
Remarks
(1) 각 페이지는 관련 페이지 상태를 가진다. VirtualAlloEx 함수는 다음 명령을 수행할 수 있다.
1) 예약된 페이지의 영역 커밋
2) 사용 가능한 페이지의 영역 예약
3) 사용 가능한 페이지의 영역을 동시에 예약 및 커밋
(2) VirtualAllocEx는 예약된 페이지를 예약할 수 없다. 이미 커밋된 페이지를 커밋할 수 있다. 즉, 커밋 여부와 관계없이 다양한 페이지를 커밋할 수 있으며, 함수는 실패하지 않을 것이다.
(3) VirtualAllocEx를 사용하여 페이지 블록을 예약한 다음 VitualAllocEx로 추가 호출을 수행하여 예약된 블록에서 개별 페이지를 커밋할 수 있다.
(4) IpAddress parameter가 NULL이 아닌 경우, 함수는 IpAddress와 dwSize parameters를 사용하여 할당될 페이지의 영역을 계산한다. 전체 페이지 영역의 현재 상태가 flAllocationType parameter에 의해 지정된 할당 유형과 호환되어야 한다. 그렇지 않으면, 함수는 실패하고 페이지가 할당되지 않는다. 이 호환성 요구사항은 이미 커밋된 페이지를 커밋하는 것을 배제하지 않는다.
(5) 동적으로 생성된 코드를 실행하려면, VirtualAllocEx를 사용하여 메모리를 할당하고 VitualProtectEx 함수를 사용하여 PAGE_EXECUTE 액세스 권한을 부여해라.
(6) VirtualAllocEx 함수는 지정된 프로세스의 가상 주소 공간 내에 AWE(Address Windowing Extensions) 메모리 영역을 예약하는 데 사용될 수 있다. 그런 다음 이 메모리 영역은 application에 필요한 대로 물리적 페이지를 가상 메모리에 매핑하거나 제외하는 데 사용될 수 있다. MEM_PHYSICAL 및 MEM_RESERVER 값은 AllocationType parameters내에서 설정되어야 한다. MEM_COMMIT 값을 설정하면 안 된다. 페이지 보호는 PAGE_READWRITE로 설정되어야 한다.
(7) VirtualFreeEx 함수는 커밋된 페이지를 디커밋하고 페이지의 storage를 해제하거나 커밋된 페이지를 동시에 디커밋하고 release 할 수 있다. 예약된 페이지도 release할 수 있고 free page로 만들 수 있다.
(8) 실행할 영역을 생성할 때, 호출 프로그램은 일단 코드가 설정되면 FlushInstructionCache에 대한 적절한 호출을 통해 캐시 coherency를 보장할 책임이 있다. 그렇지 않으면 새로 실행 가능한 영역에서 코드를 실행하려는 시도는 예측할 수 없는 결과를 초래할 수 있다.
Requirements
(1) Minimum supported client
Windows XP [desktop apps only]
(2) Minimum supported server
Windows Server 2003 [desktop apps only]
(3) Target Platform
Windows
(4) Header
memoryapi.h (include Windows.h, Memoryapi.h)
(5) Library
Kernel32.lib
(6) DLL
Kernel32.dll
'ETC > Windows API' 카테고리의 다른 글
CreateRemoteThread Function (0) | 2019.05.04 |
---|---|
GetProcAddress Function (1) | 2019.05.04 |
GetModuleHandleA Function (0) | 2019.05.04 |
WriteProcessMemory Function (0) | 2019.05.04 |
OpenProcess Function (0) | 2019.05.04 |