本「
IT談話館」一般公開記事は、10年以上の実務経験を持つ上級Windowsエンジニアを想定しています。
本館は、Windowsカーネル深層を解析し、クラッシュ原因をはじめとするシステム内の「異様な動き」を検出・分析する
超高度な技術と実績を保有しています。
Windows 10 Device Driver、PEフォーマット、リンカー
本「IT談話館」の「一般公開記事」は、「Active Memory Dump とカーネルメモリダンプ」の解析結果を基に起草されています。「本館」主筆の「豊田孝」はDKOM(Direct Kernel Object Manipulation)ベースの解析手法の第一人者であり、Windowsカーネル空間の解析分野では世界の先頭を走っています。
現在、セキュリティー問題を無視することはできません。Microsoft社側の負担だけではなく、同社製品の利用者側の負担も増しています。困ったことではありますが、当面避けられません。セキュリティーの視点から「Windows10ソフトウェアセンサー」を見た場合、本「IT談話館」の確認範囲では、「カーネル層保護ロジック」に加え、次のような保護メカニズム階層が考案・実装されています。下記リンクはすべて本館記事を指しています。
- Silo/Server Silo
- Job
- Session
- Protected Process
- Mandatory Integrity Control(MIC)
- Windows API(+CPU)
- CPU
本稿では、Windows 10環境で採取されたActive Memory Dumpを本「IT談話館」の独自解析コードで解析し、Device DriverとPEフォーマットの関係を解析します。なお、Active Memory DumpやDLLの解析技術に興味をお持ちの方は、本館の「Windows 10 Active Memory DumpとDLL解析」が参考になるかもしれません。
この調査には次のような機能を実装した本館独自の解析コードを使用します。
- Verifierの有効無効の確認
- Windowsバージョンの確認
- PEフォーマット情報の読み取り
- リンカーメジャー番号の表示
- リンカーマイナー番号の表示
- デバイスドライバーのBaseAddrの表示
- デバイスドライバーのフルパス名の表示
- リンカーメジャー/マイナー番号の比較機能
使用する独自解析コードはWindows XP/7/8/10それぞれの環境で採取されたカーネルメモリダンプやWindows 10 Active Memory Dumpに適応できますが、本稿では、Windows 10のActive Memory Dumpの解析例を紹介します。なお、解析コードの開発知識の習得には、「時間と予算の投資」が必要です。
Started..
Windows 10 Kernel Version 15063 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 15063.0.amd64fre.rs2_release.170317-1834
Machine Name:
Kernel base = 0xfffff803`52406000 PsLoadedModuleList = 0xfffff803`527525a0
Debug session time: Tue Jun 27 15:39:26.892 2017 (UTC + 9:00)
System Uptime: 12 days 7:17:40.907
Windows Version->15063 Verifier NOT Enabled!
000 BaseAddr->0xFFFFF80352406000 Linker(14.10) Name->\SystemRoot\system32\ntoskrnl.exe
001 BaseAddr->0xFFFFF80352C8F000 Linker(14.10) Name->\SystemRoot\system32\hal.dll
002 BaseAddr->0xFFFFF80352E00000 Linker(14.10) Name->\SystemRoot\system32\kdcom.dll
[---]
056 BaseAddr->0xFFFFF8021A2D0000 Linker(14.10) Name->\SystemRoot\System32\drivers\volsnap.sys
057 BaseAddr->0xFFFFF8021A340000 Linker(11. 0) Name->\SystemRoot\System32\drivers\TVALZ.SYS
058 BaseAddr->0xFFFFF8021A350000 Linker(11. 0) Name->\SystemRoot\System32\drivers\Thpevm.SYS
059 BaseAddr->0xFFFFF8021A360000 Linker(12. 0) Name->\SystemRoot\SysmonDrv.sys
060 BaseAddr->0xFFFFF8021A380000 Linker(14.10) Name->\SystemRoot\System32\drivers\rdyboost.sys
[---]
173 BaseAddr->0xFFFFF8021D7C0000 Linker(12.10) Name->\??\C:\ProgramData\Microsoft\Windows Defender\Definition Updates\{587AAA34-0E53-4168-90A2-2877AC5A371E}\MpKsl4c4608d0.sys
174 BaseAddr->0xFFFFF8021D7E0000 Linker(14.10) Name->\SystemRoot\System32\Drivers\dump_diskdump.sys
175 BaseAddr->0xFFFFF8021D820000 Linker(14.10) Name->\SystemRoot\System32\Drivers\dump_storahci.sys
176 BaseAddr->0xFFFFF8021D870000 Linker(14.10) Name->\SystemRoot\System32\Drivers\dump_dumpfve.sys
177 BaseAddr->0xFFFFF8021D890000 Linker(12. 0) Name->\??\C:\WINDOWS\system32\drivers\myfault.sys
Ended..
この出力結果にはデバイスドライバー情報とリンカーバージョンなどが含まれ、次のような事実を読み取ることができます。
- Windows環境はビルド「15063」であり、Creatorバージョンである
- Verifierは有効とされていない
- 電源投入以後のOS環境の構築の流れを示している
- 様々なリンカーバージョンが使われている
- Russinovichさん作成のSysmonがインストールされている
- Defenderはデバイスドライバー「MpKsl4c4608d0.sys」をインストールしている
- 解析中のActive Memory Dumpは「myfault.sys」により採取されている
デバイスドライバーは担当するデバイスをWindowsカーネル空間の一員として組み入れ、空間を拡張する重要な役割を担います。役割の中に悪意を含めた場合、ユーザー空間からの検出が難しく、長期潜伏型のマルウェアとして組み入れることも可能になります。最悪の場合、Windowsシステム呼び出しを巧みにフックし、自分の存在を隠ぺいする凶悪なルートキットとして活動させることさえ可能です。ここでは、Defenderがインストールする「MpKsl4c4608d0.sys」の存在が気になったとします。まずは、PE仕様を基に、次のような情報を収集してみます。
Directory Info BaseAddr->0xfffff8021d7c0000
00 VA->0x000000 Size->0x00000
01 VA->0x00a834 Size->0x00028
02 VA->0x00c000 Size->0x00390
03 VA->0x007000 Size->0x00390
04 VA->0x007200 Size->0x03d80
05 VA->0x00d000 Size->0x00028
06 VA->0x0052c0 Size->0x0001c
07 VA->0x000000 Size->0x00000
08 VA->0x000000 Size->0x00000
09 VA->0x000000 Size->0x00000
10 VA->0x005500 Size->0x00094
11 VA->0x000000 Size->0x00000
12 VA->0x005008 Size->0x002b0
13 VA->0x000000 Size->0x00000
14 VA->0x000000 Size->0x00000
15 VA->0x000000 Size->0x00000
Section Info
01 VA->0x0000000000001000 Size->0x00002200 Name->.text
02 VA->0x0000000000004000 Size->0x00000200 Name->awesome
03 VA->0x0000000000005000 Size->0x00000c00 Name->.rdata
04 VA->0x0000000000006000 Size->0x00000400 Name->.data
05 VA->0x0000000000007000 Size->0x00000400 Name->.pdata
06 VA->0x0000000000008000 Size->0x00001c00 Name->PAGE
07 VA->0x000000000000a000 Size->0x00001400 Name->INIT
08 VA->0x000000000000c000 Size->0x00000400 Name->.rsrc
09 VA->0x000000000000d000 Size->0x00000200 Name->.reloc
PEフォーマットファイルのの歴史は古く(「本館主筆豊田孝の訳書」参照)、インターネット上にはすでに多数のツールが公開されていますから、本稿ではPE仕様の詳細には触れず、デバイスドライバーとPEフォーマット情報の間にある関係だけを取り上げます。
デバイスドライバーは、上記情報のいずれかを基に、オブジェクトとしてカーネルメモリ空間に展開されるはずですから、デバイスドライバーのメモリ内オブジェクト情報を取得してみます。
ntdll!_DRIVER_OBJECT
+0x000 Type : 0n4
+0x002 Size : 0n336
+0x008 DeviceObject : 0xffffdb8b`6d1f8e40 _DEVICE_OBJECT
+0x010 Flags : 0x12
+0x018 DriverStart : 0xfffff802`1d7c0000 Void
+0x020 DriverSize : 0xe000
+0x028 DriverSection : 0xffffdb8b`67c4e010 Void
+0x030 DriverExtension : 0xffffdb8b`67a8edd0 _DRIVER_EXTENSION
+0x038 DriverName : _UNICODE_STRING "\Driver\MpKsl4c4608d0"
+0x048 HardwareDatabase : 0xfffff803`52bafdb8 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
+0x050 FastIoDispatch : (null)
+0x058 DriverInit : 0xfffff802`1d7ca708 long +0
+0x060 DriverStartIo : (null)
+0x068 DriverUnload : 0xfffff802`1d7c1280 void +0
+0x070 MajorFunction : [28] 0xfffff802`1d7c14f0 long +0
このオブジェクト情報の「DriverStart」フィールドには、上のPE情報の「BaseAddr」が設定されています。この値は、WinDbgの「!dh」コマンドのパラメータとして渡すことにより、PEフォーマット情報を表示させることができます。さらには、「DriverInit」フィールドには「INIT」のアドレス値が、そして、「DriverUnload」フィールドと「MajorFunction」フィールドには「.text」の内部コードがそれぞれ設定されています。
ffffdb8b`67a8ecf0 fffff802`1d7c14f0 MpKsl4c4608d0+0x14f0
ffffdb8b`67a8ecf8 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed00 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed08 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed10 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed18 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed20 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed28 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed30 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed38 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed40 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed48 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed50 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed58 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed60 fffff802`1d7c1660 MpKsl4c4608d0+0x1660
ffffdb8b`67a8ed68 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed70 fffff802`1d7c1630 MpKsl4c4608d0+0x1630
ffffdb8b`67a8ed78 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed80 fffff802`1d7c14f0 MpKsl4c4608d0+0x14f0
ffffdb8b`67a8ed88 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed90 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8ed98 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8eda0 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8eda8 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8edb0 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8edb8 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8edc0 fffff802`1d7c1600 MpKsl4c4608d0+0x1600
ffffdb8b`67a8edc8 fffff803`5250d9a0 nt!IopInvalidDeviceRequest
本稿では触れませんが、「DriverSection」値はキャストすることにより、PEフォーマットファイル情報のメモリロード時の情報を解析することが可能となります。