① 현재 작업 디렉토리(Current Working Directory) : 먼저 프로그램이 실행되는 디렉토리에서 DLL 파일을 검색한다. 이는 가장 먼저 검색되는 위치로, 프로그램 실행 파일과 같은 디렉토리에 DLL 파일이 위치할 경우 이곳에 로드
② 시스템 디렉토리(System Directory) : 시스템이 설치된 디렉토리(예: C:\Windows\System32)에 위치한 DLL 파일을 검색한다. 시스템 디렉토리는 시스템 환경 변수인 %SystemRoot%의 하위 디렉토리
③ PATH 환경 변수에 지정된 디렉토리들 : PATH 환경 변수에 설정된 디렉토리들을 순서대로 검색한다. 이 디렉토리들은 시스템 환경 설정에서 사용자가 지정할 수 있으며, 여기에 위치한 DLL 파일들도 검색됨
④ 레지스트리(Registry) : Windows 레지스트리에 등록된 DLL 검색 경로를 확인한다. 예를 들어, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 레지스트리 키에 등록된 경로들이 여기에 해당
이 순서대로 DLL 파일이 검색되며, 같은 이름의 DLL 파일이 여러 경로에 존재할 경우에는 검색 우선순위에 따라 먼저 발견된 경로의 DLL 파일이 로드
검색 경로 : 시스템의 DLL 검색 순서는 Safe DLL 검색 모드의 활성 여부에 따라 달라진다. Safe DLL 검색 모드는 사용자의 현재 디렉토리의 검색 순서를 뒤쪽으로 변경한다. Safe DLL 검색 모드는 default로 활성화 되어있다. 이를 비활성화 하기 위해서는
레지스트리
의 값을 0으로 설정해야한다. SetDllDirectory 함수로도 검색 경로에 특정 디렉토리가 있는 동안 Safe DLL 검색 모드를 비활성화 할 수 있다.
Safe DLL 검색 모드
Windows 운영 체제에서 DLL 파일을 로드할 때 발생할 수 있는 보안 문제를 완화하기 위해 도입된 기능
리다이렉션(Redirection)
- DLL 리다이렉션은 특정 버전의 DLL을 요청하는 경우 시스템이 다른 버전의 DLL을 제공하는 매커니즘이다.
- 예를들어, 어떤 응용 프로그램이 특정 DLL 버전을 요구하면, 시스템은 요청된 DLL 버전이 없더라도 호환되는 다른 버전의 DLL을 제공할 수 있다. 이는 애플리케이션이 올바르게 작동할 수 있도록 보장하는 기능
Manifest 파일
- .manifest 파일은 응용 프로그램이나 DLL과 관련된 추가 정보를 포함하는 XML 파일이다.
- 주요 목적은 다양한 버전의 DLL이나 리소스를 관리하고, 실행 환경 설정을 지정하는 것이다.
- 예를 들어, .manifest 파일은 어플리케이션이 특정 DLL 버전을 사용하도록 요구하거나, 다른 리소스 파일을 포함하는 등의 정보를 담을 수 있다.
Known-DLL List
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
DLL 검색 순서는 보통 개발자가 의도하는 대로 DLL을 로드하게끔 설계되어 있다. 그러나 때로는 여러 경로에 동일한 이름의 DLL이 존재하거나, 버전이 충돌할 경우 문제가 발생할 수 있다. 이를 DLL 지옥(DLL Hell)이라고 한다. DLL 지옥은 다양한 버전의 DLL이 설치되어 있어서 각각의 어플리케이션이 필요한 DLL 버전을 올바르게 찾지 못하고 충돌이 발생하는 상황을 의미
① 의존성 충돌 : 프로그램이 실행될 때 필요한 DLL 파일을 찾지 못하거나, 버전이 맞지 않는 DLL 파일을 로드할때 발생
② 로딩 순서 문제 : 여러 경로에 같은 이름의 DLL 파일이 존재할 때, 우연히 다른 버전의 DLL 파일이 로드되어 예상치 못한 동작이 발생할 가능성 있음
③ 환경 변수 설정 오류 : PATH 환경 변수 설정이 잘못되어 원치 않는 DLL 파일이 로드되거나, 시스템 디렉토리에 적절하지 않은 DLL 파일이 위치할 경우 문제가 발생