맨위로가기

DLL 인젝션

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

DLL 인젝션은 실행 중인 프로세스에 동적 링크 라이브러리(DLL) 코드를 삽입하는 기술이다. 윈도우 및 유닉스 계열 운영체제에서 다양한 방식으로 구현될 수 있으며, 애플리케이션의 기능 확장, 동작 변경, 보안 취약점 분석, 악성코드 분석 등 다양한 목적으로 활용된다. 윈도우에서는 레지스트리, CreateRemoteThread 함수, 윈도우 후킹 등을 통해 DLL 인젝션을 수행하며, 유닉스 계열에서는 LD_PRELOAD 환경 변수를 사용하거나 디버거 기반 기술을 활용한다.

더 읽어볼만한 페이지

  • DLL 인젝션 - 후킹
    후킹은 소프트웨어 실행 중 특정 위치에 삽입되어 프로그램의 흐름을 가로채거나 수정하는 기술로, 운영체제 수준의 이벤트 처리부터 응용 프로그램의 함수 호출 가로채기까지 활용되며, API 후킹, DLL 인젝션 등 여러 기술과 함께 사용된다.
  • 스레드 - 멀티스레딩
    멀티스레딩은 프로세스 내에서 여러 스레드를 동시 실행하여 처리 능력을 향상시키는 기술로, 응답성 향상과 자원 공유 등의 장점이 있지만, 자원 간섭과 소프트웨어 복잡성 증가 등의 단점도 존재하며, 다양한 모델과 구현 방식, 스레드 스케줄러, 가상 머신 활성화 가능성 등을 고려해야 한다.
  • 스레드 - 동시 멀티스레딩
    동시 멀티스레딩(SMT)은 슈퍼스칼라 구조 기반으로 한 클럭 사이클 내에 여러 스레드의 명령어를 동시에 실행하여 CPU 자원 활용률을 높이는 기술이지만, 자원 경합, 성능 저하, 보안 취약점 등의 단점도 있으며, 인텔 하이퍼 스레딩이 대표적이다.
  • 라이브러리 - 바이너리 재컴파일러
  • 라이브러리 - 동적 링크 라이브러리
    동적 링크 라이브러리(DLL)는 윈도우 운영체제에서 프로그램 실행 시 필요한 코드와 데이터를 제공하며, 여러 프로그램에서 공유되어 메모리 효율성을 높이고 모듈성을 향상시키는 라이브러리 형식이다.
DLL 인젝션
일반 정보
이름DLL 인젝션
다른 이름DLL 삽입
DLL 주입
개요
종류소프트웨어 악용 기술
목적다른 프로세스에 코드 삽입 및 실행
기술적 상세
작동 방식대상 프로세스의 주소 공간에 DLL (동적 연결 라이브러리)을 로드하여 실행
사용되는 API (윈도우)CreateRemoteThread
LoadLibrary
WriteProcessMemory
다른 방법Windows Hook (윈도우 후크) 사용
SetWindowsHookEx 함수 사용
활용
합법적 사용디버깅
API 후킹
악의적 사용맬웨어 삽입
프로세스 은닉
키로깅
탐지 및 방지
탐지 방법메모리 분석
API 호출 추적
방지 방법코드 서명
액세스 제어
참고 자료
관련 자료API 후킹
동적 연결 라이브러리 (DLL)

2. 운영체제별 DLL 인젝션 방법

DLL 인젝션은 운영체제별로 다른 방식으로 구현된다.

2. 1. 마이크로소프트 윈도우

