VirtualAlloc

VirtualAlloc은 현재 프로세스 내에서 메모리를 할당하는 함수이며, 이 함수에 의해 할당된 메모리는 자동으로 0으로 초기화됩니다.

이 함수는 주로 인젝션 시 페이로드를 저장할 공간 확보에 사용됩니다.

다른 프로세스의 주소 공간에 메모리를 할당하려면 VirtualAllocEx함수를 사용합니다.

LPVOID VirtualAlloc(
  [in, optional] LPVOID lpAddress,
  [in]           SIZE_T dwSize,
  [in]           DWORD  flAllocationType,
  [in]           DWORD  flProtect
);
인자
설명
보편적인 값

lpAddress

할당할 주소

NULL(OS가 자동 선택)

dwSize

할당 크기

flAllocationType

할당 타입

MEM_COMMIT | MEM_RESERVE

flProtect

메모리 보호 속성

PAGE_EXECUTE_READWRITE

Example

#include <windows.h>
#include <iostream>

int main() {
    const SIZE_T size = 0x1000;

    // 1) VirtualAlloc: 예약+커밋 + RW 권한
    unsigned char* buffer = (unsigned char*)VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

    if (!buffer) {
        std::cout << "VirtualAlloc failed. GLE=" << GetLastError() << "\n";
        return 1;
    }

    std::cout << "[+] VirtualAlloc succeeded\n";
    std::cout << "    Address: " << (void*)buffer << "\n";

    // 2) 쓰기/읽기 검증
    buffer[0] = 0x41;   // 'A'
    buffer[1] = 0x42;   // 'B'
    std::cout << "[+] Write/Read OK\n";
    std::cout << "    buffer[0]=0x" << std::hex << (int)buffer[0]
        << " buffer[1]=0x" << (int)buffer[1] << std::dec << "\n";

    // 3) VirtualQuery로 할당 상태/보호 확인
    MEMORY_BASIC_INFORMATION mbi{};
    if (VirtualQuery(buffer, &mbi, sizeof(mbi)) == 0) {
        std::cout << "VirtualQuery failed. GLE=" << GetLastError() << std::endl;
        return 1;
    }

    std::cout << "[+] VirtualQuery\n";
    std::cout << "    State      : 0x" << std::hex << mbi.State << std::dec << std::endl;

    // 4) VirtualFree로 해제
    if (!VirtualFree(buffer, 0, MEM_RELEASE)) {
        std::cout << "VirtualFree failed. GLE=" << GetLastError() << std::endl;;
        return 1;
    }
    std::cout << "[+] VirtualFree(MEM_RELEASE) succeeded" << std::endl;

    // 5) 해제 후 VirtualQuery로 상태 확인 (보통 MEM_FREE로 보임)
    MEMORY_BASIC_INFORMATION mbi2{};
    VirtualQuery(buffer, &mbi2, sizeof(mbi2));
    std::cout << "[+] After free VirtualQuery" << std::endl;
    std::cout << "    State: 0x" << std::hex << mbi2.State << std::dec
        << (mbi2.State == MEM_FREE ? " (MEM_FREE)" : "") << std::endl;

    return 0;
}

References

Last updated