【Volatility3】プールタグスキャンニングについて触れる。

:::note info

卒論でメモリフォレンジックをやるので・・・

:::

## 前提知識
### それぞれのメモリ領域
Windowsカーネルは、ドライバやシステムコンポーネントが必要とするメモリを動的に確保・解放するためにメモリプールと呼ばれる領域を使用する。（要はヒープ領域のこと、カーネルやドライバがメモリを操作しているってだけ。）

・**非ページプール（Non-paged Pool）**：物理メモリ上に常に存在し、ページアウトされないメモリ領域。高いIRQLで動作するコードからでもアクセスできる必要がある。

https://ja.wikipedia.org/wiki/IRQL_(Windows)

・**ページプール（Paged Pool）**：必要に応じてディスク上のページファイルに書き出される（ページアウトされる）可能性のあるメモリ領域。



### プールタグ（Pool Tag）
ドライバやカーネルコンポーネントがメモリプールからメモリを確保する際に、`ExAllocatePoolWithTag`のようなAPIを使用する。これがまさしく「プールタグ」である。

プールタグは、通常人間が読める`ASCII文字列`で、デバッグやメモリリークの追跡を容易にするために利用される。例えば、プロセスオブジェクト（`_EPROCESS`は`Proc`）というタグで、ファイルオブジェクト（`_FILE_OBJECT`）は`File`というタグで確保される。

確保されたメモリブロックの先頭には、`_POOL_HEADER`という管理構造体が付加される。プールタグはこの`_POOL_HEADER`内に格納されている。

### プールタグヘッダ内の構造
```

typedef struct _POOL_HEADER {
    union {
        ULONG Ulong1;
        struct {
            ULONG PreviousSize : 9;   // 前チャンクのサイズを 16バイト単位で表現
            ULONG PoolIndex    : 7;   // 使用中の PoolDescriptor のインデックス
            ULONG BlockSize    : 9;   // このチャンクのサイズを 16バイト単位で表現
            ULONG PoolType     : 7;   // プール種別（Paged, NonPaged, Quota など）＋フラグ
        };
    };
    union {
        ULONG PoolTag;              // 割り当て元を識別する 4文字タグ
        struct {
            WORD AllocatorBackTraceIndex; // デバッグ用：呼び出しトレースインデックス
            WORD PoolTagHash;             // タグのハッシュ値
        };
    };
#ifdef _WIN64
    PVOID ProcessBilled;           // Quota 管理時の課金対象プロセス（_KPROCESS へのポインタ）
#endif
} POOL_HEADER;

```
https://maheshhari.github.io/blog/win7kernelpoolinternals/

https://www.osr.com/nt-insider/2014-issue1/windows-pool-manager/

https://connormcgarr.github.io/swimming-in-the-kernel-pool-part-1

## _POOL_HEADER 各フィールド簡潔まとめ
### PreviousSize（9ビット）

前のチャンクのサイズを16バイト単位で保持する。

チャンク解放時、前後を統合する際に参照される。

### PoolIndex（7ビット）

このチャンクが属するプール管理構造体（PoolDescriptor）のインデックス。

解放時、どのリストに戻すかを判断するために使われる。
### BlockSize（9ビット）

このチャンクの実際のサイズを16バイト単位で保持する。

解放時に適切なリストへ戻す目安になる。

### PoolType（7ビット）

PagedPool, NonPagedPool などプールの種類情報、MustSucceed, CacheAligned, Quota フラグなども含む。

解放や割当時の動作制御に使われる。

### PoolTag（32ビット）

割り当て元を4文字タグ（例："Thre", "ALPC"）で識別する。

デバッグやフォレンジック解析時に役立つ。

### AllocatorBackTraceIndex（16ビット）

割当時のコールスタック情報のインデックス。

デバッグ目的で使用される。

### PoolTagHash（16ビット）

PoolTag のハッシュ値。

タグ衝突チェックや高速検索が目的。

### ProcessBilled（64ビット、x64版のみ）

Quotaフラグが付いた場合に宛先のプロセス（`_KPROCESS ポインタ`）を保持。

Windows 8以降、改ざん防止のため XOR で暗号化されている（`ExpPoolQuotaCookie` 使用）。

:::note info
通常プロセス情報を抽出するには、プロセスに不随する`_EPROCESS`構造体経由になる。しかし、マルウェアによっては、このリンクを断ち切る場合がある。

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/kernel/eprocess

