オンサイトセミナー
豊田孝の「IT談話館」 Windowsメモリダンプ解析を依頼する WinDbgとシステム分析




 本「IT談話館」一般公開記事は、書籍 「インサイド Microsoft Windows」 程度の基礎知識をお持ちの方を想定しています。



Windows 10 Device Driver、PEフォーマット、リンカー


 本「IT談話館」の「一般公開記事」は、「Active Memory Dump とカーネルメモリダンプ」の解析結果を基に起草されています。公開内容はあくまでも本館ビジネスに支障の出ない範囲に制限されていますが、Windowsビジネスを展開する上で必要となる、新規「商材」の発掘や同業他社との「差異」を確保し、人材と予算をはじめとする所有資源を適切に配置・投資する一助にはなるかもしれません。本「IT談話館」主筆の「豊田孝」はDKOM(Direct Kernel Object Manipulation)ベースの解析手法の第一人者であり、Windowsカーネル空間の解析分野では世界の先頭を走っています。

 現在、セキュリティー問題を無視することはできません。Microsoft社側の負担だけではなく、同社製品の利用者側の負担も増しています。困ったことではありますが、当面避けられません。セキュリティーの視点から「Windows10ソフトウェアセンサー」を見た場合、本「IT談話館」の確認範囲では、「カーネル層保護ロジック」に加え、次のような保護メカニズム階層が考案・実装されています。下記リンクはすべて本館記事を指しています。
  1. Silo/Server Silo
  2. Job
  3. Session
  4. Protected Process
  5. Mandatory Integrity Control(MIC)
  6. Windows API(+CPU)
  7. CPU
 本稿では、Windows 10環境で採取されたActive Memory Dumpを本「IT談話館」の独自解析コードで解析し、Device DriverとPEフォーマットの関係を解析します。なお、Active Memory DumpやDLLの解析技術に興味をお持ちの方は、本館の「Windows 10 Active Memory DumpとDLL解析」が参考になるかもしれません。

 この調査には次のような機能を実装した本館独自の解析コードを使用します。  使用する独自解析コードは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カーネル空間の一員として組み入れ、空間を拡張する重要な役割を担います。役割の中に悪意を含めた場合、ユーザー空間からの検出が難しく、長期潜伏型のマルウェアとして組み入れることも可能になります。最悪の場合、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フォーマットファイル情報のメモリロード時の情報を解析することが可能となります。


ビジネスメニュー




 本「IT談話館」一般公開記事は、書籍 「インサイド Microsoft Windows」 程度の基礎知識をお持ちの方々を想定しています。
Windowsメモリダンプ解析技術開発室 ビジネスメニュー

Copyright©豊田孝 2004- 2021
本日は2021-07-24です。