2017-04-25 4 views
3

방금 ​​전에 LoadLibrary("ntdll.dll")을 호출하지 않고이 GetModuleHandle("ntdll.dll")을 실행하는 것이 우연히 발견되었습니다.Win32 응용 프로그램이 ntdll.dll과 자동으로 연결되어 있습니까?

즉, 내 프로세스에는 ntdll.dll이 이미로드되어 있습니다.

에 대한 호출이 필요하지 않으므로 ntdll.dll이 항상 Win32 응용 프로그램에로드된다고 가정하는 것이 안전합니까?

+3

변경 될 수있는 구현 세부 사항입니다. 너는 * ntdll.dll에서 아무것도 사용하지 말아야한다. 그러나이 작업을 올바르게 수행하면 Microsoft에서 도움을 줄 수 있습니다. LoadLibrary()를 피할 필요가 없습니다. –

+0

* ntdll.dll *은 항상 모든 프로세스에로드됩니다. 그것은 항상 항상 있었을 것입니다. – RbMm

+1

이런 식으로 생각하십시오 ... GetModuleHandle()을 호출했습니다. GetModuleHandle()은 kernel32.dll에 있으므로 응용 프로그램이 kernel32.dll에 링크해야합니다. kernel32.dll의 종속성을 살펴보면 ntdll.dll에 종속되어 있음을 알 수 있습니다. 따라서 응용 프로그램이 kernel32를로드해야한다면 ntdll도로드해야합니다. 그러나, 그것은 모든 Win32 프로세스의 루트로서 ntdll에 대해 놀랄 일이 아닙니다. kernel32에는 ntdll의 함수를 감싸는 여러개의 함수가 있습니다. –

답변

5

MSDN on LoadLibrary() (강조 내)에서 :

시스템은 모든로드 모듈의 프로세스 별 레퍼런스 카운트를 유지한다. LoadLibrary를 호출하면 참조 횟수가 증가합니다. 을 호출하면 FreeLibrary 또는 FreeLibraryAndExitThread 함수가 참조 횟수를 감소시킵니다. 참조 카운트 이 0에 도달하거나 프로세스가 종료 될 때 시스템이 모듈을 언로드합니다 ( 참조 카운트와 관계 없음). 즉

는에서 LoadLibrary()를 호출 계속하고 안전한 것으로 ntdll.dll에 핸들을 얻을 수 있도록 -하지만 이미로드해야 할 때 시스템은 거의 확실하게 참조 카운트를 해주됩니다.

"실제로로드됩니까?"에 대해서는 Windows Internals on the Image Loader (짧은 대답은 예, ntdll.dll은 로더 자체의 일부이며 항상 존재합니다)를 참조하십시오.

관련 단락은 다음과 같습니다

이미지 로더는 커널 라이브러리의 사용자 모드 시스템 DLL Ntdll.dll은하지에 살고있다. 따라서 DLL의 일부인 표준 코드와 동일하게 작동하며 메모리 액세스 및 보안 권한 측면에서 동일한 제한을받습니다. 이 코드를 특별하게 만드는 것은 항상 실행중인 프로세스 (Ntdll.dll이 항상로드됩니다.)에 있으며이 코드가 새 응용 프로그램의 일부로 사용자 모드에서 실행되는 첫 번째 코드라는 보증입니다. 시스템이 초기 컨텍스트를 구축하면 프로그램 카운터 나 명령 포인터가 Ntdll.dll 내부의 초기화 함수로 설정됩니다.

관련 문제