문제

모듈을 내릴 수 있으므로 여전히 메모리에 있는지 확인할 수있는 방법은 무엇입니까? getModule Handle에서 얻은 손잡이가 있습니다. GethandleInformation을 호출하려고 할 때 오류 0xc0000008- "잘못된 핸들이 지정되었습니다." 이것은 언로드되기 전에 일어났습니다.

도움이 되었습니까?

해결책

"핸들"이라는 용어는 여기에 약간 과부하되어 있습니다. Win32 API의 많은 다른 클래스의 객체를 "핸들"이라고합니다.

gethandleInformation은 파일, 레지스트리 키, 뮤테스 등 커널 객체에 대한 핸들에 사용됩니다.

getModule Handle에 의해 반환 된 hmodule은 로더에서 사용되며 실제 커널 객체가 아니므로 gethandleInformation이 실패합니다. GethandleInformation에서 얻는 깃발 중 어느 것도 Hmodule에 적합하지 않습니다.

hmodule이 여전히 메모리에로드되어 있는지 확인하려면 getModuleHandle을 호출 할 수 있습니다. 그러나 GetModuleHandle의 결과는 반환되는 순간에 유효하지 않을 수 있습니다. 다른 스레드는 Freelibrary라고 불릴 수 있습니다. DLL이로드 된 상태를 유지하는 것이 좋습니다. loadlibrary를 직접 호출하거나 getModuleHandleEx를 호출하여 DLL의 참조 수를 증가 시켜이 작업을 수행 할 수 있습니다.

다른 팁

두 가지 솔루션 :

1

hmodule에서 getModuleFilename ()을 호출하십시오. 모듈이로드되면 유효한 파일 이름이 표시됩니다. 로드되지 않으면 유효한 파일 이름을 얻지 못합니다. getModuleFilename ()을 호출하기 전에 리턴 된 파일 이름 배열의 첫 바이트를 ' 0'으로 설정하거나 반환 값을 확인하십시오. 통화 전에 첫 번째 바이트를 설정하면 반환 값을 효과적으로 무시하고 제로 길이 문자열을 "로드되지 않은"신호로 취급 할 수 있습니다.

TCHAR szModName[MAX_PATH + 1];

szModName[0] = _T('\0');
GetModuleFileName(hMod, szModName, MAX_PATH);

// zero length string if not loaded, valid DLL name if still loaded

2

query의 주소로 hmodule을 전달한 virtualQuery () 호출하십시오. 실험에서로드 된 라이브러리와 라이브러리에서 해방 된 것을 알고 있습니다. 반환 된 memory_basic_information에 대해 매우 다른 결과를 얻을 수 있습니다. 나는 두 사람의 차이를 결정하기 위해 적절한 알고리즘을 해결하기 위해 당신에게 맡깁니다.

경고

물론, 다른 스레드 가이 테스트를 실행하는 동안 다른 스레드가 라이브러리를 내릴 수 있다는 경고가 적용됩니다. 내 경험에 따르면, 이것은 일어날 가능성이 거의 없지만, 그것은 당신이하고있는 일, 왜 그렇게하고 있는지, 그리고 당신이 그것을 할 때 프로그램의 실행 경로에 크게 달려 있습니다. 조심스럽게 사용하십시오.

매우 간단한 API입니다.

PIMAGE_NT_HEADERS (NTAPI* _RtlImageNtHeader)

샘플 프로그램 :

(PVOID)typedef PIMAGE_NT_HEADERS (NTAPI *RTLIMAGENTHEADER)(PVOID);
RTLIMAGENTHEADER RtlImageNtHeader;
HMODULE hDll = GetModuleHandle("ntdll.dll");
HMODULE hDllTmp = LoadLibrary("ws2_32.dll");
RtlImageNtHeader = (RTLIMAGENTHEADER)GetProcAddress(hDll,"RtlImageNtHeader");

struct _IMAGE_NT_HEADERS *r,*r2;
r= RtlImageNtHeader(hDllTmp); 
FreeLibrary(hDllTmp);
r2= RtlImageNtHeader(hDllTmp);

//r = NULL
//r2 = return ws2_32 PE Header address
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top