다른 프로세스의 메모리에로드 된 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;