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




 本「IT談話館」一般公開記事は、10年以上の実務経験を持つ上級Windowsエンジニアを想定しています。
 本館は、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
 Windows ALPCはプロセス間の通信を可能とするシステムメカニズムです。Windowsプロセスを人に例えるなら、私たちの人間社会における人間関係の構築を可能とするWindowsシステムメカニズムといったところでしょうか。一口に人間関係といってもその構造にはいろいろな形があります。思いつくままに列挙すると、次のような人間関係が存在していることになるでしょう。  このリストを眺めると、正直頭が痛くなりますが、Windows ALPCはデジタル技術であり、すべての人間関係をサポートしているなどとは到底考えられません。特に、人間関係の維持と発展を考えた場合、未定義要素を加味する必要があり、Windows ALPCに多くを期待することなどできません。未定義要素を含めた人間関係をデジタル化することは現時点ではほぼ不可能と考えられます。

 Windows ALPCメカニズムは、同一コンピュータ内のプロセス間通信を可能とします。通信などとカッコよい用語が使用されていますが、同一コンピュータ内で動作するあるプロセスが有する機能を他のプロセスが利用することを意味します。表現を変えれば、Windows ALPCメカニズムは、あるプロセスが他のプロセスの機能を呼び出すことであり、いわば、利害関係の構築を支援するシステム内蔵機能と定義できます。本稿では、上記リストなの「政治家などとの上下関係(利害)」という単純化した構造と視点から、Windows ALPCメカニズムを検討したいと思います。

 私のような一市民が有力政治家に何かを陳情する場合、おそらく、次のような工程を経ることになるでしょう。
  1. 適切と思える仲介者を見つける
  2. その仲介者に政治家との面会日を設定してもらう
  3. 面会日に約束の場所を訪問する
  4. 面会場所でガードマンなどからセキュリティーチェックを受ける
  5. 陳情内容を政治家(秘書)に正確かつ礼儀正しく伝達する
  6. 陳情結果を政治家(秘書や仲介者)から受信し、お礼を述べる
 日頃政治と距離を置いて暮らしている一市民にとっては、適切な仲介者を見つけることは簡単なことではないでしょう。町内会などの地域社会(所属組織)の有力者への接触から始め、市議などの知己を得て、仲介者にたどり着くこともあるでしょう。いずれにしても、仲介者との人間関係構築の前に、前段としての複数の人間関係を築く必要がありそうです。一方、Windows ALPCはWindows内部に用意されたシステム機能ですから、人間社会における煩雑な人間関係構築作業は不要となっています。

  Windows ALPCは「仲介者」なるものをどのように用意し、管理ているのか?また、「政治家との上下関係」の上下関係をどう表現しているのか?エンジニアー職の方々はこのような技術的な側面に興味を示すものですが、残念ではありますが、本稿ではその方面には深く入り込みません。

 Windows ALPCはプロセス間の関係はデジタル表現するシステム機能です。そこで、メモリダンプ内に記録されているプロセス間関係を確認してみます。
Processed 256 entries ffffd6074829a300 ffffd6074829a560
Processed 512 entries ffffd6074870dd00 ffffd607485d2d00
Processed 768 entries ffffd60749189530 ffffd60749189790
Processed 1024 entries ffffd60749b56c50 ffffd60749a80df0
Processed 1280 entries ffffd6074a6f3070 ffffd6074a6f32d0
Processed 1536 entries ffffd6073f3047e0 ffffd6073cd410b0
Processed 1792 entries ffffd6074937e070 ffffd6074937e2d0
Processed 2048 entries ffffd6074b371c60 ffffd6074b372a00
Processed 2304 entries ffffd6074cb1ba40 ffffd6074cb1bca0
Processed 2560 entries ffffd6074cd0bde0 ffffd6074a8eedf0
Processed 2816 entries ffffd6074c6fa070 ffffd6074b2f7070
Processed 3072 entries ffffd6074c721070 ffffd6074c7212d0
Processed 3328 entries ffffd607493eb5c0 ffffd6074900aca0
Processed 3584 entries ffffd6074c591300 ffffd6074559c820
Found list end after 3808 entries
 この結果は、4000に迫る数のプロセス間関係が構築されていたことを示しています。より正確には、メモリダンプの採取時点でメモリ内に残っているプロセス間関係と考えてよいでしょう。あくまでも記録ですから、私たちの人間関係と同じように、これらのプロセス間関係が現在も有効となっているとは限りません。

 プロセス間の関係は技術的にはALPCポート経由で構築されます。各ポートにはその作成者がいるはずですから、その名前を確認しておきます。
