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;

 

上記の構造体は以下の図のように配置されている.

f:id:kmdnet:20190528210522p:plain

TYPE_OFFSETの数は

(IMAGE_BASE_RELOCATION.SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(TYPE_OFFSET)

で求められる.

2.4. 実行結果

恒例の電卓(calc.exe)に対してProcess Hollowingを用いて, プロセスインジェクションした結果.

f:id:kmdnet:20190523220741p:plain

3. 所感

Process Hollowing : プロセスの空洞化(そのまま)

4. 参考文献

https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process

https://github.com/m0n0ph1/Process-Hollowing