Windowsメモリ内部解析サービス
豊田孝の「IT談話館」 Windowsメモリダンプ解析を依頼する WinDbgとシステム分析




 本「IT談話館」一般公開記事は、10年以上の実務経験を持つ上級Windowsエンジニアを想定しています。
 本館は、Windowsカーネル深層を解析し、クラッシュ原因をはじめとするシステム内の「異様な動き」を検出・分析する
超高度な技術と実績を保有しています。



WinDbgとWindowsレジストリ解析(応用)


 本「IT談話館」の「一般公開記事」は、「Active Memory Dump とカーネルメモリダンプ」の解析結果を基に起草されています。「本館」主筆の「豊田孝」は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
 本稿は「WinDbgとWindowsレジストリ解析(基礎)」の続編であり、基礎編と同じように、Windows 10環境で採取した「Active Memory Dump」内に保存されているWindowsレジストリ情報を本「IT談話館」の独自解析コードで解析しています。

 今回解析対象とするメモリダンプは次のようなものです。
0: kd> vertarget
Windows 10 Kernel Version 18362 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 18362.1.amd64fre.19h1_release.190318-1202
Machine Name:
Kernel base = 0xfffff804`59a00000 PsLoadedModuleList = 0xfffff804`59e480b0
Debug session time: Sun Nov  3 09:56:47.110 2019 (UTC + 9:00)
System Uptime: 0 days 1:42:54.949
 本館の独自解析コードを実行すると、次のような結果が返されてきます。
ObjectTable->0xffff8d8c4c8e8000	HandleCount->0235	ffffc489264e2080->notmyfault64.e

[---]

kbody->0xffff8d8c506b9400	kcb->0xffff8d8c4ac4d720
	FullKeyName->***
	RefCount->0014
Found list end after 10 entries
	Length->8	ShrtKeyName->SECURITYt

kbody->0xffff8d8c506bbda0	kcb->0xffff8d8c49cb15f0
	FullKeyName->***
	RefCount->0020
Found list end after 16 entries
	Length->8	ShrtKeyName->SECURITYt

kbody->0xffff8d8c506ba2a0	kcb->0xffff8d8c4a7640c0
	FullKeyName->\REGISTRY\USER\S-1-5-21-1130387745-3410680543-2795099033-1001_Classes	RefCount->0080
Found list end after 63 entries
	Length->54	ShrtKeyName->S-1-5-21-1130387745-3410680543-2795099033-1001_CLASSES
 この情報には2箇所のデータが赤色で表示されています。いずれも「SECURITYt」というキー名が表示されています。キー名の前に表示されている「Length->8」はキー名を構成する文字数を示していますから、「SECURITYt」から「t」を取り除き、残りの「SECURITY」が正式なキー名となります。

 同じ名前を持つこれら2つのキーオブジェクトは「kbody」欄などの他の数値を見ると、異なる値が設定されていますから、キー名が同名であっても、同一のオブジェクトではないことが分かります。また、「FullKeyName」欄は「***」となっており、「FullKeyName->\REGISTRY\USER\S-1-5-21-1130387745-3410680543-2795099033-1001_Classes」のようにキー名がフル表示されていません。ここでは、2つの「SECURITY」キーオブジェクトの違いを調査してみます。

 本館の独自解析コードを実行し、最初の「SECURITY」キーオブジェクトの「FullKeyName」を確認してみます。
