본문 바로가기
Programming/Visual Basic 6

[VB6] Windows에서 DLL 호출 시 검색 순서의 중요성

by 너울림 2023. 11. 7.

대표이미지

 

Windows에서 DLL 호출 시 검색 순서의 중요성

 


포스팅 개요


오늘은 Windows에서 DLL(Dynamic Link Library) 호출 시 특정 DLL을 어떻게 찾는지 그리고 그 순서가 왜 중요한지에 대해 이야기해보려 합니다. 이 내용은 보안 및 기능적 측면에서 매우 중요하므로 한 번쯤 읽어보시는걸 추천드립니다. 그럼 개념의 이해를 돕기위해 아래의 2가지 목록으로 금일 포스팅을 진행하겠습니다.

  • Windows에 정의된 기본적인 DLL 검색 순서
  • Windows에서 DLL 검색 순서를 변경하는 방법

Windows에 정의된 기본적인 DLL 검색 순서


Windows는 애플리케이션이 필요로 하는 DLL을 올바르게 찾기 위해 지정된 경로 순서를 따릅니다. 이를 통해 애플리케이션은 필요한 DLL을 정확히 찾아 사용할 수 있습니다. 이제 각각의 검색 경로에 대해 자세히 알아보겠습니다.

  1. 애플리케이션의 디렉터리
    애플리케이션이 실행되는 현재 디렉터리가 가장 먼저 검색됩니다. 이로 인해 'DLL Hijacking'이라는 보안 문제가 발생할 수 있습니다. 즉, 악의적인 DLL을 애플리케이션의 실행 경로에 배치하면 시스템의 정상적인 DLL보다 먼저 로드되어 문제를 일으킬 수 있습니다. 
  2. 시스템 디렉터리
    그다음으로는 C:\Windows\System32 같은 시스템 디렉터리가 검색됩니다. 만약 64비트 운영 체제에서 32비트 애플리케이션을 실행하는 경우에는 C:\Windows\SysWOW64 디렉터리가 검색됩니다. 
  3. Windows 디렉터리
    C:\Windows와 같은 Windows 디렉터리가 그다음으로 검색됩니다. 
  4. PATH 환경 변수에 지정된 경로
    마지막으로 PATH 환경 변수에 지정된 디렉터리들이 순서대로 검색됩니다.

Windows에서 DLL 검색 순서를 변경하는 방법

 


통상적인 Windows의 DLL 검색 순서를 변경하는 방법은 크게 두 가지입니다.  다만 아래의 방법은 VB6에서는 지원되지 않는 방법이고 실제로 VB6에 적용하시려면 Declare 함수로 Lib 로드시 경로 조정만을 추천합니다.

  • SetDllDirectory 함수 사용
    SetDllDirectory 함수를 사용하여 DLL 검색 경로를 추가하거나 제거할 수 있습니다. 이 함수는 애플리케이션의 DLL 검색 경로를 변경하며 SetDllDirectory(NULL)을 호출하면 기본 DLL 검색 순서가 복원됩니다. 
  • LoadLibraryEx 함수의 플래그 사용
    LoadLibraryEx 함수를 사용하여 DLL을 로드할 때 함수의 세 번째 인자인 dwFlags LOAD_LIBRARY_SEARCH_* 계열의 플래그를 지정하면 DLL 검색 순서를 변경할 수 있습니다.
    예를 들어 LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 플래그를 지정하면 DLL이 있는 디렉토리를 먼저 검색하고 LOAD_LIBRARY_SEARCH_SYSTEM32 플래그를 지정하면 System32 디렉토리를 먼저 검색합니다.

위 방법을 통해 애플리케이션의 DLL 검색 순서를 조정할 수 있습니다만 이는 보안 문제를 일으킬 수 있으므로 주의가 필요하며 악의적인 DLL을 로드하는 것을 방지하기 위해 DLL 검색 경로와 순서를 신중히 관리해야 합니다. 

반응형

마치며...


오늘 소개해드린 내용 중 DLL 검색 순서 정도만 기억하셔도 차후에 DLL에러 대응이나 설치 파일 빌드를 하실 때 굉장히 유리한 조건에서 지식 습득이 가능해집니다. 다만 VB6에서는 Unicode 문자열이 지원되지 않는 특성으로 인해 통상적인 방법보다 DLL의 위치를 조정하는 걸로 대체되는 점을 명심하셔서 신중한 경로 설정을 하시길 바랍니다.

댓글