방금 전에 LoadLibrary("ntdll.dll")
을 호출하지 않고이 GetModuleHandle("ntdll.dll")
을 실행하는 것이 우연히 발견되었습니다.Win32 응용 프로그램이 ntdll.dll과 자동으로 연결되어 있습니까?
즉, 내 프로세스에는 ntdll.dll
이 이미로드되어 있습니다.
에 대한 호출이 필요하지 않으므로 ntdll.dll
이 항상 Win32 응용 프로그램에로드된다고 가정하는 것이 안전합니까?
방금 전에 LoadLibrary("ntdll.dll")
을 호출하지 않고이 GetModuleHandle("ntdll.dll")
을 실행하는 것이 우연히 발견되었습니다.Win32 응용 프로그램이 ntdll.dll과 자동으로 연결되어 있습니까?
즉, 내 프로세스에는 ntdll.dll
이 이미로드되어 있습니다.
에 대한 호출이 필요하지 않으므로 ntdll.dll
이 항상 Win32 응용 프로그램에로드된다고 가정하는 것이 안전합니까?
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 내부의 초기화 함수로 설정됩니다.
변경 될 수있는 구현 세부 사항입니다. 너는 * ntdll.dll에서 아무것도 사용하지 말아야한다. 그러나이 작업을 올바르게 수행하면 Microsoft에서 도움을 줄 수 있습니다. LoadLibrary()를 피할 필요가 없습니다. –
* ntdll.dll *은 항상 모든 프로세스에로드됩니다. 그것은 항상 항상 있었을 것입니다. – RbMm
이런 식으로 생각하십시오 ... GetModuleHandle()을 호출했습니다. GetModuleHandle()은 kernel32.dll에 있으므로 응용 프로그램이 kernel32.dll에 링크해야합니다. kernel32.dll의 종속성을 살펴보면 ntdll.dll에 종속되어 있음을 알 수 있습니다. 따라서 응용 프로그램이 kernel32를로드해야한다면 ntdll도로드해야합니다. 그러나, 그것은 모든 Win32 프로세스의 루트로서 ntdll에 대해 놀랄 일이 아닙니다. kernel32에는 ntdll의 함수를 감싸는 여러개의 함수가 있습니다. –