豊田 孝

 今回はプロセスを取り上げます。皆さんの中には,プロセスという用語を目にすると,「それは難解な専門家向けの用語であり,自分には関係がない」,と思う人も結構いることでしょう。しかしご承知のように,現在はインターネットへの常時接続の時代であり,使用しているマシンのセキュリティを守るためには,今回取り上げるプロセスの知識が必要になります。また,マシンのパフォーマンスが低下しているような場合も,プロセスの知識が必要になります。

 基本的には,インターネット機能を備えたプロセスの動作を停止すれば,インターネットからの脅威は減ります。また,不要なプロセスの動作を停止すれば,マシンのパフォーマンスは基本的に向上すると考えてよいでしょう。このように,プロセスに関する知識を持っていると,マシンを使用するためのいろいろな応用技術が自然に身に付くのです。

 それでは早々,皆さんのマシン内で現在動作しているプロセスを調べてみましょう。

図1●サンプル・プログラムの実行結果
図2●「メモ帳」プロセスの情報

本日のサンプル・プログラム

 いつものように,こちらからサンプル・プログラムをダウンロードし,実行してみましょう。私のWindows XP環境で実行すると,図1[拡大表示]のような結果が返されました。

 画面先頭の「Total Instance Count」項目を見ると分かるように,私の環境では26個のプロセスが動いています。この画面を下方向にスクロールすれば,すべてのプロセス情報を確認することができます。

 図1に表示している「System Idle Process」は特殊なものですから,すべてのWindowsに付属する「メモ帳」を起動してみます。図2[拡大表示]は,「メモ帳」プロセスの現在の状態を示しています。「CommandLine」項目を見ると分かるように,私は「メモ帳」を起動して,本日のサンプル・プログラム「No12.VBS」ファイルを編集しています。サンプル・プログラムの格納先などもこの画面からはっきり分かります。さらに,注目していただきたいのは「24: Caption」欄です。次のような情報が書き込まれています。

notepad.exe(User=:既定,Domain=:COMPUTER,SID=:S-1-5-21-1229272821-1383384898-1708537768-1000) (配列?: False)

 これは,「メモ帳」(正式には,「notepad.exe」ファイル)プロセスの所有者に関する情報です。この場合,「COMPUTER」ドメインに属する「既定」というユーザがこのプロセスの所有者ということになります。ここで一部の人は「所有者とはいったいどういう意味なのか?」という疑問を持つかもしれません。今回は,その答えを次のように考えておくことにします。

“プロセスの所有者とは,プロセスのすべてのプロパティを所有し,自由に使えるユーザーである”

 プロセスのプロパティは,返される情報を検討すれば分かります。例えば,実行パスやワーキング・セットに関するプロパティがあります。これらのプロパティは,基本的にはファイル・システム資源であり,メモリー資源です。このため,プロセスの所有者は,これらの資源を所有し,自由に使える,ということになります。これらの事実から,インターネット経由(例えば,不正アクセス)で,あるプロセスが起動された場合,その所有者(この場合,インターネット側からアクセスしてきたユーザー)はファイル・システム資源やメモリー資源を使える,という結論が導かれます。

 なお,プロセスの所有者のほかに,「プロセスの親」という表現があります。これは,プロセスは別のプロセスを起動できることを意味し,起動したプロセスを起動されたプロセスの「親」と呼びます。例えば,Windows Media Playerがその内部でInternet Explorerを起動すれば,Windows Media PlayerはInternet Explorerの「親プロセス」となります。親プロセスの調査方法は,この後で説明することにします。

サンプル・プログラムの機能と拡張のためのヒント

 今回のサンプル・プログラムはリスト1のようになっています。基本的には,これまでのサンプル・プログラムと同じです。標準化団体であるDTMF定義クラスから派生した「Win32_Process」クラスを活用しています。また,かなりの情報を絞り切るロジックも投入しています。このサンプル・プログラムが返す情報はまさに“生きた情報”ですから,プログラミング経験のそれほどない人も,頑張って拡張コードを追加してみてはいかがでしょうか。

 特定のプロセスの情報を知りたい場合には,次のようなコードを追加します。


 If "WMPLAYER.EXE" <> ucase(oHelper_2.Name) Then
  Exit For
 End If

 このコードを追加すると,Windows Media Playerのプロセスに関する情報のみを取得することができます。

 プロセスの親プロセス情報を収集したいときには,次のようなコードを追加します。


 If "216" <> oHelper_2.ProcessID Then
  Exit For
 End If

 このコードで使用されている216という数値は,oHelper_2.ParentProcessIDの値です。プロセスのプロパティの1つですから,サンプル・プログラムから返される情報を何度も眺めてみてください。返される情報はすべてプログラム内で利用できる貴重なものなのです。なお,親プロセスをどんどんさかのぼっていくと,冒頭に紹介した「System Idle Process」プロセスに出会うはずです。Windows世界におけるすべてのプロセスの親は「System Idle Process」なのです。興味ある方は,ぜひ挑戦してください。

 また,調査対象のプロセス個数を指定するときには,次のようなコードを追加します。


 If iCount = 11 Then
  Exit For
 End If

 このコードを追加すると,調査対象プロセス個数を10個に制限することができます。

 以上の拡張コードの追加位置は,ソースコード内に明記してありますから,お時間のあるときにぜひ試してみてください。1行でも2行でもコードを追加すればそれだけ,プログラミング知識はもちろん,プロセスに関する理解が深まります。このようなプロセスに関する知識は,将来監視ツールを自作したり,あるいは,市販ツール製品を購入する際の貴重な基礎情報となります。基礎情報を持っていて損をすることは何一つありません。

 本日触れなかったSIDなどのアカウント情報については前回記事を,そして,プロセスに関するより詳細な情報はこちらを参照してください。なお,一部の情報はユーザー権限の制約があり,表示されないこともあります。高度なユーザー権限の与え方については,省略させていただきます。

 本日は以上で終了です。次回またお会いいたしましょう。ごきげんよう!