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




メモリ解析サービス



WinDbgとWindows XP/7/8/10割り込みテーブル(IDT)の内部解析


 本稿では、Windows 10環境で採取されたカーネルメモリダンプを本「IT談話館」の独自解析コードで解析し、通常、IDTと略称されている「割り込みテーブル」を解析してまいります。IDTは割り込み記述テーブルや割り込みディスパッチテーブルなどと呼ばれることもありますが、本稿では、「割り込みテーブル」と総称しています。

 本「IT談話館」は「割り込みテーブル」解析技術を「オンサイトセミナー教材」内で詳しく解説しています。その解析技術の適応範囲はWindows XPからWindows 8.1までであり、Windows 8.1からWindows 10へのバージョンアップ過程におけるカーネル内部仕様の変更の影響を受け、Windows 10の「割り込みテーブル」の解析に適応できません。そこで、本館は次のような視点からバージョンアップ後のカーネル仕様を解析し、Windows 10の「割り込みテーブル」の解析に適応できる独自解析コードを開発することにしました。   「割り込みテーブル」を解析する場合、多くの方はWinDbgに内蔵されている「!idt」拡張コマンドを次のように実行されていると思います。
1: kd> vertarget
Windows 10 Kernel Version 10240 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 10240.16393.amd64fre.th1_st1.150717-1719
Machine Name:
Kernel base = 0xfffff802`2941a000 PsLoadedModuleList = 0xfffff802`2973f030
Debug session time: Mon Aug  3 17:16:15.086 2015 (UTC + 9:00)
System Uptime: 0 days 1:19:12.780


1: kd> !idt 35

Dumping IDT: ffffd0015cc628b0

35:	fffff80229569178 hal!HalpInterruptCmciService (KINTERRUPT fffff80229cb84e0)
 この実行結果は次のようなことを示しています。  割り込みオブジェクトがメモリ「fffff80229cb84e0」に実際に置かれているのかどうかを確認してみます。