0001: AlpcPort->0xffffd607377ddb80	SeqNo->00001	Type->1		Owner(ffffd607374d5040)->System
0002: AlpcPort->0xffffd607377ddde0	SeqNo->00001	Type->1		Owner(ffffd607374d5040)->System
0003: AlpcPort->0xffffd607377deb80	SeqNo->00001	Type->1		Owner(ffffd607374d5040)->System
0004: AlpcPort->0xffffd6073a5e6db0	SeqNo->00181	Type->1		Owner(ffffd607374d5040)->System
0005: AlpcPort->0xffffd6073f222b90	SeqNo->00001	Type->1		Owner(ffffd607374d5040)->System
0006: AlpcPort->0xffffd6073f02a090	SeqNo->00005	Type->1		Owner(ffffd6073f228040)->smss.exe
0007: AlpcPort->0xffffd6073cef6db0	SeqNo->33207	Type->1		Owner(ffffd60746e4f080)->csrss.exe
0008: AlpcPort->0xffffd60745c55d50	SeqNo->00001	Type->2		Owner(ffffd607374d5040)->System
0009: AlpcPort->0xffffd60745b0ece0	SeqNo->00005	Type->3		Owner(ffffd607374d5040)->System
0010: AlpcPort->0xffffd60745b19cb0	SeqNo->00001	Type->1		Owner(ffffd60746e4f080)->csrss.exe
0011: AlpcPort->0xffffd6073cbf3900	SeqNo->00001	Type->2		Owner(ffffd60746e4f080)->csrss.exe
0012: AlpcPort->0xffffd6073f1d8920	SeqNo->00000	Type->3		Owner(ffffd6073f228040)->smss.exe
0013: AlpcPort->0xffffd6073f214920	SeqNo->00002	Type->2		Owner(ffffd6073f228040)->smss.exe
0014: AlpcPort->0xffffd6073f27ed90	SeqNo->00001	Type->3		Owner(ffffd60746e4f080)->csrss.exe
0015: AlpcPort->0xffffd6074101dd00	SeqNo->00006	Type->2		Owner(ffffd60745d90180)->wininit.exe

       ---

3793: AlpcPort->0xffffd6074ccb8860	SeqNo->00002	Type->3		Owner(ffffd60748869080)->svchost.exe
3794: AlpcPort->0xffffd6074eba7300	SeqNo->00012	Type->2		Owner(ffffd6073f5e3080)->notmyfault64.e
3795: AlpcPort->0xffffd6074b55eb10	SeqNo->00011	Type->3		Owner(ffffd60745dba080)->services.exe
3796: AlpcPort->0xffffd6074c58e300	SeqNo->00005	Type->2		Owner(ffffd60745dba080)->services.exe
3797: AlpcPort->0xffffd6074e86da00	SeqNo->00004	Type->3		Owner(ffffd60745e40080)->lsass.exe
3798: AlpcPort->0xffffd6074ca540b0	SeqNo->00006	Type->2		Owner(ffffd6073f5e3080)->notmyfault64.e
3799: AlpcPort->0xffffd6074914a590	SeqNo->00005	Type->3		Owner(ffffd60745e40080)->lsass.exe
3800: AlpcPort->0xffffd60749b57580	SeqNo->00002	Type->2		Owner(ffffd6073f5e3080)->notmyfault64.e
3801: AlpcPort->0xffffd607456e9ab0	SeqNo->00004	Type->3		Owner(ffffd6074b7cf080)->ctfmon.exe
3802: AlpcPort->0xffffd6074f24e820	SeqNo->00015	Type->2		Owner(ffffd6073f5e3080)->notmyfault64.e
3803: AlpcPort->0xffffd6074e97a590	SeqNo->00014	Type->3		Owner(ffffd607483fa080)->svchost.exe
3804: AlpcPort->0xffffd60739fc4320	SeqNo->00002	Type->1		Owner(ffffd6073f5e3080)->notmyfault64.e
3805: AlpcPort->0xffffd6073f721300	SeqNo->00003	Type->2		Owner(ffffd6073f5e3080)->notmyfault64.e
3806: AlpcPort->0xffffd6074e877ab0	SeqNo->00006	Type->3		Owner(ffffd6074b7cf080)->ctfmon.exe
3807: AlpcPort->0xffffd6074e89f590	SeqNo->00002	Type->2		Owner(ffffd6074b7cf080)->ctfmon.exe
3808: AlpcPort->0xffffd6074ea4f820	SeqNo->00004	Type->3		Owner(ffffd6073f5e3080)->notmyfault64.e
 この結果は、次のようなことを述べています。
  1. ポート数は3808であり、冒頭の数と一致している
  2. SeqNo数値は小さいものと大きいものが混在している
  3. 各ポートは1から3までのType値が割り当てられている
  4. メモリダンプ採取にはMicrosoft社のMarkさんが作成した「notmyfault」が使用されている
SeqNo値はWindows OSが付与するALPCポートのオープン順を示す値であり、SeqNo->0001などの一桁の値とSeqNo->33207といった5桁の値があります。また、各ポートに割り当てられている1から3までのType値の機能上の意味が気になります。これらの値とWindows ALPCが用意している「仲介者」なるものの間にどのような関係があるのか?

 政治の世界と縁遠い一般市民が有力政治家に何かを陳情する場合、仲介者を必要とします。適切な仲介者を見つける作業はいろいろな背景を考慮すると、それほど簡単なことではありません。Windows ALPCはプロセス間関係の構築負担を軽減するために、仲介者なる存在者を準備してくれています。用意されている仲介者とはいったいどのような存在者なのか、どのような機能を割り当てられているのか、はたまた、信頼できるのか。興味は尽きませんが、次回はWindows ALPCが用意している仲介者の存在を確認します。

次回(準備中)





ビジネスメニュー




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

Copyright©豊田孝 2004- 2025
本日は2025-02-05です。