ParentKcb->0xffff8d8c4a75d7c0	FullKeyName->	kcb->0xffff8d8c4a75d7c0	Length->17	ShrtKeyName->INTERNET EXPLORERI訣
ParentKcb->0xffff8d8c4a4b4cd0	FullKeyName->	kcb->0xffff8d8c4a4b4cd0	Length->9	ShrtKeyName->MICROSOFTRSIOND03
ParentKcb->0xffff8d8c4ac68840	FullKeyName->	kcb->0xffff8d8c4ac68840	Length->8	ShrtKeyName->SOFTWAREYSERVICES
ParentKcb->0xffff8d8c4a4840d0	FullKeyName->	kcb->0xffff8d8c4a4840d0	Length->46	ShrtKeyName->S-1-5-21-1130387745-3410680543-2795099033-1001vコK
ParentKcb->0xffff8d8c4a484a00	FullKeyName->	kcb->0xffff8d8c4a484a00	Length->46	ShrtKeyName->S-1-5-21-1130387745-3410680543-2795099033-1001vコK
ParentKcb->0xffff8d8c43ea1be0	FullKeyName->	kcb->0xffff8d8c43ea1be0	Length->4	ShrtKeyName->USER
ParentKcb->0xffff8d8c43e58050	FullKeyName->	kcb->0xffff8d8c43e58050	Length->8	ShrtKeyName->REGISTRY
 この情報内の「ShrtKeyName」欄の文字列を下から上に向かって連結すると、「\REGISTRY\USER\S-1-5-21-1130387745-3410680543-2795099033-1001\SOFTWARE\MICROSOFT\INTERNET EXPLORER\SECURITY」という「FullKeyName」キーが完成します。ちなみに、このキーは、次のようなプロセスが参照しています。
	Kbody->0xffff8d8c506b9400	ProcessId->0x1514
Found list end after 10 entries
0000: 0xffffc48926221080	ProcessId->0x10e8	StartMenuExper
0001: 0xffffc489269e70c0	ProcessId->0x1778	svchost.exe
0002: 0xffffc489269e84c0	ProcessId->0x18cc	ShellExperienc
0003: 0xffffc489271230c0	ProcessId->0x18b8	dllhost.exe
0004: 0xffffc48926b9a080	ProcessId->0x0a80	RuntimeBroker.
0005: 0xffffc489250ee080	ProcessId->0x0bec	svchost.exe
0006: 0xffffc489269cf080	ProcessId->0x10a8	RuntimeBroker.
0007: 0xffffc48926f94500	ProcessId->0x043c	smartscreen.ex
0008: 0xffffc48924b9a080	ProcessId->0x0594	chrome.exe
 この結果を見ると、エントリ数が10個のところ9個しか表示されていません。この背景は興味あるところですが、ここでは、プロセスオブジェクトが2ヶ所で管理されている内部事情に起因すると推察される、とだけ述べておき、詳しい解説は割愛します。ルートキットなどの凶悪マルウェアの潜伏を安易に否定することはできませんが、本館の経験では、数年に一件そのレベルの事案に遭遇するかどうかといった程度です。

 2番目の「SECURITY」キーオブジェクトの「FullKeyName」は次のようになっています。
ParentKcb->0xffff8d8c48de6e30	FullKeyName->	kcb->0xffff8d8c48de6e30	Length->17	ShrtKeyName->INTERNET EXPLORERI訣
ParentKcb->0xffff8d8c47d41d80	FullKeyName->	kcb->0xffff8d8c47d41d80	Length->9	ShrtKeyName->MICROSOFTRSIOND03
ParentKcb->0xffff8d8c443180f0	FullKeyName->	kcb->0xffff8d8c443180f0	Length->8	ShrtKeyName->SOFTWAREYSERVICES
ParentKcb->0xffff8d8c44318390	FullKeyName->	kcb->0xffff8d8c44318390	Length->8	ShrtKeyName->SOFTWAREYSERVICES
ParentKcb->0xffff8d8c43e58ad0	FullKeyName->	kcb->0xffff8d8c43e58ad0	Length->7	ShrtKeyName->MACHINE
ParentKcb->0xffff8d8c43e58050	FullKeyName->	kcb->0xffff8d8c43e58050	Length->8	ShrtKeyName->REGISTRY
 この情報を見ると、「SOFTWARE」キーへのアクセスが重複している印象を受けます。調査してみると、キャッシュミスがあった模様です。「FullKeyName」キーは前項の要領で完成させることができます。なお、このキーは次のようなプロセスが参照しています。
	Kbody->0xffff8d8c506bbda0	ProcessId->0x1514
