{{위키데이터 속성 추적}}
[[컴퓨터 프로그래밍]]에서 '''DLL 인젝션'''(DLL injection)은 다른 프로세스의 [[주소 공간]] 내에서 DLL을 강제로 로드시킴으로써 코드를 실행시키는 기술이다.<ref name=Shewmaker>{{웹 인용
 |url          = http://bluenotch.com/files/Shewmaker-DLL-Injection.pdf
 |title        = Analyzing DLL Injection
 |accessdate   = 2016-02-11
 |author       = James Shewmaker <!-- If anyone has the middle initial for this author, please use it. I am James Hamilton Shewmaker, son of Fred A. Shewmaker and K. Joyce (Bechdolt) Shewmaker and I am not the author of this paper. -->
 |year         = 2006
 |format       = PDF
 |work         = GSM Presentation
 |publisher    = Bluenotch
 |보존url    = https://web.archive.org/web/20081203175318/http://www.bluenotch.com/files/Shewmaker-DLL-Injection.pdf
 |보존날짜 = 2008-12-03
 |url-status = dead
}}</ref> DLL 인젝션은 외부 프로그램을 통해 다른 프로그램에 저작자가 의도하거나 예상하지 않은 영향을 미치기 위해 사용된다.<ref name=Shewmaker /><ref name=Iczelion>{{웹 인용
 |url          = http://win32assembly.online.fr/tut24.html
 |title        = Tutorial 24: Windows Hooks
 |accessdate   = 2016-02-11
 |author       = Iczelion<!-- Yes, this is a pseudonym. But he is of some note, so I decided to include it. -->
 |date         = August 2002<!-- Actual date may be somewhat earlier? -->
 |work         = Iczelion's Win32 Assembly Homepage
 |보존url    = https://web.archive.org/web/20080801155929/http://win32assembly.online.fr/tut24.html
 |보존날짜 = 2008-08-01
 |url-status = dead
}}</ref><ref>{{웹 인용
 |url          = http://secure.codeproject.com/KB/threads/taskex.aspx
 |title        = Extending Task Manager with DLL Injection
 |accessdate   = 2016-02-11
 |author       = Rocky Pulley<!-- Probably pseudonym. -->
 |date         = May 19, 2005
 |work         = CodeProject
 |publisher    = CodeProject
 |보존url    = https://archive.today/20090206164411/http://secure.codeproject.com/KB/threads/taskex.aspx
 |보존날짜 = 2009-02-06
 |url-status = dead
}}</ref> 예를 들면 삽입된 코드는 시스템 함수 호출을 [[후킹]] 하거나<ref name=Rowhani>{{웹 인용
 |url=http://www.codeproject.com/KB/DLL/DLL_Injection_tutorial.aspx
 |title=DLL Injection and function interception tutorial
 |accessdate=2016-02-11
 |author=Nasser R. Rowhani
 |date=October 23, 2003
 |work=CodeProject
 |publisher=CodeProject
 |archive-date=2008-06-15
 |archive-url=https://web.archive.org/web/20080615004049/http://www.codeproject.com/KB/DLL/DLL_Injection_tutorial.aspx
 }}</ref><ref name=Ivanov>{{웹 인용
 |url=http://www.codeproject.com/KB/system/hooksys.aspx
 |title=API hooking revealed
 |accessdate=2016-02-11
 |author=Ivo Ivanov
 |date=December 2, 2002
 |work=CodeProject
 |publisher=CodeProject
 |archive-date=2008-10-14
 |archive-url=https://web.archive.org/web/20081014114733/http://www.codeproject.com/KB/system/hooksys.aspx
 }}</ref> 또는 보통 방식으로는 읽을 수 없는 [[암호|패스워드]] 텍스트 박스의 내용을 읽을 수 있다.<ref name=Kuster>{{웹 인용
 |url=http://www.codeproject.com/KB/threads/winspy.aspx
 |title=Three Ways to Inject Your Code into Another Process
 |accessdate=2016-02-11
 |author=Robert Kuster
 |date=August 20, 2003
 |work=CodeProject
 |publisher=CodeProject
 |archive-date=2008-07-20
 |archive-url=https://web.archive.org/web/20080720034310/http://www.codeproject.com/KB/threads/winspy.aspx
 }}</ref> 임의적인 코드를 삽입하는데 사용되는 프로그램을 '''DLL injector'''라고 부른다.