1: kd> dt nt!_kinterrupt fffff80229cb84e0
   +0x000 Type             : 0n22
   +0x002 Size             : 0n256
   +0x008 InterruptListEntry : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]
   +0x018 ServiceRoutine   : 0xfffff802`29c953b0     unsigned char  hal!HalpInterruptCmciService+0
   +0x020 MessageServiceRoutine : (null) 
   +0x028 MessageIndex     : 0
   +0x030 ServiceContext   : (null) 
   +0x038 SpinLock         : 0
   +0x040 TickCount        : 0
   +0x048 ActualLock       : 0xffffffff`ffffffff  -> ??
   +0x050 DispatchAddress  : 0xfffff802`295687f0     void  nt!KiInterruptDispatchNoLock+0
   +0x058 Vector           : 0x35
   +0x05c Irql             : 0x5 ''
   +0x05d SynchronizeIrql  : 0x5 ''
   +0x05e FloatingSave     : 0 ''
   +0x05f Connected        : 0x1 ''
   +0x060 Number           : 1
   +0x064 ShareVector      : 0 ''
   +0x065 EmulateActiveBoth : 0 ''
   +0x066 ActiveCount      : 0
   +0x068 InternalState    : 0n0
   +0x06c Mode             : 1 ( Latched )
   +0x070 Polarity         : 0 ( InterruptPolarityUnknown )
   +0x074 ServiceCount     : 0
   +0x078 DispatchCount    : 0
   +0x080 PassiveEvent     : (null) 
   +0x088 TrapFrame        : (null) 
   +0x090 DisconnectData   : (null) 
   +0x098 ServiceThread    : (null) 
   +0x0a0 ConnectionData   : (null) 
   +0x0a8 IntTrackEntry    : (null) 
   +0x0b0 IsrDpcStats      : _ISRDPCSTATS
   +0x0f0 RedirectObject   : (null) 
   +0x0f8 Padding          : [8]  ""
 ご覧のように、このオブジェクト内には割り込みサービスルーチン名などが記録されています。Microsoft社の担当エンジニアーは、このような割り込みオブジェクトを設計し、割り込みテーブル経由で、割り込みベクターと割り込みオブジェクトをマッピングすることになります。Windows 8.1からWindows 10への遷移過程では、セキュリティーを強化し、かつ、パフォーマンスを改善する観点から、割り込みベクターと割り込みオブジェクトをマッピングするための専用の内部関数が追加実装されています。本「IT談話館」は追加実装背景を解析し、マッピングメカニズムの解明に成功しています。

 割り込みテーブルから割り込みオブジェクトにアクセスする経路が分かれば、残っているのは割り込みオブジェクト内容そのものの解析作業です。この解析作業は、いろいろな意味で、カーネル空間解析者の最も重要な作業となります。上の割り込みオブジェクト情報には、たとえば、「Irql」フィールドがありますから、すべての割り込みオブジェクトの「Irql」フィールド値を取得してみます。
-No.00	Idt->0xFFFFF8022956EE00	nt!KiDivideErrorFault (fffff802`2956ee00)
-No.01	Idt->0xFFFFF8022956EF00	nt!KiDebugTrapOrFault (fffff802`2956ef00)
-No.02	Idt->0xFFFFF8022956F0C0	nt!KiNmiInterrupt (fffff802`2956f0c0)
-No.03	Idt->0xFFFFF8022956F440	nt!KiBreakpointTrap (fffff802`2956f440)
-No.04	Idt->0xFFFFF8022956F540	nt!KiOverflowTrap (fffff802`2956f540)
-No.05	Idt->0xFFFFF8022956F640	nt!KiBoundFault (fffff802`2956f640)
-No.06	Idt->0xFFFFF8022956F8C0	nt!KiInvalidOpcodeFault (fffff802`2956f8c0)
-No.07	Idt->0xFFFFF8022956FB00	nt!KiNpxNotAvailableFault (fffff802`2956fb00)
-No.08	Idt->0xFFFFF8022956FBC0	nt!KiDoubleFaultAbort (fffff802`2956fbc0)
-No.09	Idt->0xFFFFF8022956FC80	nt!KiNpxSegmentOverrunAbort (fffff802`2956fc80)
-No.0A	Idt->0xFFFFF8022956FD40	nt!KiInvalidTssFault (fffff802`2956fd40)
-No.0B	Idt->0xFFFFF8022956FE00	nt!KiSegmentNotPresentFault (fffff802`2956fe00)
-No.0C	Idt->0xFFFFF8022956FF40	nt!KiStackFault (fffff802`2956ff40)
-No.0D	Idt->0xFFFFF80229570080	nt!KiGeneralProtectionFault (fffff802`29570080)
-No.0E	Idt->0xFFFFF80229570180	nt!KiPageFault (fffff802`29570180)
-No.10	Idt->0xFFFFF80229570540	nt!KiFloatingErrorFault (fffff802`29570540)
-No.11	Idt->0xFFFFF802295706C0	nt!KiAlignmentFault (fffff802`295706c0)
-No.12	Idt->0xFFFFF802295707C0	nt!KiMcheckAbort (fffff802`295707c0)
-No.13	Idt->0xFFFFF80229570E40	nt!KiXmmException (fffff802`29570e40)
-No.1F	Idt->0xFFFFF8022956A2F0	nt!KiApcInterrupt (fffff802`2956a2f0)
-No.20	Idt->0xFFFFF8022956E4D0	nt!KiSwInterrupt (fffff802`2956e4d0)
-No.29	Idt->0xFFFFF80229571000	nt!KiRaiseSecurityCheckFailure (fffff802`29571000)
-No.2C	Idt->0xFFFFF80229571100	nt!KiRaiseAssertion (fffff802`29571100)
-No.2D	Idt->0xFFFFF80229571200	nt!KiDebugServiceTrap (fffff802`29571200)
-No.2F	Idt->0xFFFFF8022956A5C0	nt!KiDpcInterrupt (fffff802`2956a5c0)
-No.30	Idt->0xFFFFF8022956A7F0	nt!KiHvInterrupt (fffff802`2956a7f0)
-No.31	Idt->0xFFFFF8022956AB50	nt!KiVmbusInterrupt0 (fffff802`2956ab50)
-No.32	Idt->0xFFFFF8022956AEA0	nt!KiVmbusInterrupt1 (fffff802`2956aea0)
-No.33	Idt->0xFFFFF8022956B1F0	nt!KiVmbusInterrupt2 (fffff802`2956b1f0)
-No.34	Idt->0xFFFFF8022956B540	nt!KiVmbusInterrupt3 (fffff802`2956b540)
+No.35	Idt->0xFFFFF80229569178	Vector->35	KInterrupt->0xFFFFF80229CB84E0	Irql->05
+No.50	Idt->0xFFFFF80229569250	Vector->50	KInterrupt->0xFFFFD00158544C80	Irql->05
+No.61	Idt->0xFFFFF802295692D8	Vector->61	KInterrupt->0xFFFFD00158A893C0	Irql->06
+No.70	Idt->0xFFFFF80229569350	Vector->70	KInterrupt->0xFFFFD00158A89C80	Irql->07
+No.71	Idt->0xFFFFF80229569358	Vector->71	KInterrupt->0xFFFFD00158A89A00	Irql->07
+No.80	Idt->0xFFFFF802295693D0	Vector->80	KInterrupt->0xFFFFD00158A89DC0	Irql->08
+No.81	Idt->0xFFFFF802295693D8	Vector->81	KInterrupt->0xFFFFD00158A89B40	Irql->08
+No.91	Idt->0xFFFFF80229569458	Vector->91	KInterrupt->0xFFFFD00158544140	Irql->09
+No.A1	Idt->0xFFFFF802295694D8	Vector->A1	KInterrupt->0xFFFFD0015B218A00	Irql->0A
+No.B0	Idt->0xFFFFF80229569550	Vector->B0	KInterrupt->0xFFFFD00158544DC0	Irql->0B
+No.B1	Idt->0xFFFFF80229569558	Vector->B1	KInterrupt->0xFFFFD00158544000	Irql->0B
+No.B8	Idt->0xFFFFF80229569590	Vector->B8	KInterrupt->0xFFFFD00158544B40	Irql->0B
+No.B9	Idt->0xFFFFF80229569598	Vector->B9	KInterrupt->0xFFFFD00158544A00	Irql->0B
+No.BA	Idt->0xFFFFF802295695A0	Vector->BA	KInterrupt->0xFFFFD001585448C0	Irql->0B
+No.BB	Idt->0xFFFFF802295695A8	Vector->BB	KInterrupt->0xFFFFD00158544780	Irql->0B
+No.BC	Idt->0xFFFFF802295695B0	Vector->BC	KInterrupt->0xFFFFD00158544640	Irql->0B
+No.BD	Idt->0xFFFFF802295695B8	Vector->BD	KInterrupt->0xFFFFD00158544500	Irql->0B
+No.BE	Idt->0xFFFFF802295695C0	Vector->BE	KInterrupt->0xFFFFD001585443C0	Irql->0B
+No.BF	Idt->0xFFFFF802295695C8	Vector->BF	KInterrupt->0xFFFFD00158544280	Irql->0B
+No.CE	Idt->0xFFFFF80229569640	Vector->CE	KInterrupt->0xFFFFE00150290100	Irql->0C
+No.D2	Idt->0xFFFFF80229569660	Vector->D2	KInterrupt->0xFFFFE00150290200	Irql->0D
+No.D7	Idt->0xFFFFF80229569688	Vector->D7	KInterrupt->0xFFFFF80229CB87E0	Irql->0F
+No.D8	Idt->0xFFFFF80229569690	Vector->D8	KInterrupt->0xFFFFF80229CB86E0	Irql->0F
+No.DF	Idt->0xFFFFF802295696C8	Vector->DF	KInterrupt->0xFFFFF80229CB85E0	Irql->0F
-No.E1	Idt->0xFFFFF8022956B890	nt!KiIpiInterrupt (fffff802`2956b890)
+No.E2	Idt->0xFFFFF802295696E0	Vector->E2	KInterrupt->0xFFFFF80229CB88E0	Irql->0F
+No.E3	Idt->0xFFFFF802295696E8	Vector->E3	KInterrupt->0xFFFFE00150290000	Irql->0E
+No.FE	Idt->0xFFFFF802295697C0	Vector->FE	KInterrupt->0xFFFFF80229CB89E0	Irql->0F
 この実行結果からは、次のようなことを知ることができます。  このような基本解析作業の終了後は、独自解析コード内に割り込みオブジェクトの詳細解析ルーチンを次々に追加し、割り込みに起因する問題を解決するための本格的な準備作業に入ります。「Irql」フィールド値はWindowsシステムの健康度を診断する上では極めて重要な情報です。むしろ、このフィールドの意味と活用手段を持たない場合、まっとうな解析作業はできない!、と申し上げる必要があると思います。

 本「IT談話館」は64ビットWindows 10用の解析コードを解析後、そのコードを32/64ビットのWindows 8.1、7、XPなどの解析作業用に移植することが多々ございます。同一のロジックを持つそれらの独自解析コードの実行結果はダンプファイルの採取環境と採取時期毎に異なります。割り込みをはじめとする重要内部技術に関する信頼できる情報はほとんど見当たりません(参照)。技術情報の賞味期限が極めて短くなっているのが現状です。2018年1月3日には、「Meltdown and Spectre」問題が発生し、対応策がとられた結果、上記の出力情報は次のように変化します。
