컴퓨터 프로그래밍에서 DLL 인젝션(DLL injection)은 다른 프로세스의 주소 공간 내에서 DLL을 강제로 로드시킴으로써 코드를 실행시키는 기술이다.[1] DLL 인젝션은 외부 프로그램을 통해 다른 프로그램에 저작자가 의도하거나 예상하지 않은 영향을 미치기 위해 사용된다.[1][2][3] 예를 들면 삽입된 코드는 시스템 함수 호출을 후킹 하거나[4][5] 또는 보통 방식으로는 읽을 수 없는 패스워드 텍스트 박스의 내용을 읽을 수 있다.[6] 임의적인 코드를 삽입하는데 사용되는 프로그램을 DLL injector라고 부른다.
마이크로소프트 윈도우에는 프로세스에게 DLL의 코드를 로드하고 실행시키는 여러 방법이 있다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
에 목록화 된 DLL들은 User32.dll(이것이 프로세스에 부착되는 순간)을 로드하는 모든 프로세스에서 로드된다.[5][7][8][9] 윈도우 비스타를 시작으로, AppInit_DLL들은 기본 설정으로 비활성화되어 있다.[10] Windows 7 이후로, AppInit_DLL 하부 구조는 code signing을 지원한다.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLs
아래 목록화 된 DLL들은 Win32 API 함수들인 CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW 그리고 WinExec를 호출할 때 로드된다.유닉스 계열 운영체제에서 (ld.so (on BSD) 또는 ld-linux.so (on 리눅스)를 기반으로 한 동적 링커와 함께) 임의적인 라이브러리들은 LD_PRELOAD 환경 변수 내에 있는라이브러리의 경로 이름을 줌으로써 새로운 프로세스에 링크될 수 있다. 이것은 한 프로세스 안에서 전역적으로 또는 개별적으로 세팅될 수 있다.[32]
예를 들면, 배시 셸에서, 이 명령어는 실행 시 링크되는 "test.so" 파일에서 공유 라이브러리와 함께 "prog" 명령어를 실행한다.
LD_PRELOAD="./test.so" prog
이러한 라이브러리는 GCC에 의해서 -fpic or -fPIC 옵션을 통해 링크될 새로운 전역변수를 포함하는 소스 파일을 컴파일하고,[33] -shared
옵션으로 링크함으로써 생성될 수 있다.[34] 이 라이브러리는 프로그램에서 선언된 외부 심볼들에 대한 접근을 갖는다.
-fpic
Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. sqq.
-shared
Produce a shared object which can then be linked with other objects to form an executable. sqq.