== 마이크로소프트 윈도우에서의 접근 ==
[[마이크로소프트 윈도우]]에는 프로세스에게 DLL의 코드를 로드하고 실행시키는 여러 방법이 있다.
* [[레지스트리]] 엔트리 <code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs</code> 에 목록화 된 DLL들은 User32.dll(이것이 프로세스에 부착되는 순간)을 로드하는 모든 프로세스에서 로드된다.<ref name=Ivanov /><ref>{{웹 인용
 |url=http://support.microsoft.com/kb/197571
 |title=Working with the AppInit_DLLs registry value
 |accessdate=2016-02-11
 |date=November 21, 2006
 |work=Microsoft Help and Support
 |publisher=[[마이크로소프트]]
}}</ref><ref>{{웹 인용
 |url=http://blogs.msdn.com/oldnewthing/archive/2007/12/13/6648400.aspx
 |title=AppInit_DLLs should be renamed Deadlock_Or_Crash_Randomly_DLLs
 |accessdate=2016-02-11
 |author=Raymond Chen
 |date=December 13, 2007
 |work=The Old New Thing
 |publisher=[[마이크로소프트]]
}}</ref><ref>{{웹 인용
 |url        = http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/dllmain.c?view=markup
 |title      = dllmain.c
 |accessdate = 2016-02-11
 |date       = July 8, 2008
 |work       = ReactOS
 |publisher  = ReactOS Foundation
}}{{깨진 링크|url=http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/dllmain.c?view=markup }}</ref> [[윈도우 비스타]]를 시작으로, AppInit_DLL들은 기본 설정으로 비활성화되어 있다.<ref>[http://download.microsoft.com/download/7/E/7/7E7662CF-CBEA-470B-A97E-CE7CE0D98DC2/AppInit_Win7.docx AppInit_DLLs in Windows 7 and Windows Server 2008 R2]</ref> Windows 7 이후로, AppInit_DLL 하부 구조는 code signing을 지원한다.
* 레지스트리 키  <code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLs</code> 아래 목록화 된 DLL들은 Win32 API 함수들인 CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW 그리고 WinExec를 호출할 때 로드된다.
* CreateRemoteThread 같은 프로세스 조작 함수들은 실행 중인 프로그램에 DLL을 삽입하기 위해서 사용될 수 있다.<ref name=Ivanov /><ref name=Kuster /><ref name=Waddington>{{웹 인용
 |url=http://www.quantumg.net/injectdll.php
 |title=InjectDLL
 |accessdate=2016-02-11
 |author=Trent Waddington
 |archive-date=2019-12-30
 |archive-url=https://web.archive.org/web/20191230034250/http://www.quantumg.net/injectdll.php
 }}</ref><ref>{{웹 인용
 |url          = http://www.dreamincode.net/code/snippet407.htm
 |title        = Dll Injection
 |accessdate   = 2016-02-11
 |date         = May 4, 2006
 |work         = DreamInCode.net
 |publisher    = MediaGroup1
 |보존url    = https://web.archive.org/web/20080902002043/http://www.dreamincode.net/code/snippet407.htm
 |보존날짜 = 2008-09-02
 |url-status = dead
}}</ref><ref>{{웹 인용
 |url=http://www.ring3circus.com/downloads/dll-injection-framework/
 |title=DLL Injection Framework
 |accessdate=2016-02-11
 |author=Greg Jenkins
 |date=November 2007
 |work=Ring3 Circus
 |publisher=WordPress
 |archive-date=2020-06-28
 |archive-url=https://web.archive.org/web/20200628101235/http://www.ring3circus.com/downloads/dll-injection-framework
 |url-status=
 }}</ref><ref>{{웹 인용
 |url=http://www.codeproject.com/Articles/20084/A-More-Complete-DLL-Injection-Solution-Using-Creat
 |title=A More Complete DLL Injection Solution Using CreateRemoteThread
 |accessdate=2016-02-11
 |author=Drew Benton
 |date=August 17, 2007
 |work=CodeProject
 |publisher=CodeProject
}}</ref>
*# 타겟 프로세스의 handle을 오픈한다. 이것은 프로세스를 생겨나게 하거나<ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms682425.aspx
 |title=CreateProcess
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
}}
</ref><ref>
{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms684873(VS.85).aspx
 |title=PROCESS_INFORMATION
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
 |보존url=https://web.archive.org/web/20160220055641/https://msdn.microsoft.com/en-us/library/ms684873(VS.85).aspx
 |보존날짜=2016-02-20
 |url-status=dead
 }}