-No.00	Trap->0xFFFFF8005B6A1100	nt!KiDivideErrorFaultShadow (fffff800`5b6a1100)
-No.01	Trap->0xFFFFF8005B6A1180	nt!KiDebugTrapOrFaultShadow (fffff800`5b6a1180)
-No.02	Trap->0xFFFFF8005B6A1200	nt!KiNmiInterruptShadow (fffff800`5b6a1200)
-No.03	Trap->0xFFFFF8005B6A1280	nt!KiBreakpointTrapShadow (fffff800`5b6a1280)
-No.04	Trap->0xFFFFF8005B6A1300	nt!KiOverflowTrapShadow (fffff800`5b6a1300)
-No.05	Trap->0xFFFFF8005B6A1380	nt!KiBoundFaultShadow (fffff800`5b6a1380)
-No.06	Trap->0xFFFFF8005B6A1400	nt!KiInvalidOpcodeFaultShadow (fffff800`5b6a1400)
-No.07	Trap->0xFFFFF8005B6A1480	nt!KiNpxNotAvailableFaultShadow (fffff800`5b6a1480)
-No.08	Trap->0xFFFFF8005B6A1500	nt!KiDoubleFaultAbortShadow (fffff800`5b6a1500)
-No.09	Trap->0xFFFFF8005B6A1580	nt!KiNpxSegmentOverrunAbortShadow (fffff800`5b6a1580)
-No.0A	Trap->0xFFFFF8005B6A1600	nt!KiInvalidTssFaultShadow (fffff800`5b6a1600)
-No.0B	Trap->0xFFFFF8005B6A1680	nt!KiSegmentNotPresentFaultShadow (fffff800`5b6a1680)
-No.0C	Trap->0xFFFFF8005B6A1700	nt!KiStackFaultShadow (fffff800`5b6a1700)
-No.0D	Trap->0xFFFFF8005B6A1780	nt!KiGeneralProtectionFaultShadow (fffff800`5b6a1780)
-No.0E	Trap->0xFFFFF8005B6A1800	nt!KiPageFaultShadow (fffff800`5b6a1800)
-No.10	Trap->0xFFFFF8005B6A1880	nt!KiFloatingErrorFaultShadow (fffff800`5b6a1880)
-No.11	Trap->0xFFFFF8005B6A1900	nt!KiAlignmentFaultShadow (fffff800`5b6a1900)
-No.12	Trap->0xFFFFF8005B6A1980	nt!KiMcheckAbortShadow (fffff800`5b6a1980)
-No.13	Trap->0xFFFFF8005B6A1A80	nt!KiXmmExceptionShadow (fffff800`5b6a1a80)
-No.14	Trap->0xFFFFF8005B6A1B00	nt!KiVirtualizationExceptionShadow (fffff800`5b6a1b00)
-No.1F	Trap->0xFFFFF8005B6A1B80	nt!KiApcInterruptShadow (fffff800`5b6a1b80)
-No.20	Trap->0xFFFFF8005B6A1C00	nt!KiSwInterruptShadow (fffff800`5b6a1c00)
-No.29	Trap->0xFFFFF8005B6A1C80	nt!KiRaiseSecurityCheckFailureShadow (fffff800`5b6a1c80)
-No.2C	Trap->0xFFFFF8005B6A1D00	nt!KiRaiseAssertionShadow (fffff800`5b6a1d00)
-No.2D	Trap->0xFFFFF8005B6A1D80	nt!KiDebugServiceTrapShadow (fffff800`5b6a1d80)
-No.2F	Trap->0xFFFFF8005B6A1E80	nt!KiDpcInterruptShadow (fffff800`5b6a1e80)
-No.30	Trap->0xFFFFF8005B6A1F00	nt!KiHvInterruptShadow (fffff800`5b6a1f00)
-No.31	Trap->0xFFFFF8005B6A1F80	nt!KiVmbusInterrupt0Shadow (fffff800`5b6a1f80)
-No.32	Trap->0xFFFFF8005B6A2000	nt!KiVmbusInterrupt1Shadow (fffff800`5b6a2000)
-No.33	Trap->0xFFFFF8005B6A2080	nt!KiVmbusInterrupt2Shadow (fffff800`5b6a2080)
-No.34	Trap->0xFFFFF8005B6A2100	nt!KiVmbusInterrupt3Shadow (fffff800`5b6a2100)
+No.35	Stub->0xFFFFF8005B6A23A8	Vector->35	KInterrupt->0xFFFFF8005BD38D50	Irql->05
+No.50	Stub->0xFFFFF8005B6A2480	Vector->50	KInterrupt->0xFFFF99816E74DC80	Irql->05
+No.51	Stub->0xFFFFF8005B6A2488	Vector->51	KInterrupt->0xFFFF99816E8F4280	Irql->05
+No.61	Stub->0xFFFFF8005B6A2508	Vector->61	KInterrupt->0xFFFF99816E8F48C0	Irql->06
+No.70	Stub->0xFFFFF8005B6A2580	Vector->70	KInterrupt->0xFFFF99816E8F4B40	Irql->07
+No.71	Stub->0xFFFFF8005B6A2588	Vector->71	KInterrupt->0xFFFF99816E8F4A00	Irql->07
+No.80	Stub->0xFFFFF8005B6A2600	Vector->80	KInterrupt->0xFFFF99816E8F4C80	Irql->08
+No.81	Stub->0xFFFFF8005B6A2608	Vector->81	KInterrupt->0xFFFF99816E74D140	Irql->08
+No.91	Stub->0xFFFFF8005B6A2688	Vector->91	KInterrupt->0xFFFF99816EA258C0	Irql->09
+No.A1	Stub->0xFFFFF8005B6A2708	Vector->A1	KInterrupt->0xFFFF99816E74D000	Irql->0A
+No.B0	Stub->0xFFFFF8005B6A2780	Vector->B0	KInterrupt->0xFFFF99816E74DDC0	Irql->0B
+No.B1	Stub->0xFFFFF8005B6A2788	Vector->B1	KInterrupt->0xFFFF99816E8F4DC0	Irql->0B
+No.B8	Stub->0xFFFFF8005B6A27C0	Vector->B8	KInterrupt->0xFFFF99816E74DB40	Irql->0B
+No.B9	Stub->0xFFFFF8005B6A27C8	Vector->B9	KInterrupt->0xFFFF99816E74DA00	Irql->0B
+No.BA	Stub->0xFFFFF8005B6A27D0	Vector->BA	KInterrupt->0xFFFF99816E74D8C0	Irql->0B
+No.BB	Stub->0xFFFFF8005B6A27D8	Vector->BB	KInterrupt->0xFFFF99816E74D780	Irql->0B
+No.BC	Stub->0xFFFFF8005B6A27E0	Vector->BC	KInterrupt->0xFFFF99816E74D640	Irql->0B
+No.BD	Stub->0xFFFFF8005B6A27E8	Vector->BD	KInterrupt->0xFFFF99816E74D500	Irql->0B
+No.BE	Stub->0xFFFFF8005B6A27F0	Vector->BE	KInterrupt->0xFFFF99816E74D3C0	Irql->0B
+No.BF	Stub->0xFFFFF8005B6A27F8	Vector->BF	KInterrupt->0xFFFF99816E74D280	Irql->0B
+No.CE	Stub->0xFFFFF8005B6A2870	Vector->CE	KInterrupt->0xFFFFF8005BD39650	Irql->0C
+No.D1	Stub->0xFFFFF8005B6A2888	Vector->D1	KInterrupt->0xFFFFF8005BD39550	Irql->0D
+No.D2	Stub->0xFFFFF8005B6A2890	Vector->D2	KInterrupt->0xFFFFF8005BD39450	Irql->0D
+No.D7	Stub->0xFFFFF8005B6A28B8	Vector->D7	KInterrupt->0xFFFFF8005BD39250	Irql->0F
+No.D8	Stub->0xFFFFF8005B6A28C0	Vector->D8	KInterrupt->0xFFFFF8005BD39050	Irql->0F
+No.DF	Stub->0xFFFFF8005B6A28F8	Vector->DF	KInterrupt->0xFFFFF8005BD38F50	Irql->0F
-No.E1	Trap->0xFFFFF8005B6A2180	nt!KiIpiInterruptShadow (fffff800`5b6a2180)
+No.E2	Stub->0xFFFFF8005B6A2910	Vector->E2	KInterrupt->0xFFFFF8005BD39150	Irql->0F
+No.E3	Stub->0xFFFFF8005B6A2918	Vector->E3	KInterrupt->0xFFFFF8005BD38E50	Irql->0E
+No.FE	Stub->0xFFFFF8005B6A29F0	Vector->FE	KInterrupt->0xFFFFF8005BD39350	Irql->0F
 WindowsはSaaSとして提供される時代に入り、その内部は頻繁に更新されています。更新内容の多くは、いろいろな事情から、公にされることはほとんどありません。最新のユーザー空間とカーネル空間に関する信頼できる情報を取得するには、インターネットなどでは語られない高度な内部解析技術が必須とされています。時代が要請する技術の習得には、「時間と予算の投資」が必要です。



メモリ解析サービス



 実務的な解析コードの開発技術の導入をご予定の場合には、所属チーム内でご協議の上、本「IT談話館」の「オンサイトセミナー」の受講をご検討いただけますと幸いでございます。


ビジネスメニュー
Windowsクラッシュダンプ解析サービス 技術資料

Copyright©豊田孝 2004- 2018
本日は2018-10-18です。