본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

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 만 적재되게 정책을 건다
  • 사용자 권한을 낮게 유지해 다른 프로세스의 핸들을 얻지 못하게 한다