Svchost.exe

svchost.exe (Service HostあるいはSvcHost) はWindows NT系オペレーティングシステムで複数のWindowsサービスを受け持つシステムプロセスである。svchostはリソースの消費を低減するために数多くのサービスを単一のプロセスで共有することができ、いわゆる共有サービスプロセスの実装に必要不可欠である。複数のサービスを単一のプロセスにグループ化することで処理リソースを節約する。Windowsのプロセス生成はUnix系などの他のオペレーティングシステムよりも多くの時間とメモリを消費するため、この考慮はNTの設計者にとってとりわけ懸念事項であった。しかしながら、もしサービスのうちの一つが想定外の例外（エラー）を発生させると、そのプロセスごとクラッシュするであろう。また、エンドユーザーにとってはコンポーネントサービスを特定することがより困難になる。様々なホストサービスの問題、特にWindows Updateはユーザーや報道機関からはsvchostの問題として報告される。 svchostプロセスはWindows 2000で追加されたが、共有サービスプロセスの基本的なサポートはWindows NT 3.1から存在していた。 実行可能イメージは%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によって間接的に作成されたスレッドを除き、メインサービススレッド開始後の全てのスレッドに継承される。 サービスタグ管理ルーチンは2016年時点で非公開APIであるが、サービスに関連付けられたTCP接続の情報を出力するnetstatといったいくつかのWindowsユーティリティーで使われている。ScTagQueryなどいくつかのサードパーティー製ツールでもこのAPIが使われている。 Windows XPやそれ以降のエディションでは、tasklistコマンドに/svcスイッチを付けることで各プロセスのコンポーネントサービスの一覧を出力できる。 Windows Vista以降では、Windows タスク マネージャーの「サービス」タブにサービスのリストおよびグループとプロセスIDが表示される。また「プロセス」タブのsvchostインスタンスを右クリックして「サービスを表示」を選択することでも、サービスのリストに切り替え、さらに同じsvchostインスタンスで実行しているサービスを選択する。 Windows 8では、タスクマネージャーの「プロセス」タブは展開可能なリストになり、各svchostは横の矢印をクリックすることで実行中のサービスのサブリストを展開できるようになった。 svchost.exeは共通のシステムプロセスとして使われるため、いくつかのマルウェアは "svchost.exe" のプロセス名を模倣して使用している。元のsvchost.exeシステムファイルはC:\Windows\System32フォルダーに配置されている。それ以外のフォルダーに配置されている "svchost.exe" はマルウェアであると考えられる。プロセスのイメージパスおよびその起動コマンドラインを特定することは、偽装ソフトウェアを見分けることに役に立ち、またsvchost.exeのプロセス名を装って実行している実際のプログラムファイルを見つけやすくする（Windowsは同名の複数のプロセスを全て表示する）。いくつかのマルウェアには.dllファイルを正規のsvchostプロセスに注入するものがあり、Confickerワーム、やSNOWGLOBEが挙げられる。 inetd サービス コントロール マネージャ（英語版） ^ 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  How to find processes behind svchost.exe ScTagQuery Memory leak in the svchost process which hosts the Task Scheduler service