本「
IT談話館」一般公開記事は、10年以上の実務経験を持つ上級Windowsエンジニアを想定しています。
本館は、Windowsカーネル深層を解析し、クラッシュ原因をはじめとするシステム内の「異様な動き」を検出・分析する
超高度な技術と実績を保有しています。
Windows XP/7/8/10 Device Driver、Verifier、リンカー
本「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
本稿では、カーネルメモリダンプを本「IT談話館」の独自解析コードで解析し、Device Driver開発時に使用されたリンカーバージョンを調査します。なお、DLLのリンカーバージョンに興味をお持ちの方は、本館の「Windows 10 Active Memory DumpとDLL解析」が参考になるかもしれません。
この調査には次のような機能を実装した本館独自の解析コードを使用します。
- Verifierの有効無効の確認
- Windowsバージョンの確認
- PEフォーマット情報の読み取り
- リンカーメジャー番号の表示
- リンカーマイナー番号の表示
- デバイスドライバーのDllBaseの表示
- デバイスドライバーのフルパス名の表示
- リンカーメジャー/マイナー番号の比較機能
本稿で使用する独自解析コードはWindows XP/7/8/10それぞれの環境で採取されたカーネルメモリダンプに適応できますが、ここでは、Windows 8.1のカーネルメモリダンプの解析結果を紹介します。なお、解析コードの開発知識の習得には、「時間と予算の投資」が必要です。
解析コードが返してくれる情報を活用すれば、次のようなメリットがあります。
- Microsoft社純正デバイスドライバー更新の様子が分かる
- Microsoft社純正デバイスドライバーとサードパーティ製デバイスドライバーを区別できる
- 搭載されている周辺機器の種類とバージョンが分かる
- インストールしているAV製品の種類とバージョンが分かる
- Windows更新の様子が分かる
デバイスドライバー開発時のリンカーバージョンが極端に古い場合には、定期的に開発元サイトを訪問し、問題が発生する前に(公開されていれば)最新バージョンにアップデートすることが常套手段です。
次の情報は、本「IT談話館」の独自解析コードをWindows 8.1環境で採取されたカーネルメモリダンプに適応・取得しています。
Started..
Windows 8.1 Kernel Version 9600 MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 9600.17328.amd64fre.winblue_r3.140827-1500
Machine Name:
Kernel base = 0xfffff802`50871000 PsLoadedModuleList = 0xfffff802`50b47370
Debug session time: Fri Nov 7 14:50:46.222 2014 (UTC + 9:00)
System Uptime: 0 days 21:21:18.953
Windows Version->9600 Verifier Enabled!
072 DllBase->0xFFFFF8009F59B000 Linker(73.152) Name->\SystemRoot\system32\drivers\nsiproxy.sys
081 DllBase->0xFFFFF8009F8CD000 Linker(12. 0) Name->\SystemRoot\system32\DRIVERS\nvlddmkm.sys
085 DllBase->0xFFFFF8009F887000 Linker(12. 0) Name->\SystemRoot\system32\DRIVERS\TeeDriverx64.sys
090 DllBase->0xFFFFF800A070F000 Linker( 9. 0) Name->\SystemRoot\system32\drivers\nvvad64v.sys
097 DllBase->0xFFFFF800A07E0000 Linker( 9. 0) Name->\SystemRoot\System32\drivers\ScpVBus.sys
101 DllBase->0xFFFFF800A05C2000 Linker(12. 0) Name->\SystemRoot\system32\drivers\nvhda64v.sys
103 DllBase->0xFFFFF800A0A98000 Linker( 8. 0) Name->\SystemRoot\system32\drivers\RTKVHD64.sys
109 DllBase->0xFFFFF800A134B000 Linker( 9. 0) Name->\SystemRoot\system32\drivers\bcbtums.sys
110 DllBase->0xFFFFF800A137F000 Linker( 9. 0) Name->\SystemRoot\system32\DRIVERS\btwampfl.sys
*113 DllBase->0xfffff9600008b000
*113 FullName->\SystemRoot\System32\win32k.sys
118 DllBase->0xFFFFF800A0F88000 Linker( 9. 0) Name->\SystemRoot\system32\drivers\btwavdt.sys
120 DllBase->0xFFFFF800A0A00000 Linker( 9. 0) Name->\SystemRoot\system32\drivers\btwaudio.sys
127 DllBase->0xFFFFF800A0910000 Linker( 9. 0) Name->\SystemRoot\System32\drivers\rzendpt.sys
130 DllBase->0xFFFFF800A093D000 Linker( 9. 0) Name->\SystemRoot\System32\drivers\rzudd.sys
133 DllBase->0xFFFFF800A10AA000 Linker( 9. 0) Name->\SystemRoot\System32\drivers\rzvkeyboard.sys
*136 DllBase->0xfffff9600076b000
*136 FullName->\SystemRoot\System32\TSDDD.dll
*137 DllBase->0xfffff96000b12000
*137 FullName->\SystemRoot\System32\ATMFD.DLL
153 DllBase->0xFFFFF800A1785000 Linker(10. 0) Name->\??\C:\Windows\system32\drivers\rzpmgrk.sys
154 DllBase->0xFFFFF800A178D000 Linker( 8. 0) Name->\SystemRoot\System32\Drivers\secdrv.SYS
*163 DllBase->0xfffff96000888000
*163 FullName->\SystemRoot\System32\cdd.dll
164 DllBase->0xFFFFF800A1C00000 Linker( 9. 0) Name->\??\C:\Windows\system32\EasyAntiCheat.sys
Ended..
ダンプ採取時のWindows 8.1は、リンカーバージョン「11.10」で開発されていましたから、その情報はすでに除外されています。複数の世代のリンカーが使われていますが、ここでは、2点の赤色データから次のような事実を確認することができます。
- Verifierが有効となっている
- リンカーバージョン「73.152」はあり得ない!
- 従って、カーネル空間で深刻な障害が発生している可能性が高い
本稿では詳しい解析工程の説明は割愛しますが、とりあえずは、たとえば、次のようなVerifierのログ内容を表示してみます。
0: kd> !verifier 08 0n10
Displaying most recent 0x000000000000000a entries from the IRQL transition log.
There are up to 0x100 entries in the log.
Thread: ffffe00193ecf880
Old irql: 0000000000000000
New irql: 0000000000000002
Processor: 0000000000000002
Time stamp: 00000000004b13bd
fffff800a1206391 netr28ux+0x150391
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00191e44040
Old irql: 0000000000000000
New irql: 0000000000000002
Processor: 0000000000000003
Time stamp: 00000000004b13bd
fffff8009eb18c20 ndis!ndisMResetMiniportInternal+0xf4
fffff8009eaed1d5 ndis!ndisQueuedCheckForHang+0x2d0e9
fffff802508e05e3 nt!ExpWorkerThread+0x293
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00193ecf880
Old irql: 0000000000000002
New irql: 0000000000000000
Processor: 0000000000000002
Time stamp: 00000000004b13bd
fffff800a1206430 netr28ux+0x150430
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00193ecf880
Old irql: 0000000000000000
New irql: 0000000000000002
Processor: 0000000000000002
Time stamp: 00000000004b13bc
fffff800a1206391 netr28ux+0x150391
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00193ecf880
Old irql: 0000000000000002
New irql: 0000000000000000
Processor: 0000000000000002
Time stamp: 00000000004b13bc
fffff800a1206430 netr28ux+0x150430
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00193ecf880
Old irql: 0000000000000000
New irql: 0000000000000002
Processor: 0000000000000002
Time stamp: 00000000004b13bc
fffff800a1206391 netr28ux+0x150391
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00193ecf880
Old irql: 0000000000000002
New irql: 0000000000000000
Processor: 0000000000000002
Time stamp: 00000000004b13bc
fffff800a1206430 netr28ux+0x150430
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00193ecf880
Old irql: 0000000000000000
New irql: 0000000000000002
Processor: 0000000000000002
Time stamp: 00000000004b13bc
fffff800a1206391 netr28ux+0x150391
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00193ecf880
Old irql: 0000000000000002
New irql: 0000000000000000
Processor: 0000000000000002
Time stamp: 00000000004b13bc
fffff800a1206430 netr28ux+0x150430
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
Thread: ffffe00193ecf880
Old irql: 0000000000000000
New irql: 0000000000000002
Processor: 0000000000000002
Time stamp: 00000000004b13bc
fffff800a1206391 netr28ux+0x150391
fffff800a1205ea7 netr28ux+0x14fea7
fffff8025096fe70 nt!PspSystemThreadStartup+0x58
fffff802509c67c6 nt!KiStartSystemThread+0x16
スレッド「ffffe00193ecf880」は、IRQLの「0」と「2」の間を切り替えながら、同じ処理を繰り返しています。このスレッドの動作は、スレッド「ffffe00191e44040」によって「Hang」状態と判定され、ミニポートのリセットに至っています。この後は、指摘されているこれら2つのスレッドの動作などに注意しながら、「Windowsシステムクラッシュとメモリダンプ」の解析作業を始めることになります。