블로그 이전으로 작성시간 변경됨 - 기존 [2018.08.01 01:09] 작성


악성코드 분석에 있어서 코드인젝션 기법은 반드시 알고 있어야 하는 개념이다. 본 포스팅에서는 코드인젝션에 대한 개념을 정리한다.


1. 코드인젝션이란?


- 코드인젝션은 (정상적인) 프로세스에 악성코드를 주입하는 기술

- 악성코드가 별도의 프로세스를 생성하지 않고 (정상적인) 프로세스의 메모리 영역에 숨어서 동작

- 프로세스 목록만을 조사해서는 탐지할 수 없음

- 프로세스 이름을 기반으로 한 필터링(방화벽 등) 우회 가능

- 주입된 코드는 Target Process의 메모리 영역에 마음대로 접근할 수 있음




1.1 코드 인젝션의 종류


1. Remote Code Injection

2. Process Hollowing

3. Dll Injection

4. Reflective DLL Injection 등






2. Remote Code Injection



1) AdjustTokenPrivilege() -> SeDebugPrivilege 권한 획득
2) Process walking : Target Process(Host Process) 탐색
3) Target Process의 핸들 획득
4) VirtualAllocEx() -> Target Process의 가상 주소 공간에 새로운 메모리 영역 할당
5) VirtualProtectEx() -> Target Process 내에 새롭게 할당받은 메모리 프로텍트 속성에 read/write/execute 권한 추가
6) 주입할 코드 로드 : 주입 경로(네트워크(Memory only malware), 파일, 레지스트리 등)
7) WriteProcessMemory() -> 읽어들인 코드를 Target Process 내에 새롭게 할당받은 메모리 영역에 주입
8) CreateRemoteThread() -> 쓰레드 생성 후 EPROCESS 구조체에 있는 쓰레드리스트에 새로운 쓰레드를 등록하여 주입된 코드를 실행하도록 함






2.1 Remote Code Injection에 쓰이는 주요 API


1) AdjustTokenPrivilege()
    타겟 프로세스의 메모리에 코드를 주입하기 위해 SeDebugPrivilege 권한 활성화
2) OpenProcess()
    타겟 프로세스의 핸들 획득
3) VirtualAllocEx()
    SeDebugPrivilege 권한이 있으면 다른 프로세스의 빈 영역에 코드 주입 가능
    타겟 프로세스의 가상 주소 공간에 새로운 메모리 영역 할당
4) VirtualProtectEx()
    타겟 프로세스 내에 새롭게 할당받은 메모리의 프로텍트 속성에 read/write/execute 추가
    메모리 프로텍트 속성은 VAD 영역에 저장됨






3. Process Hollowing



1) AdjustTokenPrivilege() -> Target Process에 메모리를 주입하기 위해 SeDebugPrivilege 권한 활성화
2) CreateProcess(..CREATE_SUSPENDED..) -> Target Process를 suspended 모드로 만듬
    cf) suspended 모드 : EPROCESS 구조체 등 정상 생성되나 동작은 하지 않음
3) ZwUnmapViewOfSection() or NtUnmapViewOfSection() -> Target Process의 메모리 영역을 비움(Hollowing out)
4) VirtualAllocEx() -> Target Process의 가상 주소에 새로운 메모리 영역 할당

5) 주입할 코드 로드 : 네트워크, 파일, 레지스트리 등
6) WriteProcessMemory() -> 읽어들인 코드를 Target Process 내에 새롭게 할당받은 메모리 영역에 주입
7) GetThreadContext() && SetThreadContext() -> 다음에 실행할 명령어의 주소가 주입한 코드의 시작점이 되도록 Thread context 변경
8) ResumeThread() -> suspended 상태의 Target Thread 실행





4. Dll Injection



- Target Process에 악성 DLL을 강제로 삽입하는 기법
- 로딩된 DLL 파일은 Target Process의 메모리 공간에 접근할 수 있음
- 프로그램 기능개선, 버그 패치, 악성 목적 으로 이용 가능
- 종류 : 레지스트리 조작, SetWindowsHookEx() 이용, CreateRemoteThread() 이용 등


- 키로거 제작에 많이 이용되는API(SetWindowsHookEx())를 이용
- 이벤트(키보드 입력) 발생 시 OS와 어플리케이션이 주고받는 함수인 SetWindowsHookEx()를 이용하는 경우도 있음




5. Remote Dll Injection



1) AdjustTokenPrivilege() -> Target Process의 메모리를 할당하고 데이터를 쓰기 위해 SeDebugPrivilege 권한 활성화
2) Process walking (타겟 프로세스를 찾는 과정)
3) OpenProcess() -> Target Process의 핸들 획득
4) VirtualAllocEx() -> Target Process의 가상 주소 공간에 새로운 메모리 영역 할당
5) WriteProcessMemory() -> Target Process의 새롭게 생성된 가상 주소 공간에 로딩할 DLL 파일의 경로 기록
6) CreateRemoteThread() -> Target Process에 쓰레드 생성 쓰레드가 실행할 코드의 주소는 LoadLibrary()의 주소, LoadLibrary()에 전달할 파라미터는 VirtualAllocEx()로 할당한 주소값으로 설정

(LoadLibrary 주소는 GetModuleHandle의 인자로 "Kernel32.dll"를 주어 핸들을 구하고 GetProcAddress의 인자로 "LoadLibrary"를 줘서 주소를 구할 수 있다.

hMod = GetModuleHandle("kernel32.dll");
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryA"); 


Remote Dll Injection은 VAD 영역을 조사한다고 해서 탐지할 수 없다. 정상적으로 LoadLibrary() API를 이용하기 때문에 정상적으로 파일이 매핑되어 있어서 VAD 영역에서 탐지해낼 수 없다.




6. Reflective DLL Injection



- Remote DLL Injection이 로드할 dll 파일 이름을 기재하고 LoadLibrary()을 호출하여 이루어지는 데 반하여
- Reflective Dll Injection은 WriteProcessMemory()을 이용하여 DLL 파일 자체를 주입함

- VAD 영역에서 프로텍트 속성이 READEXECUTE 권한이 있고 매핑된 파일이 없는 경우 인젝션(Remote Code 인젝션, Process Hollowing, Reflective DLL 인젝션)을 의심해야함





7. References


1. LoadLibrary() 주소 구하는 방법 - http://reversecore.com/40

2. GetModuleHandle과 LoadLibrary - http://egloos.zum.com/itbaby/v/4659384




'Reversing > Theory' 카테고리의 다른 글

Windows XP Folders and Locations & Windows 7 and Vista  (0) 2019.01.06
Process Hollowing  (0) 2019.01.06
About Rich Header  (0) 2019.01.06
프로세스 핸들과 PID의 차이  (0) 2019.01.06
CreateFile의 CreateFileW CreateFileA 차이  (0) 2019.01.06

+ Recent posts