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




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



WinDbgとWindows XP/7/8/10のハンドルテーブル解析


 本「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カーネル内部システムテーブルの一つです。このテーブルの不正な改ざんを防止するには、テーブルへのアクセスロジックを工夫する必要があります。

 ハンドルテーブルは、XPから10までのバージョンアップ過程で継続的に再設計されてきました。2015年7月末にWindows 10がリリースされた時、本「IT談話館」はいち早くカーネルメモリダンプを採取し、ハンドルテーブルの解析にとりかかりました。予想した通り、Windows 8.1時代の解析コードは動作しなくなりました。Windows 7からWindows 8へのバージョンアップの過程で導入されたハンドルテーブル保護ロジックは貧弱であり、そこに気付いたMS社内の開発担当チームはWindows 10の開発段階で修正してきました。次の情報をご覧ください。
2: kd> vertarget
Windows 8.1 Kernel Version 9600 MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS Personal
Built by: 9600.17238.amd64fre.winblue_gdr.140723-2018
Machine Name:
Kernel base = 0xfffff801`6868c000 PsLoadedModuleList = 0xfffff801`68956350
Debug session time: Thu Oct  9 00:34:44.270 2014 (UTC + 9:00)
System Uptime: 0 days 13:38:52.140


2: kd> u nt!ObGetObjectType l0n20
nt!ObGetObjectType:
fffff801`68b318c4 0fb641e8        movzx   eax,byte ptr [rcx-18h]
fffff801`68b318c8 488d0d51dee0ff  lea     rcx,[nt!ObTypeIndexTable (fffff801`6893f720)]
fffff801`68b318cf 488b04c1        mov     rax,qword ptr [rcx+rax*8]
fffff801`68b318d3 c3              ret
 この情報は、次のようなことを示しています。  この実装ロジックはきわめて単純であり、バイト値を与えればインデックステーブルへのアクセスが可能であることを示しています。本館が確認している範囲では、Windows 8.1以前のバージョンのWindowsシステムもすべてこのリスキーなロジックを採用しています。セキュリティーを確保する視点からは、きわめて危険なロジック、といえるでしょう。このロジックは、Windows 8.1カーネルの資産を継承するWindows 10では次のように変更されています。
0: kd> vertarget
Windows 10 Kernel Version 10586 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 10586.17.amd64fre.th2_release.151121-2308
Machine Name:
Kernel base = 0xfffff802`02411000 PsLoadedModuleList = 0xfffff802`026efc70
Debug session time: Tue Jan 12 15:08:49.559 2016 (UTC + 9:00)
System Uptime: 1 days 3:41:20.157


0: kd> u nt!ObGetObjectType l0n20
nt!ObGetObjectType:
fffff802`02897bfc 488d41d0        lea     rax,[rcx-30h]
fffff802`02897c00 0fb649e8        movzx   ecx,byte ptr [rcx-18h]
fffff802`02897c04 48c1e808        shr     rax,8
fffff802`02897c08 0fb6c0          movzx   eax,al
fffff802`02897c0b 4833c1          xor     rax,rcx
fffff802`02897c0e 0fb60d5f88efff  movzx   ecx,byte ptr [nt!ObHeaderCookie (fffff802`02790474)]
fffff802`02897c15 4833c1          xor     rax,rcx
fffff802`02897c18 488d0dc18cefff  lea     rcx,[nt!ObTypeIndexTable (fffff802`027908e0)]
fffff802`02897c1f 488b04c1        mov     rax,qword ptr [rcx+rax*8]
fffff802`02897c23 c3              ret
 この情報からは、次のような技術者事情と時代背景を知ることができます。  本「IT談話館」は、先の逆アセンブルコードを次のような内部情報を返すWinDbg内蔵スクリプト(独自解析)コードに移植・実行してみました。なお、実践的な解析コードの開発知識の習得には、「時間と予算」の投資が必要です。
0: kd> vertarget
Windows 10 Kernel Version 10586 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 10586.17.amd64fre.th2_release.151121-2308
Machine Name:
Kernel base = 0xfffff802`02411000 PsLoadedModuleList = 0xfffff802`026efc70
Debug session time: Tue Jan 12 15:08:49.559 2016 (UTC + 9:00)
System Uptime: 1 days 3:41:20.157


HandleCount(1248)	explorer.exe	ffffe001f6a69840
No.001	Object->0xFFFFC000C748A340	ObjectType->0xFFFFE001F4CDBDE0	Name->Key
		Index->0x027	Handle->0x004
No.002	Object->0xFFFFC000C65AAD40	ObjectType->0xFFFFE001F4CDBDE0	Name->Key
		Index->0x027	Handle->0x008
No.003	Object->0xFFFFC000C335D150	ObjectType->0xFFFFE001F4C291D0	Name->Directory
		Index->0x003	Handle->0x00c
No.004	Object->0xFFFFE001F6F88980	ObjectType->0xFFFFE001F4C99DD0	Name->Event
		Index->0x00c	Handle->0x010
No.005	Object->0xFFFFE001F7950BD0	ObjectType->0xFFFFE001F4C99DD0	Name->Event
		Index->0x00c	Handle->0x014
No.006	Object->0xFFFFE001F7981F20	ObjectType->0xFFFFE001F4C24DC0	Name->File
		Index->0x01f	Handle->0x018
No.007	Object->0xFFFFE001F7857560	ObjectType->0xFFFFE001F4C99DD0	Name->Event
		Index->0x00c	Handle->0x01c
No.008	Object->0xFFFFE001F7AE4F90	ObjectType->0xFFFFE001F4C24F20	Name->WaitCompletionPacket
		Index->0x01e	Handle->0x020
No.009	Object->0xFFFFE001F785ADA0	ObjectType->0xFFFFE001F4CD7CF0	Name->ALPC Port
		Index->0x028	Handle->0x024
No.010	Object->0xFFFFE001F786ED40	ObjectType->0xFFFFE001F4C1FDC0	Name->IoCompletion
		Index->0x01d	Handle->0x028

[---]


0: kd> !handle 24 3 ffffe001f6a69840

PROCESS ffffe001f6a69840
    SessionId: 1  Cid: 0fd8    Peb: 0021f000  ParentCid: 0fac
    DirBase: 0cc94000  ObjectTable: ffffc000c747bf00  HandleCount: 
    Image: explorer.exe

Handle Error reading handle count.

0024: Object: ffffe001f785ada0  GrantedAccess: 001f0001 (Protected) (Inherit) (Audit) Entry: ffffc000c748d090
Object: ffffe001f785ada0  Type: (ffffe001f4cd7cf0) ALPC Port
    ObjectHeader: ffffe001f785ad70 (new version)
        HandleCount: 1  PointerCount: 32441

0: kd> !trueref ffffe001f785ada0
ffffe001f785ada0: HandleCount: 1 PointerCount: 32441 RealPointerCount: 3


0: kd> !handle 28 3 ffffe001f6a69840

PROCESS ffffe001f6a69840
    SessionId: 1  Cid: 0fd8    Peb: 0021f000  ParentCid: 0fac
    DirBase: 0cc94000  ObjectTable: ffffc000c747bf00  HandleCount: 
    Image: explorer.exe

Handle Error reading handle count.

0028: Object: ffffe001f786ed40  GrantedAccess: 001f0003 (Protected) Entry: ffffc000c748d0a0
Object: ffffe001f786ed40  Type: (ffffe001f4c1fdc0) IoCompletion
    ObjectHeader: ffffe001f786ed10 (new version)
        HandleCount: 1  PointerCount: 25319

0: kd> !trueref ffffe001f786ed40
ffffe001f786ed40: HandleCount: 1 PointerCount: 25319 RealPointerCount: 95
 本「IT談話館」のWinDbgスクリプト(独自解析)コードをいろいろなプロセスのハンドルテーブルの解析に適応してみると、個々のプロセスの内部で使用されているカーネルオブジェクトが列挙され、解析対象プロセスの特性が一目で分かります。


ビジネスメニュー




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

Copyright©豊田孝 2004- 2024
本日は2024-03-29です。