svchost.exe
svchost.exe (Service HostあるいはSvcHost) はWindows NT系オペレーティングシステムで複数のWindowsサービスを受け持つシステムプロセスである[1]。svchostはリソースの消費を低減するために数多くのサービスを単一のプロセスで共有することができ、いわゆる共有サービスプロセスの実装に必要不可欠である。複数のサービスを単一のプロセスにグループ化することで処理リソースを節約する。Windowsのプロセス生成はUnix系などの他のオペレーティングシステムよりも多くの時間とメモリを消費するため、この考慮はNTの設計者にとってとりわけ懸念事項であった[2]。しかしながら、もしサービスのうちの一つが想定外の例外(エラー)を発生させると、そのプロセスごとクラッシュするであろう。また、エンドユーザーにとってはコンポーネントサービスを特定することがより困難になる。様々なホストサービスの問題、特にWindows Updateはユーザーや報道機関からはsvchostの問題として報告される。
svchostプロセスはWindows 2000で追加されたが[3]、共有サービスプロセスの基本的なサポートはWindows NT 3.1から存在していた[2]。
実装
[編集]実行可能イメージは%SystemRoot%\System32\Svchost.exe
または%SystemRoot%\SysWOW64\Svchost.exe
(後者は64ビットシステムで32ビットサービスを実行する役割を持つ)で、複数のインスタンスでそれぞれが1つまたは複数のサービスを受け持つ。
SvcHostのサービスはダイナミックリンクライブラリ (DLL) として実装される。各サービスのレジストリキーはParameters
サブキーにServiceDll
という名前の値を持ち、サービスのDLLファイルを指している。イメージパス定義は%SystemRoot%\System32\svchost.exe -k (サービスグループ名、例えばnetsvcs)
という形式となる。サービスは同じパラメータのSvcHostプロセスを共有し、SCM(サービス コントロール マネージャ)のデータベースに単一のエントリを持っている。最初にSvcHostプロセスがパラメータ指定で起動されると、HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
キー(サービス名のリスト)下の同じ名前の値を参照する。そして、ホストする全てのサービスをSCMに通知する。SCMはサービスを受け持った2つ目のSvcHostプロセスを起動することなく、代わりに、そのコンテキスト内で起動されるべきサービス名を含むそれぞれのSvcHostプロセスに対して単に開始コマンドを送る。
2003年のマイクロソフトのプレゼンテーションによると、共有サービスの最小ワーキングセットは150kBで、独立プロセスでは800kBであった。
サービスタグ
[編集]Windows Vistaより、共有プロセス(svchostを含む)にあるサービスの内部識別がサービスタグで保持されるようになった。それぞれのスレッドのサービスタグはスレッド環境ブロック (thread environment block : TEB) のSubProcessTag
に保持される。タグはWindowsのスレッドプールAPIによって間接的に作成されたスレッドを除き、メインサービススレッド開始後の全てのスレッドに継承される。[4]
サービスタグ管理ルーチンは2016年時点で非公開APIであるが、サービスに関連付けられたTCP接続の情報を出力するnetstatといったいくつかのWindowsユーティリティーで使われている。ScTagQueryなどいくつかのサードパーティー製ツールでもこのAPIが使われている。[4]
特定とホストサービスの管理
[編集]Windows XPやそれ以降のエディションでは、tasklist
コマンドに/svc
スイッチを付けることで各プロセスのコンポーネントサービスの一覧を出力できる。
Windows Vista以降では、Windows タスク マネージャーの「サービス」タブにサービスのリストおよびグループとプロセスIDが表示される。また「プロセス」タブのsvchostインスタンスを右クリックして「サービスを表示」を選択することでも、サービスのリストに切り替え、さらに同じsvchostインスタンスで実行しているサービスを選択する。
Windows 8では、タスクマネージャーの「プロセス」タブは展開可能なリストになり、各svchostは横の矢印をクリックすることで実行中のサービスのサブリストを展開できるようになった。
セキュリティの問題
[編集]![](http://178.128.105.246/cars-http-upload.wikimedia.org/wikipedia/commons/thumb/5/53/Conficker.svg/150px-Conficker.svg.png)
svchost.exeは共通のシステムプロセスとして使われるため、いくつかのマルウェアは "svchost.exe" のプロセス名を模倣して使用している。元のsvchost.exeシステムファイルはC:\Windows\System32
フォルダーに配置されている。それ以外のフォルダーに配置されている "svchost.exe" はマルウェアであると考えられる[5]。プロセスのイメージパスおよびその起動コマンドラインを特定することは、偽装ソフトウェアを見分けることに役に立ち、またsvchost.exeのプロセス名を装って実行している実際のプログラムファイルを見つけやすくする(Windowsは同名の複数のプロセスを全て表示する)。いくつかのマルウェアには.dllファイルを正規のsvchostプロセスに注入するものがあり、Confickerワーム[6]、やSNOWGLOBEが挙げられる。[7]
関連項目
[編集]脚注
[編集]- ^ Russinovich, Solomon & Ionescu (2009:302)
- ^ a b “Shared Services - Larry Osterman's WebLog”. Larry Osterman (2005年9月9日). 1 October 2014閲覧。
- ^ “How to troubleshoot Service Host (svchost.exe) related problems?”. 1 October 2014閲覧。
- ^ a b Russinovich, Solomon & Ionescu (2012:335)
- ^ “Svchost.exe - What is svchost.exe? Windows system file”. 1 October 2014閲覧。
- ^ Microsoft (2009年8月5日). “Virus alert about the Win32/Conficker worm”. Microsoft. 2010年2月24日閲覧。
- ^ http://www.spiegel.de/media/media-35688.pdf
参考文献
[編集]- Russinovich, Mark; Solomon, David; Ionescu, Alex (2009), Windows® Internals (5th ed.), Microsoft Press, ISBN 0-7356-2530-1
- Russinovich, Mark; Solomon, David; Ionescu, Alex (2012), Windows Internals. Part 1 (6th ed.), Microsoft Press, ISBN 978-0-7356-4873-9