마이크로소프트 윈도우(Microsoft Windows) 운영체제는 DLL 인젝션을 위한 여러 가지 방법을 제공한다.

  • 레지스트리의 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs` 항목에 나열된 DLL은 User32.dll을 로드하는 모든 프로세스에서 로드된다. 이 DLL들은 프로세스 초기화 과정에서 로드된다.[46][48][49][50] 윈도우 비스타 이후 AppInit_DLLs는 기본적으로 비활성화되어 있다.[51] 윈도우 7부터는 코드 서명을 지원한다.
  • `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLs` 레지스트리 키에 나열된 DLL들은 `CreateProcess`, `CreateProcessAsUser`, `CreateProcessWithLogonW`, `CreateProcessWithTokenW`, `WinExec` 등의 Win32 API 함수를 호출할 때 로드된다.
  • `CreateRemoteThread`와 같은 프로세스 조작 함수나, AtomBombing과 같은 코드 인젝션 기술[12]을 사용하면 프로그램 실행 중에 DLL을 주입할 수 있다.[46][47][52][53][54][55]
  • `SetWindowsHookEx`와 같은 윈도우즈 후킹 함수를 사용할 수 있다.[43][46][47][67][68][69]
  • `SuspendThread` 또는 `NtSuspendThread` 함수로 모든 스레드를 일시 중단시킨 후, `SetThreadContext` 또는 `NtSetContextThread` 함수로 기존 스레드의 컨텍스트를 변경하여 주입된 코드를 실행할 수 있다.[70]
  • 전체 경로를 지정하지 않고 `LoadLibrary` 또는 `LoadLibraryEx` 함수를 호출하는 윈도우 및 응용 프로그램의 설계상 허점을 이용할 수 있다.[71]
  • 응용 프로그램에 지정된 DLL을 원래 DLL과 동일한 함수를 내보내는 가짜 DLL로 대체할 수 있다.[72]

2. 1. 1. AppInit_DLLs 레지스트리 키

마이크로소프트 윈도우 레지스트리 키 중 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs`에 DLL 경로를 등록하면, User32.dll을 로드하는 모든 프로세스에 해당 DLL이 자동으로 로드된다.[46][48][49][50]

이는 시스템 전체에 영향을 주는 강력한 기능이지만, 악용될 소지가 있어 보안에 취약하다. 윈도우 비스타부터는 AppInit_DLLs 기능이 기본 설정으로 비활성화되었다.[51]

윈도우 7부터는 코드 서명(code signing) 지원이 추가되어, 서명되지 않은 DLL은 로드되지 않도록 보안이 강화되었다. 윈도우 8부터는 보안 부팅(Secure Boot)이 활성화되면 AppInit_DLLs 기능이 완전히 비활성화된다.

2. 1. 2. AppCertDLLs 레지스트리 키