https://www.vergiliusproject.com/kernels/x64/windows-11/21h2/_EPROCESS
:::





## 調べてるうちにわからなかった単語

### windowsハンドル
Windowsのシステムが各ウインドウやファイル、メモリなどのリソースに割り当てる一意の識別子。

### 仮想アドレス
コンピューター内のメモリ領域に対してメモリ装置内での物理的な配置とは独立に割り当てられた所在情報のこと。
OSが各プログラムにメモリ領域を割り当てる際に用いられる。

### レジストリハイブ
Windowsレジストリの特定のキー、サブキー、値のグループを指す。

## UWP(Universal Windows Platform)
Windows用アプリケーションの実行基盤。この基盤上で稼働するアプリケーションをUWPアプリケーションと呼ぶ。
具体例：
・Zoom
・Steam
など

**それを確認するコマンドもある。**
https://news.mynavi.jp/article/win10tips-171/
より
```
Get-AppxPackage | Sort-Object Name | Select Name,InstallLocation
```
大体は「\Program Files\WindowsApps」や「\Windows\SystemApps」の2つに分かれる。

## `svchost.exe`

https://wa3.i-3-i.info/word13244.html

DLL形式のサービスを動かすためにある実行ファイル(プロセス)

## SANのFind Evil-Know Normalポスターとは
SANSというセキュリティの研修を行っている団体が出してる「そもそも正常なプロセスってこういうことだよ」というのをまとめてくれているサイト。

https://www.sans.org/posters/hunt-evil/

## ローダー/ドロッパー（Loader/Dropper）
役割：**侵入役・設置役**
マルウェアの第一段階である。メールの添付ファイルや不正なサイトなどを経由してPCに侵入し、主犯である次のDLLファイルをPC内に作成（ドロップ）したり、インターネットからダウンロード（ロード）したりする。

## Living Off The Land
直訳で自給自足という意味。
初期侵入後にOS初めからインストールされているツールを使って侵入を行うもの。
セキュリティツールなどに引っ掛かりずらい。（正規のプロセスなので・・・）
:::note info
ハードディスクのフォレンジックなど多角的に思考・判断する必要がある。
:::



具体例：
・Windowsの設定変更ツールである`wmic.exe`によるプロセス起動や他端末のリモート操作
・各種ハッシュ計算などで利用する`certutil.exe`でのエンコードとデコード
・通信用ツールの`mshta.exe`を使った簡易的な外部通信
・`rundll32.exe`による悪性dllの実行

## LOLBASプロジェクト（Living Off The Land Binaries,Scripts and Libraries）
前述の自給自足攻撃の手法をまとめたプロジェクトである。

## IOC(Indicators of Compromise)

https://www.nri-secure.co.jp/glossary/ioc
より
>IoC（Indicator of Compromise）とは、「侵害の痕跡」「痕跡情報」「セキュリティ侵害インジケーター」などとも呼ばれ、攻撃発生やどのようなツールが使われたかなどを明らかにする手掛かりとなる情報のことです。

・表層解析レベル

## VPN(Virtual Page Number)
上位ビット部分、どの仮想ページかを示す。

## VPO(Virtual Page Offset)
下位ビット部分、ページ内のオフセット位置を示す。

例：32ビットアドレスで4KBページの場合
→オフセットは12ビット、残り20ビットがVPN(仮想ページ番号)となる。
## PPN(Physical Page Number)
物理メモリ上のフレーム番号

## PTE(Page Table Entry)
VPN→PPNの対応情報とステータス

## カービング（デジタルフォレンジックにおける）
データフォーマットの特徴的なデータ列（ファイルヘッダ等）をキーにしてディスクイメージファイルを検索する手法である。キーが現れたらそこから連続するバイト列をファイルやデータレコードとして保存ｓ







## 参考文献（参照日2025年6月21日）

https://volatility3.readthedocs.io/en/latest/volatility3.plugins.windows.poolscanner.html

https://volatilityfoundation.org/memory-forensics-rd-illustrated-recovering-raw-sockets-on-windows-10/

https://hacktricks.boitatech.com.br/forensics/basic-forensic-methodology/memory-dump-analysis/volatility-examples

メモリフォレンジック入門　著者：むちぽぽ　発行：インプレスネクストパブリッシング