기초 주소를 얻는 사고방식

1220 단어
가상 메모리 관리에는 아직도 많은 사용 가능한 기교가 존재한다. 얼마 전에 자신의 dll의 기본 주소를 어떻게 신속하게 얻는가(메모리가 불러오고 DllMain이 호출되지 않는다는 전제 조건), 아니면 동료가 코드를 주고 이런 방법도 있다는 것을 알게 되었다.  윈도우즈에서의 디버깅을 진행하면 우리의 dll은 완전한 메모리 블록이다. 즉, 우리의 dll 기본 주소는 실제적으로 이 가상 메모리의 첫 번째 주소이다. 즉, 우리는 VirtualQuery 함수를 통해 현재 코드가 있는 가상 메모리 블록의 시작 주소를 찾아 현재 모듈의 기본 주소를 얻는다.
HRESULT VirtualQuery (
    [in]  void*    lpAddress,
    [out] void*    lpBuffer,
    [in]  SIZE_T   dwLength,
    [out] SIZE_T*  pResult
);

lpAddress [in]은 검색할 가상 메모리의 주소를 가리키는 바늘입니다.lpBuffer [out]은 지정된 메모리 영역에 대한 정보를 포함하는 구조에 대한 포인터를 가리킵니다.dwLength [in] 바이트 단위의 버퍼 크기를 lpBuffer가 가리킵니다.pResult [out]은(는) 반환된 정보 버퍼의 바이트 수를 가리키는 포인터입니다.
매개 변수 lpBuffer는 사실상 하나의 구조이다
typedef struct _MEMORY_BASIC_INFORMATION {
    PVOID BaseAddress;
    PVOID AllocationBase;    \\   
    DWORD AllocationProtect;
    SIZE_T RegionSize;
    DWORD State;
    DWORD Protect;
    DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

코드
//       
HMODULE GetSelfModuleHandle()
{
    MEMORY_BASIC_INFORMATION mbi;
    return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0) ? (HMODULE)mbi.AllocationBase : NULL);
}

좋은 웹페이지 즐겨찾기