</ref> 프로세스에 의해 생겨났으며 존재한다고 알려진 것(예를 들면 예상 가능한 타이틀을 가진 [[창 (컴퓨팅)|윈도우]]<ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms633522(VS.85).aspx
 |title=GetWindowThreadProcessId Function
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
}}</ref>)을 키 오프하거나, 실행중인 프로세스들<ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms682629(VS.85).aspx
 |title=EnumProcesses
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
}}</ref>의 목록을 얻고 타겟 실행 파일의 이름을 조사함으로써 이루어된다.<ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms683196(VS.85).aspx
 |title=GetModuleBaseName
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
}}</ref>
*# 타겟 프로세스에서 메모리를 할당하고,<ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/aa366890(VS.85).aspx
 |title=VirtualAllocEx
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=Microsoft
}}</ref> 할당받은 메모리에 인젝트될 DLL의 이름을 쓴다.<ref name=Waddington /><ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms681674.aspx
 |title=WriteProcessMemory
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=Microsoft
}}</ref>
*#: 이 단계는 만약 적절한 DLL 이름이 이미 타겟 프로세스 안에서 사용 가능하다면 건너뛸 수 있다. 예를 들면, 프로세스가 ‘User32.dll’, ‘GDI32.dll’, ‘[[윈도우 라이브러리 파일|Kernel32.dll]]’ 또는 ‘32.dll’로 끝나는 다른 라이브러리와 링크되어 있다면, 로드하는 것이 가능하다. 이 기술은 과거에는 DLL 인젝션에서 프로세스들을 지키는 방식에 대해 효과적이라고 입증되었다.<ref>{{웹 인용
 |url=http://www.matousec.com/info/advisories/Outpost-Bypassing-Self-Protection-via-Advanced-DLL-injection-with-handle-stealing.php
 |title=Outpost Bypassing Self-Protection via Advanced DLL injection with handle stealing Vulnerability
 |accessdate=2016-02-11
 |date=December 1, 2006
 |work=Matousec
}}</ref>
*# 타겟 프로세스에 새로운 [[스레드]]를<ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms682437(VS.85).aspx
 |title=CreateRemoteThread
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
}}</ref> (스레드의 시작 주소는 LoadLibrary의 주소로, 인수는 타겟에 업로드되는 문자열의 주소로 해서) 생성한다.<ref name=Waddington /><ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx
 |title=LoadLibrary
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
}}</ref>
*#: 로드될 DLL의 이름을 쓰고 LoadLibrary에서 새로운 스레드를 시작하는 것 대신, 실행 가능한 코드를 타겟에 넣고, 그 코드를 실행시키는 것도 가능하다.<ref name=Kuster />
*# 운영체제는 이제 삽입된 DLL에서 DllMain을 호출할 것이다.<ref name=Waddington /><ref name=DllMain>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms682583.aspx
 |title=DllMain
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
}}</ref>
*: 경계 없이, 이 접근은 (스레드 시작 시 모든 로드된 모듈에 보내지는) DLL_THREAD_ATTACH 알림 때문에 타겟 프로세스에게 발견될 수 있다.<ref name=DllMain />
* SetWindowsHookEx 같은 윈도우 [[후킹]] 함수.<ref name=Iczelion /><ref name=Ivanov /><ref name=Kuster /><ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/ms644990.aspx
 |title=SetWindowsHookEx Function
 |accessdate=2016-02-11
 |work=Platform SDK for Windows XP SP2
 |publisher=[[마이크로소프트]]
}}</ref><ref>{{웹 인용
 |url=http://support.microsoft.com/kb/134655
 |title=AppInit_DLLs Registry Value and Windows 95
 |accessdate=2016-02-11
 |date=March 1, 2005
 |work=Microsoft Help and Support
 |publisher=[[마이크로소프트]]
}}</ref><ref>{{웹 인용
 |url=http://www.gamereversal.com/index.php?option=com_content&view=article&id=56%3Adll-injection-using-setwindowshookex-method&catid=39%3Ac--c-core-concepts&Itemid=1
 |title=Dll Injection using SetWindowsHookEx() Method
 |accessdate=2016-02-11
 |date=April 3, 2008
 |work=Game Reversal
}}</ref>
* 모든 스레드들을 중지시키기 위해 SuspendThread 또는 NtSuspendThread 함수를 사용하고 삽입된 코드를 실행할 목적으로, 존재하는 응용 프로그램 내의 스레드의 문맥을 수정하기 위해 SetThreadContext나 NtSetContextThread 함수를 사용하면 DLL이 로드된다.<ref>{{웹 인용
 |url          = http://busybin.com/busybin/C++/dll_injector/
 |title        = DLL Injector
 |accessdate   = 2016-02-11
 |author       = Ben Botto
 |date         = September 6, 2008
 |보존url    = https://web.archive.org/web/20090207055608/http://busybin.com/busybin/C++/dll_injector/
 |보존날짜 = 2009-02-07
 |url-status = dead
}}</ref>
* 익스플로잇은 윈도우에서 한계치들을 디자인하고 모든 검증된 DLL 경로 명시 없이 LoadLibrary() 함수를 호출하는 응용 프로그램들을 로드된다.<ref>{{웹 인용
 |url=http://support.microsoft.com/kb/2389418
 |publisher=[[마이크로소프트]]
 |title=Secure loading of libraries to prevent DLL preloading attacks
 |accessdate=2016-02-11
 |date=10 June 2011}}</ref>