Found list end after 16 entries
0000: 0xffffc4891e2620c0	ProcessId->0x0004	System
0001: 0xffffc489206c2080	ProcessId->0x1148	svchost.exe
0002: 0xffffc4892582e080	ProcessId->0x1444	svchost.exe
0003: 0xffffc489204e3080	ProcessId->0x13a0	svchost.exe
0004: 0xffffc48920545080	ProcessId->0x0c4c	taskhostw.exe
0005: 0xffffc489262dc0c0	ProcessId->0x0c88	svchost.exe
0006: 0xffffc48926221080	ProcessId->0x10e8	StartMenuExper
0007: 0xffffc489269e70c0	ProcessId->0x1778	svchost.exe
0008: 0xffffc48926d79280	ProcessId->0x003c	SecurityHealth
0009: 0xffffc489269e84c0	ProcessId->0x18cc	ShellExperienc
0010: 0xffffc489271230c0	ProcessId->0x18b8	dllhost.exe
0011: 0xffffc48926b9a080	ProcessId->0x0a80	RuntimeBroker.
0012: 0xffffc489250ee080	ProcessId->0x0bec	svchost.exe
0013: 0xffffc489269cf080	ProcessId->0x10a8	RuntimeBroker.
0014: 0xffffc48926f94500	ProcessId->0x043c	smartscreen.ex
0015: 0xffffc48924b9a080	ProcessId->0x0594	chrome.exe
 この情報ではエントリ数の不一致は見られません。

 レジストリ情報はメモリフォレンジックなどの作業では極めて重要な調査対象とされています。必要以上にレジストリ深層を解析する必要はありませんが、”そこはどういう意味だろう?”という疑問を解消する技術は独自に習得しておく必要はあるでしょう。この姿勢を堅持していれば、たとえば、「WinDbgとWindowsレジストリ解析(基礎)」で紹介したようなWinDbgコマンドエラー発生時に即座に対処できる知識が自然に身に付きます。ちなみに、今回のような「FullKeyName」キーを取得する技術を習得しておくと、次のようなコマンド操作を通してWindowsレジストをカーネル空間から調査できるようになります。
0: kd> !reg q \REGISTRY\Machine\SOFTWARE\MICROSOFT\INTERNET EXPLORER\SECURITY

Found KCB = ffff8d8c49cb15f0 :: \REGISTRY\MACHINE\SOFTWARE\MICROSOFT\INTERNET EXPLORER\SECURITY

Hive         ffff8d8c44bbd000
KeyNode      000002ab4b95ec0c

[SubKeyAddr]         [SubKeyName]
2ab4ee95b2c          DPA
2ab4ee95bd4          MSN
2ab4ee95c54          Negotiate
2ab4ee95cdc          NTLM

 Use '!reg keyinfo ffff8d8c44bbd000 ' to dump the subkey details

[ValueType]         [ValueName]                   [ValueData]
 Key has no Values
 この情報で気なるSubKeyがあれば、上記のアドバイスに従って「2ab4ee95b2c」などの「SubKeyAddr」を指定したり、「\REGISTRY\Machine\SOFTWARE\MICROSOFT\INTERNET EXPLORER\SECURITY\DPA」といった「FullKeyName」キーを指定すれば、より詳しい分析を進めることができます。さらには、次のような応用も可能となります。
0: kd> !reg q \REGISTRY\Machine\SOFTWARE\Mozilla

Sorry <\REGISTRY\Machine\SOFTWARE\Mozilla> is not cached 

===========================================================================================
Falling back to traversing the tree of nodes.

Could not read KeyName; KeyCell = 220db00
Could not read KeyName; KeyCell = 220dcd8
Could not read KeyName; KeyCell = 220e4f8
Could not read KeyName; KeyCell = 220e708
Hive         ffff8d8c44bbd000
KeyNode      000002ab4c9c0a84

[SubKeyAddr]         [SubKeyName]
2ab4c9c0adc          Firefox
2ab4c9c0b4c          MaintenanceService

 Use '!reg keyinfo ffff8d8c44bbd000 ' to dump the subkey details

[ValueType]         [ValueName]                   [ValueData]
 Key has no Values
 この情報は、以前Firefoxを使用しており、その後何らかの事情でアンインストールしたことを示しています。



ビジネスメニュー




「Windowsメモリダンプ解析サービス」のご案内
Windowsメモリダンプ解析技術

Copyright©豊田孝 2004- 2024
本日は2024-12-23です。