2011-09-04 4 views
0

다른 프로세스의 메모리에로드 된 DLL의 기본 주소 만 있습니다. DLL의 이미지를 얻고 싶습니다. 그래서 VirtualQuery에서 MEMORY_BASIC_INFORMATION을 얻습니다. 이 함수는 실패하지 않지만 allocationBase는 항상 0입니다. "bug"를 읽을 수있는 행에서 응용 프로그램이 충돌합니다.baseaddress에서 DLL의 이미지 크기를 올바르게 가져 오는 방법은 무엇입니까?

질문 : 주어진 상황에서 VirtualQuery가 작동합니까? 이미지를 얻는 더 좋은 방법이 있습니까? 그러나 내 상황을 기억하십시오 : 나는 다른 프로세스의 메모리에로드 된 DLL의 이미지를 얻고 싶습니다! DLL이 내 응용 프로그램에로드되지 않았거나 현재 응용 프로그램에 대한 핸들이 없습니다 (핸들을 가져올 수 있음).

... 
DWORD baseAddress = (DWORD)me32.modBaseAddr; // base address of a DLL of other process 
MEMORY_BASIC_INFORMATION mem; 

    if (NULL==VirtualQuery((LPCVOID)baseAddress, &mem, sizeof(mem))) { 
     printError(TEXT("VirtualQuery")); 
     return false; 
    } 

    unsigned char* allocationBase = (unsigned char*)mem.AllocationBase; 
    _tprintf(TEXT("\n allocationBase = %d"), allocationBase); // 0 

    IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER*)mem.AllocationBase; 

    IMAGE_NT_HEADERS *pe = (IMAGE_NT_HEADERS*)((unsigned long) 
    dos+(unsigned long)dos->e_lfanew); // bug crashes application 

size_t base_len = (size_t)pe->OptionalHeader.SizeOfImage; 

답변

3
// base address of a DLL of other process 

코멘트는 모두가 VirtualQuery는 실제로 로딩이 DLL을 가지고 당신의 과정이 아니라 그 과정에서 당신에게 가상 메모리에 대한 정보를 반환 말한다. VirtualQueryEx()를 사용하고, OpenProcess()로 필요한 프로세스 핸들을 얻어야한다.

관련 문제