Process Hollowing
1. はじめに
Process Injectionの手法の一つにProcess Hollowingがある.
今回はProcess Hollowingについて調べてみた覚書.
2. 手法
2.1. 検証環境
・Windows 7/10
・Dest(Destination) : インジェクションされるプロセス
・Src(Source): インジェクションするPEファイル
以下それぞれのプロセスに対する操作をDest, Srcで示す.
2.2. インジェクションフロー概要
1) Destのプロセスを待機状態(CREATE_SUSPENDED)で作成する(via CreateProcess)
2) DestのPEBを得る(via ntdll!NtQueryInformationProcess)
ここでImageBaseを得る
3) SrcのPEヘッダーをparse
ここでNumberOfSections, Section headerを得る
4) DestをImageBaseを基準としてUnmap(空洞化)する(via ntdll!NtUnmapViewOfSection)
5) DestをImageBaseからOptionalHeader.SizeOfImageだけメモリを確保(via VirtualAllocEx)
6) DestにSrcのヘッダーをOptionalHeader.SizeOfHeadersだけ書き込む(via WriteProcessMemory)
7) DestにSrcのSectionの数(NumberOfSections)だけセクションを書き込む(via WriteProcessMemory)
8) DestとSrcのImageBaseのアドレスが異なる場合, Srcの".reloc"セクションの情報をもとにベースの再配置を行う.
9) (Dest)PEBのImageBaseAddress + SrcのAddressOfEntryPointをEAXに設定->プロセスを再開する(via GetThreadContext -> SetThreadContext -> ResumeThread)
2.3. 補足
2.3.1 PEB(Process Environment Block)について
PEBは以下の構造体で定義される(winternl.h).
typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Reserved3[2];
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
PVOID Reserved4[3];
PVOID AtlThunkSListPtr;
PVOID Reserved5;
ULONG Reserved6;
PVOID Reserved7;
ULONG Reserved8;
ULONG AtlThunkSListPtr32;
PVOID Reserved9[45];
BYTE Reserved10[96];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved11[128];
PVOID Reserved12[1];
ULONG SessionId;
} PEB, *PPEB;
ここでReserved3[1]はImageBaseAddressに対応する.
2.3.2 ベースの再配置について
relocation tableには以下の2つの構造体から定義される(winnt.h).
※TYPE_OFFSETは筆者が作成した構造体.
typedef struct _IMAGE_BASE_RELOCATION {
DWORD VirtualAddress;
DWORD SizeOfBlock;
// WORD TypeOffset[1];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
typedef struct _TYPE_OFFSET {
WORD offset : 12;
WORD Type : 4;
}TYPE_OFFSET, *PTYPE_OFFSET;
上記の構造体は以下の図のように配置されている.
TYPE_OFFSETの数は
(IMAGE_BASE_RELOCATION.SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(TYPE_OFFSET)
で求められる.
2.4. 実行結果
恒例の電卓(calc.exe)に対してProcess Hollowingを用いて, プロセスインジェクションした結果.
3. 所感
Process Hollowing : プロセスの空洞化(そのまま)