* 응용 프로그램에 명시된 DLL을 원본 같이 똑같은 함수 호출을 내보내게 구현된 로그 교체로 대체하는 것.<ref>{{웹 인용
 | url=http://www.symantec.com/connect/blogs/stuxnet-infection-step-7-projects
 | title=Stuxnet Infection of Step 7 Projects
 | author=Nicolas Falliere
 | publisher=Symantec
 | date=26 September 2010
}}</ref>

== 유닉스 계열에서의 접근 ==
[[유닉스 계열|유닉스 계열]] 운영체제에서 (ld.so (on [[BSD]]) 또는 ld-linux.so (on [[리눅스]])를 기반으로 한 동적 링커와 함께) 임의적인 라이브러리들은 LD_PRELOAD [[환경 변수]] 내에 있는라이브러리의 경로 이름을 줌으로써 새로운 프로세스에 링크될 수 있다. 이것은 한 프로세스 안에서 전역적으로 또는 개별적으로 세팅될 수 있다.<ref>{{웹 인용
 |url          = http://unixhelp.ed.ac.uk/CGI/man-cgi?ld.so+8
 |title        = ld.so/ld-linux.so – dynamic linker/loader
 |accessdate   = 2016-02-11
 |author       = Linus Torvalds
 |author2      = David Engel
 |author3      = Eric Youngdale
 |author4      = Peter MacDonald
 |author5      = Hongjiu Lu
 |author6      = Lars Wirzenius
 |author7      = Mitch D'Souza
 |date         = March 14, 1998
 |work         = UNIX man pages
 |보존url    = https://web.archive.org/web/20090206215616/http://unixhelp.ed.ac.uk/CGI/man-cgi?ld.so+8
 |보존날짜 = 2009-02-06
 |url-status = dead
}}</ref>

예를 들면, [[배시 (유닉스 셸)|배시 셸]]에서, 이 명령어는 실행 시 링크되는 "test.so" 파일에서 공유 라이브러리와 함께 "prog" 명령어를 실행한다.
 LD_PRELOAD="./test.so" prog
이러한 라이브러리는 [[GNU 컴파일러 모음|GCC]]에 의해서 -fpic or -fPIC 옵션을 통해 링크될 새로운 전역변수를 포함하는 소스 파일을 컴파일하고,<ref>{{웹 인용
 |url=http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Code-Gen-Options.html#Code-Gen-Options
 |title=Code Gen Options
 |accessdate=2016-02-11
 |work=Using the GNU Compiler Collection (GCC)
 |publisher=Free Software Foundation
 |quote=<code>-fpic</code> Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. ''sqq.''
}}</ref> <code>-shared</code> 옵션으로 링크함으로써 생성될 수 있다.<ref>{{웹 인용
 |url=http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Link-Options.html#Link-Options
 |title=Link Options
 |accessdate=2016-02-11
 |work=Using the GNU Compiler Collection (GCC)
 |publisher=Free Software Foundation
 |quote=<code>-shared</code> Produce a shared object which can then be linked with other objects to form an executable. ''sqq.''
}}</ref> 이 라이브러리는 프로그램에서 선언된 외부 심볼들에 대한 접근을 갖는다.

또한 [[디버거]] 기반 기술도 사용 가능하다.<ref>{{웹 인용
 |url=http://www.codeproject.com/KB/DLL/code_injection.aspx
 |title=Code Injection into Running Linux Application
 |accessdate=2016-02-11
 |author=Gregory Shpitalnik
 |work=Code Project
 |date=February 12, 2009
 |archive-date=2010-06-12
 |archive-url=https://web.archive.org/web/20100612084526/http://www.codeproject.com/KB/DLL/code_injection.aspx
 |url-status=dead
 }}</ref>

== 각주 ==
{{각주|colwidth = 30em}}

== 외부 링크 ==
* [https://www.htbridge.com/publications/spying_internet_explorer_8_0.html Spying Internet Explorer 8.0 by DLL injection - Brian Mariani]{{깨진 링크|url=https://www.htbridge.com/publications/spying_internet_explorer_8_0.html }}

[[분류:라이브러리]]
[[분류:윈도우 관리]]
[[분류:스레드]]
[[분류:DLL 인젝션]]