DLL 인젝션
IT 위키
더 많은 작업
DLL 인젝션(DLL Injection)은 임의의 DLL 파일을 실행 중인 다른 프로세스의 메모리 영역(주소 공간)으로 강제로 로드해, 그 프로세스 안에서 DLL 의 코드가 실행되게 하는 기법이다.
윈도우의 프로세스는 저마다 독립된 가상 주소 공간을 가진다. 보통은 프로그램이 스스로 필요한 DLL 을 자기 주소 공간에 적재하지만, DLL 인젝션은 바깥에서 대상 프로세스가 원하지 않은 DLL 을 적재시킨다. DLL 이 적재되면 진입점(DllMain)이 대상 프로세스의 스레드로 실행되므로, 주입된 코드는 대상 프로세스의 권한과 메모리에 그대로 접근할 수 있다.
주입되는 곳은 디스크가 아니라 메모리이고, 주입 대상은 파일이 아니라 실행 중인 프로세스다. 디스크의 실행 파일 자체를 고치는 것은 파일 패치·감염이지 DLL 인젝션이 아니다.
- 정상 용도 : 디버거·성능 분석 도구, 입력기(IME), 화면 캡처·접근성 도구, 백신의 API 감시 등이 다른 프로세스의 동작을 관찰·확장하려고 쓴다
- 악용 : 정상 프로세스(explorer.exe, 브라우저 등) 안에 숨어 실행해 탐지를 피하고, 키 입력·계정 정보를 가로채거나(API 후킹) 게임 해킹·권한 상승에 쓴다. MITRE ATT&CK 의 프로세스 인젝션(T1055) 기법 중 하나로 분류된다
| 방법 | 동작 |
|---|---|
| 원격 스레드 생성 | OpenProcess 로 대상 프로세스를 열고, VirtualAllocEx 로 그 주소 공간에 메모리를 잡아 DLL 경로 문자열을 WriteProcessMemory 로 쓴 뒤, CreateRemoteThread 로 LoadLibrary 를 실행하는 스레드를 만든다. 가장 대표적인 방법이다
|
| 메시지 훅 | SetWindowsHookEx 로 전역 훅을 걸면 윈도우 메시지를 받는 프로세스마다 훅 DLL 이 적재된다
|
| 레지스트리 | AppInit_DLLs 값에 DLL 을 등록하면 user32.dll 을 쓰는 프로세스가 시작될 때 함께 적재된다(최신 윈도우는 보안 부팅 시 막는다)
|
| APC 주입 | QueueUserAPC 로 대상 스레드의 비동기 프로시저 호출 대기열에 LoadLibrary 를 넣는다
|
| 반사형(Reflective) DLL 인젝션 | DLL 을 디스크에 두지 않고 메모리에서 직접 매핑·재배치해 적재한다. 파일이 남지 않아 탐지가 어렵다 |
| 기법 | 주입하는 것 | 방식 |
|---|---|---|
| DLL 인젝션 | DLL 파일 | 대상 프로세스가 DLL 을 적재하게 만든다 |
| 코드 인젝션 | 셸코드 같은 기계어 조각 | DLL 없이 코드를 대상 프로세스의 메모리에 직접 쓰고 실행한다 |
| DLL 하이재킹 | 같은 이름의 악성 DLL | 프로그램이 DLL 을 찾는 검색 경로 앞쪽에 파일을 놓아 스스로 잘못 적재하게 한다 |
| 프로세스 할로잉 | 악성 실행 이미지 | 정상 프로세스를 일시 정지 상태로 만들고 메모리 내용을 악성 코드로 바꿔치기한다 |
- 다른 프로세스에 원격 스레드를 만들거나 메모리를 쓰는 API 호출을 감시한다. EDR 과 Sysmon(이벤트 8 CreateRemoteThread, 이벤트 7 이미지 로드)이 이것을 기록한다
- 프로세스에 적재된 모듈 목록을 확인해 서명되지 않았거나 이상한 경로의 DLL 을 찾는다
- 중요 프로세스는 보호 프로세스(PPL)로 실행하고, 코드 서명된 DLL 만 적재되게 정책을 건다
- 사용자 권한을 낮게 유지해 다른 프로세스의 핸들을 얻지 못하게 한다