LoadLibraryA Function
출처: https://docs.microsoft.com/ko-kr/windows/desktop/api/libloaderapi/nf-libloaderapi-loadlibrarya
LoadLibraryA function (libloaderapi.h)
Loads the specified module into the address space of the calling process.
docs.microsoft.com
가. 지정된 모듈을 호출 프로세스의 주소 공간에 로드해라. 지정한 모듈로 인해 다른 모듈이 로드될 수 있다.
나. 추가 로드 옵션은 LoadLibraryEx 함수를 사용해라.
Syntax
HMODULE LoadLibraryA(
LPCSTR lpLibFileName
);
Parameters
(1) lpLibFileName
1) 모듈의 이름. 이것은 라이브러리 모듈 (.dll 파일) 또는 실행 모듈 (.exe 파일)이 될 수 있다. 지정한 이름은 모듈의 파일 이름이며, module-definition (.def) 파일에서 LIBRARY 키워드에 의해 지정된 대로 라이브러리 모듈 자체에 저장된 이름과 관련이 없다.
2) 문자열이 전체 경로를 지정하는 경우, 하무는 모듈에 대한 해당 경로만 검색한다.
3) 문자열이 상대 경로 또는 경로가 없는 모듈 이름을 지정하는 경우, 함수는 표준 검색 전략을 사용하여 모듈을 찾는다. 자세한 내용은 Remarks를 참조해라.
4) 함수가 모듈을 찾을 수 없으면 함수는 실패한다. 경로를 지정할 때 슬래시가 아니라 백슬래시를 사용해라. 경로에 대한 자세한 내용은 Naming a File or Directory를 참조해라.
5) 문자열이 경로 없는 모듈 이름을 지정하고 파일 확장자가 생략된 경우, 함수는 default 라이브러리 확장자 .dll을 모듈 이름에 추가한다. 함수가 모듈 이름에 .dll을 추가하지 않도록 하려면 모듈 이름 문자열에 후행 점 문자 (.)을 포함해라.
Return Value
(1) 함수가 성공하면, return value는 모듈에 대한 핸들이다.
(2) 함수가 실패하면, return value는 NULL이며 extended error information을 얻으려면 GetLastError를 호출해라.
Remarks
(1) DLL 로드 중에 로더가 표시하는 오류 메시지를 활성화하거나 비활성화하려면 SetErrorMode 함수를 사용해라.
(2) LoadLibrary를 사용하여 프로세스의 주소 공간에 라이브러리 모듈을 로드하고 GetProcAddress에서 사용할 수 있는 핸들을 반환하여 DLL 함수의 주소를 가져올 수 있다. LoadLibrary는 다른 실행 모듈을 로드할 수도 있다. 예를 들어, 함수는 FindResource 또는 LoadResource에서 사용할 수 있는 핸들을 얻기 위해 .exe 파일을 지정할 수 있다. 그러나 .exe 파일을 실행하기 위해 LoadLibrary를 사용하지 마라. 대신에 CreateProcess 함수를 사용해라.
(3) 지정된 모듈이 호출 프로세스에 대해 아직 로드되지 않은 DLL인 경우, 시스템은 DLL_PROCESS_ATTACH 값을 가진 DLL의 DllMain 함수를 호출한다. DllMain이 TRUE를 반환하면 LoadLibrary는 모듈에 핸들을 반환한다. DllMain이 FALSE를 반환하면 시스템은 프로세스 주소 공간으로부터 DLL을 언로드하고 LoadLibrary는 NULL을 반환한다. DllMain에서 LoadLibrary를 호출하는 것은 안전하지 않다. 자세한 내용은 DllMain의 Remarks 섹션을 참조해라.
(4) 모듈 핸들은 global or inheritable 하지 않다. 한 프로세스에 의한 LoadLibrary 호출은 GetProcAddress와 같이 다른 프로세스가 사용할 수 있는 핸들을 생성하지 않는다. 다른 프로세스는 GetProcAddress를 호출하기 전에 모듈에 대한 LoadLibrary를 직접 호출해야 한다.
(5) lpFileName에 경로가 포함되어 있지 않고 기본 이름과 확장자가 동일한 로드된 모듈이 둘 이상 있는 경우, 함수는 먼저 로드된 모듈에 핸들을 반환한다.
(6) lpFileName parameter에 파일 확장자가 지정되지 않은 경우, default 라이브러리 확장자 .dll이 추가된다. 그러나 파일 이름 문자열에는 모듈 이름에 확장자가 없음을 나타내는 후행 점 문자 (.)가 포함될 수 있다. 경로가 지정되지 않았을 때, 함수는 로드될 모듈의 기본 이름과 일치하는 기본 이름을 가진 로드된 모듈을 검색한다. 이름이 일치하면 로드한다. 그렇지 않으면 함수는 파일을 검색한다.
(7) 검색된 첫 번째 디렉토리는 호출 프로세스를 생성하는 데 사용되는 이미지 파일이 들어 있는 디렉터리이다 (자세한 내용은 CreateProcess 함수를 참조해라). 이렇게 하면 PATH 환경 변수에 프로세스의 설치된 디렉터리를 추가하지 않고도 프로세스와 관련된 DLL 파일을 찾을 수 있다. 상대 경로를 지정한 경우, 전체 상대 경로가 DLL 검색 경로 목록의 모든 토큰에 추가된다. 다른 경로를 검색하지 않고 상대 경로에서 모듈을 로드하려면 GetFullPathName을 사용하여 nonrelative 경로를 가져오고 LoadLibrary를 nonrelative 경로로 호출해라. DLL 검색 순서에 대한 자세한 내용은 Dynamic-Link Library Search Order를 참조해라.
(8) 검색 경로는 SetDllDirectory 함수를 사용하여 변경할 수 있다. 이 solution은 SetCurrentDirectory를 사용하거나 DLL에 대한 전체 경로를 하드코딩하는 대신 권장된다.
(9) 경로가 지정되어 있지 않고 응용 프로그램에 대한 리다이렉션 파일이 있는 경우, 함수는 응용 프로그램 디렉토리에서 모듈을 검색한다. 모듈이 응용프로그램 디렉터리에 존재하는 경우, LoadLibrary는 지정된 경로를 무시하고 응용프로그램 디렉터리에서 모듈을 로드한다. 모듈이 응용프로그램의 디렉터리에 없는 경우, LoadLibrary는 지정된 디렉터리에서 모듈을 로드한다. 자세한 내용은 Dynamic Link Library Redirection을 참조해라.
(10) path specification 없이 어셈블리의 이름을 사용하여 LoadLibrary를 호출하고 어셈블리가 system compatible manifest에 나열된 경우, 호출은 자동으로 side-by-side 어셈블리로 리다이렉션된다.
(11) 시스템은 로드된 모든 모듈에 대해 프로세스당 참조 카운트를 유지한다. LoadLibrary를 호출하면 참조 카운트가 증가한다. FreeLibrary 또는 FreeLibraryAndExitThread 함수를 호출하면 참조 카운트가 감소한다. 시스템은 참조 카운트가 0이 되거나 프로세스가 종료될 때 (참조 카운트에 관계없이) 모듈을 언로드 한다.
(12) Windows Server 2003 and Windows XP
Visual C++ 컴파일러는 thread-local variables(_declspec(thread))을 선언할 수 있는 syntax를 지원한다. DLL에서 이 syntax를 사용하면 Windows Vista 이전 버전의 Windows에서 LoadLibrary를 사용하여 DLL을 명시적으로 로드할 수 없다. DLL이 명시적으로 로드될 경우 _declspec(thread) 대신 thread local storage 함수를 사용해야 한다. 예를 들어 동적 링크 라이브러리에서 Thread Local Storage 사용을 참조해라.
Security Remarks
(1) 이후의 LoadLibrary 호출에 대해 SearchPath 함수를 사용하여 DLL에 대한 경로를 검색하지 마라. SearchPath 함수는 LoadLibrary와 다른 검색 순서를 사용하고 BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE를 사용하여 SetSearchPathMode 호출에 의해 명시적으로 활성화하지 않는 한 safe process search mode를 사용하지 않는다. 따라서 SearchPath는 지정된 DLL에 대해 사용자의 현재 작업 디렉터리를 검색할 가능성이 있다. 공격자가 malicious 버전의 DLL을 현재 작업 디렉터리에 복사한 경우, SearchPath에서 검색한 경로가 malicious DLL을 가리켜 LoadLibrary가 로드된다.
(2) DLL을 검색하는 LoadLibrary 호출을 기반으로 운영체제 버전을 가정하지 마라. DLL이 합법적으로 존재하지 않지만 검색 경로에 malicious 버전의 DLL이 있는 환경에서 응용 프로그램이 실행 중인 경우 malicious 버전의 DLL이 로드될 수 있다. 대신 Getting the System Version에 설명된 recommended techniques을 사용해라.
Requirements
(1) Minimum supported client
Windows XP [desktop apps only]
(2) Minimum supported server
Windows Server 2003 [desktop apps only]
(3) Target Platform
Windows
(4) Header
libloaderapi.h (include Windows.h)
(5) Library
Kernel32.lib
(6) DLL
Kernel32.dll
'ETC > Windows API' 카테고리의 다른 글
GetDlgItemTextA Function (0) | 2019.07.17 |
---|---|
GetDriveTypeA Function (0) | 2019.07.13 |
WaitForSingleObject Function (1) | 2019.05.05 |
CreateRemoteThread Function (0) | 2019.05.04 |
GetProcAddress Function (1) | 2019.05.04 |