마이크로소프트 윈도우 레지스트리 키 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLs` 아래에 DLL 경로를 등록하면, CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW, WinExec 같은 특정 Win32 API 함수를 호출하는 프로세스에 해당 DLL이 로드된다.[46] 이는 윈도우 10에서 합법적인 DLL 인젝션을 사용하는 방법이며, DLL은 유효한 인증서로 코드 서명되어야 한다.

2. 1. 3. CreateRemoteThread 함수

마이크로소프트 윈도우는 실행 중인 프로그램에 DLL을 삽입하기 위해 `CreateRemoteThread`라는 프로세스 조작 함수를 제공한다.[46][47][52][53][54][55] DLL 인젝션은 다음 단계를 거쳐 수행된다.

# 타겟 프로세스의 핸들을 얻는다. 핸들은 프로세스를 생성[56][57]하거나, 이미 존재하는 프로세스(예: 예측 가능한 타이틀을 가진 윈도우)[58]를 이용하거나, 실행 중인 프로세스 목록[59]에서 대상 실행 파일 이름을 조사[60]하여 얻을 수 있다.

# 타겟 프로세스에 메모리를 할당[61]하고, 할당받은 메모리에 인젝트될 DLL의 이름을 쓴다.[52][62]

## 만약 타겟 프로세스 안에 적절한 DLL 이름이 이미 존재한다면 이 단계는 건너뛸 수 있다. 예를 들어, 프로세스가 'User32.dll', 'GDI32.dll', Kernel32.dll 또는 '32.dll'로 끝나는 다른 라이브러리와 링크되어 있다면, 이를 활용할 수 있다. 이 방법은 과거 DLL 인젝션 방어 기법에 대해 효과적이었다.[63]

# 타겟 프로세스에 새로운 스레드[64]를 생성한다. 이때 스레드의 시작 주소는 `LoadLibrary` 함수의 주소로, 인수는 타겟에 업로드되는 문자열(DLL 이름)의 주소로 설정한다.[52][65]

## `LoadLibrary`에서 새 스레드를 시작하는 대신, 실행 가능한 코드를 타겟에 직접 넣고 실행하는 것도 가능하다.[47]

# 운영체제는 삽입된 DLL의 `DllMain`을 호출한다.[52][66]

## 이 과정에서 DLL_THREAD_ATTACH 알림(스레드 시작 시 모든 로드된 모듈에 보내짐) 때문에 타겟 프로세스에게 발견될 수 있다.[66]

2. 1. 4. 윈도우 후킹

마이크로소프트 윈도우에서는 `SetWindowsHookEx` 같은 윈도우 후킹 함수를 사용할 수 있다.[43][46][47][67][68][69] 이 함수를 이용하면 특정 이벤트가 발생했을 때 DLL이 로드되도록 설정할 수 있다.

2. 1. 5. 스레드 컨텍스트 수정

마이크로소프트 윈도우에서 `SuspendThread` 또는 `NtSuspendThread` 함수를 사용하여 모든 스레드를 중지시키고, `SetThreadContext`나 `NtSetContextThread` 함수를 사용하여 존재하는 응용 프로그램 내 스레드의 컨텍스트를 수정하여 DLL을 로드할 수 있다.[70]

2. 1. 6. DLL 경로 악용

마이크로소프트 윈도우에서 애플리케이션이 DLL의 전체 경로를 지정하지 않고 `LoadLibrary` 함수를 호출하는 경우, DLL 검색 경로를 조작하여 악의적인 DLL을 로드할 수 있다.[71]

2. 1. 7. DLL 대체

마이크로소프트 윈도우에서 DLL 인젝션은 응용 프로그램에 명시된 DLL을 원본과 똑같은 함수 호출을 내보내게 구현된 로그 교체로 대체하는 방식으로 수행할 수 있다.[72]

2. 2. 유닉스 계열

유닉스 계열 운영체제에서는 `LD_PRELOAD` 환경 변수를 사용하여 DLL (공유 라이브러리) 인젝션을 수행할 수 있다.[73][37] macOS에서는 `DYLD_INSERT_LIBRARIES`와 `DYLD_FORCE_FLAT_NAMESPACE` 환경 변수를 사용하여 비슷한 작업을 수행할 수 있다.[40]

2. 2. 1. LD_PRELOAD 환경 변수

유닉스 계열 운영체제(ld.so (on BSD) 또는 ld-linux.so (on 리눅스) 기반)에서 동적 링커를 사용할 때, `LD_PRELOAD` 환경 변수에 라이브러리 경로를 지정하면 새로운 프로세스에 해당 라이브러리를 링크할 수 있다. 이는 프로세스 안에서 전역적 또는 개별적으로 설정할 수 있다.[73]

예를 들어, 배시 셸에서 다음 명령어를 사용하면 "prog" 명령어 실행 시 "test.so" 공유 라이브러리가 함께 링크된다.

`LD_PRELOAD="./test.so" prog`

이러한 라이브러리는 GCC에서 -fpic 또는 -fPIC 옵션으로 컴파일하고,[74] `-shared` 옵션으로 링크하여 생성할 수 있다.[75] 이 라이브러리는 프로그램에서 선언된 외부 심볼에 접근할 수 있다.

디버거 기반 기술도 사용 가능하다.[76]

2. 2. 2. 디버거 기반 기술

유닉스 계열 시스템에서는 디버거 기반 기술을 사용하여 DLL 인젝션을 수행할 수도 있다.[76][41]

3. DLL 인젝션 활용 사례

DLL 인젝션은 다음과 같은 다양한 목적으로 활용될 수 있다.


  • 애플리케이션 기능 확장 및 동작 변경: 자세한 내용
  • 설정 정보 접근 처리 변경: 자세한 내용
  • DLL 함수 호출 감시 및 로깅: 자세한 내용
  • 마이크로소프트 윈도우즈(Microsoft Windows)에서 DLL 강제 로드 및 실행 방법:
  • 레지스트리 항목 이용.
  • 프로세스 조작 함수 또는 코드 인젝션 기술 사용.[12]
  • 윈도우즈 후킹 호출.[2][5][6][28][29][30]
  • 응용 프로그램 기존 스레드 컨텍스트 수정.[4][31][32]
  • 윈도우즈 및 응용 프로그램 설계 제한 악용.[33][34][35]
  • 운영 체제 수준 심 이용.
  • 악성 대체 DLL 사용.[36]

3. 1. 애플리케이션 기능 확장 및 동작 변경

DLL 인젝션을 통해 애플리케이션의 기능을 확장하거나, 기존 동작을 변경할 수 있다.

  • 애플리케이션 작동 환경 위장: 실제로는 Windows 7에서 작동하고 있지만, 애플리케이션의 문의에는 'Windows XP에서 작동하고 있다'라고 위장한 응답을 반환하는 것이 가능하다. 많은 운영 체제에는 가동 환경 정보를 제공하는 DLL 내의 서비스 함수가 있는데, 이 함수를 후킹하여 원래와는 다른 응답을 반환하는 처리 루틴을 실행시키는 방식이다.
  • 설정 정보 접근 처리 변경: 포터블 애플리케이션에서 많이 사용된다. 작동을 위해 레지스트리 등에 읽고 쓰기가 필수적인 애플리케이션을 쓰기 불가 매체 (CD-ROM 등) 상에서 작동시키는 경우에 활용된다.
  • DLL 함수 호출 감시·기록: 감시·기록하고 싶은 DLL 함수를 후킹하여, 애플리케이션이 DLL 함수를 호출했을 때, 해당 로그를 기록한 뒤 원래의 DLL로 처리를 넘긴다. 이를 통해 DLL 함수의 호출을 기록하고, 디버그나 성능 측정 등에 이용할 수 있다.

3. 2. 설정 정보 접근 처리 변경

포터블 애플리케이션에서 DLL 인젝션이 많이 사용된다. DLL 인젝션을 이용하면 레지스트리 등에 읽고 쓰기가 필수적인 애플리케이션을 쓰기 불가 매체 (CD-ROM 등) 상에서 작동시킬 수 있다. DLL 인젝션을 통해 레지스트리 대신 파일에 설정을 저장하도록 동작을 변경할 수 있다.[1]

3. 3. DLL 함수 호출 감시 및 로깅

감시·기록하고 싶은 DLL 함수를 후킹하여, 애플리케이션이 DLL 함수를 호출했을 때 해당 로그를 기록한 뒤 원래의 DLL로 처리를 넘긴다. 그렇게 함으로써 DLL 함수의 호출을 기록하고, 디버그나 성능 측정 등에 이용할 수 있다.[4]

4. 샘플 코드

(샘플 코드는 제공되지 않았으므로, 이전 출력과 동일합니다.)

샘플 코드는 제공되지 않았습니다.

참조

[1] 웹사이트 Analyzing DLL Injection http://bluenotch.com[...] Bluenotch 2006
[2] 웹사이트 Tutorial 24: Windows Hooks http://win32assembly[...] 2002-08
[3] 웹사이트 Extending Task Manager with DLL Injection http://secure.codepr[...] 2005-05-19
[4] 웹사이트 DLL Injection and function interception tutorial https://www.codeproj[...] 2003-10-23
[5] 웹사이트 API hooking revealed http://www.codeproje[...] 2002-12-02
[6] 웹사이트 Three Ways to Inject Your Code into Another Process http://www.codeproje[...] 2003-08-20
[7] 웹사이트 Working with the AppInit_DLLs registry value https://support.micr[...] Microsoft 2006-11-21
[8] 웹사이트 AppInit_DLLs should be renamed Deadlock_Or_Crash_Randomly_DLLs https://devblogs.mic[...] Microsoft 2007-12-13
[9] 웹사이트 dllmain.c http://svn.reactos.o[...] ReactOS Foundation 2008-07-08
[10] 문서 AppInit_DLLs in Windows 7 and Windows Server 2008 R2 https://download.mic[...]
[11] 웹사이트 AppInit DLLs and Secure Boot https://msdn.microso[...] MSDN 2016-03-29
[12] 뉴스 'AtomBombing' Microsoft Windows Via Code Injection http://www.darkreadi[...] Dark Reading 2017-04-20
[13] 웹사이트 InjectDLL http://www.quantumg.[...]
[14] 웹사이트 Dll Injection http://www.dreaminco[...] MediaGroup1 2006-05-04
[15] 웹사이트 DLL Injection Framework http://www.ring3circ[...] WordPress 2007-11
[16] 웹사이트 A More Complete DLL Injection Solution Using CreateRemoteThread http://www.codeproje[...] 2007-08-17
[17] 웹사이트 CreateProcess https://msdn.microso[...] Microsoft
[18] 웹사이트 PROCESS_INFORMATION https://msdn.microso[...] Microsoft
[19] 웹사이트 GetWindowThreadProcessId Function https://msdn.microso[...] Microsoft
[20] 웹사이트 EnumProcesses https://msdn.microso[...] Microsoft
[21] 웹사이트 GetModuleBaseName https://msdn.microso[...] Microsoft
[22] 웹사이트 VirtualAllocEx https://msdn.microso[...] Microsoft
[23] 웹사이트 WriteProcessMemory https://msdn.microso[...] Microsoft
[24] 웹사이트 Outpost Bypassing Self-Protection via Advanced DLL injection with handle stealing Vulnerability http://www.matousec.[...] 2006-12-01
[25] 웹사이트 CreateRemoteThread https://msdn.microso[...] Microsoft
[26] 웹사이트 LoadLibrary https://msdn.microso[...] Microsoft
[27] 웹사이트 DllMain https://msdn.microso[...] Microsoft
[28] 웹사이트 SetWindowsHookEx Function https://msdn.microso[...] Microsoft
[29] 웹사이트 AppInit_DLLs Registry Value and Windows 95 https://support.micr[...] Microsoft 2005-03-01
[30] 웹사이트 Dll Injection using SetWindowsHookEx() Method http://www.gamerever[...] 2008-04-03
[31] 웹사이트 SetThreadContext DLL Injection http://nerd.egloos.c[...] 2007-01-16
[32] 웹사이트 DLL Injector http://busybin.com/b[...] 2008-09-06
[33] 웹사이트 Insecure Library Loading Could Allow Remote Code Execution https://technet.micr[...] Microsoft 2011-06-10
[34] 웹사이트 Secure loading of libraries to prevent DLL preloading attacks https://support.micr[...] Microsoft 2011-06-10
[35] 웹사이트 Microsoft Security Advisory: Insecure library loading could allow remote code execution https://support.micr[...] Microsoft 2011-06-10
[36] 웹사이트 Stuxnet Infection of Step 7 Projects https://community.br[...] Symantec 2010-09-26
[37] 웹사이트 ld.so/ld-linux.so – dynamic linker/loader http://unixhelp.ed.a[...] 2008-08-31
[38] 웹사이트 Code Gen Options https://gcc.gnu.org/[...] Free Software Foundation 2008-08-31
[39] 웹사이트 Link Options https://gcc.gnu.org/[...] Free Software Foundation 2008-08-31
[40] 웹사이트 The LD_PRELOAD trick http://www.goldsboro[...] Peter Goldsborough 2017-05-17
[41] 웹사이트 Code Injection into Running Linux Application http://www.codeproje[...] 2010-11-18
[42] 웹인용 Analyzing DLL Injection http://bluenotch.com[...] Bluenotch 2016-02-11
[43] 웹인용 Tutorial 24: Windows Hooks http://win32assembly[...] 2002-08
[44] 웹인용 Extending Task Manager with DLL Injection http://secure.codepr[...] CodeProject 2005-05-19
[45] 웹인용 DLL Injection and function interception tutorial http://www.codeproje[...] CodeProject 2003-10-23
[46] 웹인용 API hooking revealed http://www.codeproje[...] CodeProject 2002-12-02
[47] 웹인용 Three Ways to Inject Your Code into Another Process http://www.codeproje[...] CodeProject 2003-08-20
[48] 웹인용 Working with the AppInit_DLLs registry value http://support.micro[...] 마이크로소프트 2006-11-21
[49] 웹인용 AppInit_DLLs should be renamed Deadlock_Or_Crash_Randomly_DLLs http://blogs.msdn.co[...] 마이크로소프트 2007-12-13
[50] 웹인용 dllmain.c http://svn.reactos.o[...] ReactOS Foundation 2008-07-08
[51] 문서 AppInit_DLLs in Windows 7 and Windows Server 2008 R2 http://download.micr[...]
[52] 웹인용 InjectDLL http://www.quantumg.[...] 2016-02-11
[53] 웹인용 Dll Injection http://www.dreaminco[...] MediaGroup1 2006-05-04
[54] 웹인용 DLL Injection Framework http://www.ring3circ[...] WordPress 2007-11
[55] 웹인용 A More Complete DLL Injection Solution Using CreateRemoteThread http://www.codeproje[...] CodeProject 2007-08-17
[56] 웹인용 CreateProcess http://msdn.microsof[...] 마이크로소프트 2016-02-11
[57] 웹인용 PROCESS_INFORMATION http://msdn.microsof[...] 마이크로소프트 2016-02-11
[58] 웹인용 GetWindowThreadProcessId Function http://msdn.microsof[...] 마이크로소프트 2016-02-11
[59] 웹인용 EnumProcesses http://msdn.microsof[...] 마이크로소프트 2016-02-11
[60] 웹인용 GetModuleBaseName http://msdn.microsof[...] 마이크로소프트 2016-02-11
[61] 웹인용 VirtualAllocEx http://msdn.microsof[...] Microsoft 2016-02-11
[62] 웹인용 WriteProcessMemory http://msdn.microsof[...] Microsoft 2016-02-11
[63] 웹인용 Outpost Bypassing Self-Protection via Advanced DLL injection with handle stealing Vulnerability http://www.matousec.[...] 2006-12-01
[64] 웹인용 CreateRemoteThread http://msdn.microsof[...] 마이크로소프트 2016-02-11
[65] 웹인용 LoadLibrary http://msdn.microsof[...] 마이크로소프트 2016-02-11
[66] 웹인용 DllMain http://msdn.microsof[...] 마이크로소프트 2016-02-11
[67] 웹인용 SetWindowsHookEx Function http://msdn.microsof[...] 마이크로소프트 2016-02-11
[68] 웹인용 AppInit_DLLs Registry Value and Windows 95 http://support.micro[...] 마이크로소프트 2005-03-01
[69] 웹인용 Dll Injection using SetWindowsHookEx() Method http://www.gamerever[...] 2008-04-03
[70] 웹인용 DLL Injector http://busybin.com/b[...] 2008-09-06
[71] 웹인용 Secure loading of libraries to prevent DLL preloading attacks http://support.micro[...] 마이크로소프트 2011-06-10
[72] 웹인용 Stuxnet Infection of Step 7 Projects http://www.symantec.[...] Symantec 2010-09-26
[73] 웹인용 ld.so/ld-linux.so – dynamic linker/loader https://web.archive.[...] 1998-03-14
[74] 웹인용 Code Gen Options http://gcc.gnu.org/o[...] Free Software Foundation
[75] 웹인용 Link Options http://gcc.gnu.org/o[...] Free Software Foundation
[76] 웹인용 Code Injection into Running Linux Application https://web.archive.[...] 2009-02-12



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com