PsKillとは
Windows Sysinternalsより提供されている、プロセスをkillするためのコマンドライン・ツール。ローカルホストのプロセスだけでなく、リモートホストのプロセスも終了させることができる。
コマンドの書式は以下の通り。
Usage: pskill [- ] [-t] [\\computer [-u username] [-p password]] <process name | process id>
詳しくはこちらを参照。
実行の流れ
- ローカルホストでPsKillを実行する。
- ローカルホスト上のプロセスをkillする場合は、TerminateProcessを呼び出してプロセスを終了させる。
- リモートホスト上のプロセスをkillする場合は、PSKLLSVC.EXEというファイルがリモートホストのADMIN$共有フォルダに作成され、PSKLLSVC.EXEを起動するためのWindows サービスがインストールされる。(サービス名: PSKLLSVC)
- ローカルホストのPsKillから渡されたkill命令をリモートホストのPSKLLSVC.EXEが名前付きパイプ経由で受け取って、プロセスを終了させる。
さっとPsKill (MD5: BFFE1A4F100B09935765C40683378D4D) のバイナリを見てみる。ここではリモートホストのプロセスを終了させる際の流れに注目してみる。
PsKillのリソースセクションにKILLSVCというexeファイルが埋め込まれている。KILLSVCは後に抽出されてリモートホストのADMIN$共有フォルダに作成される。
上述したKILLSVC (PSKLLSVC.EXE)を起動するためのPSKLLSVCというWindowsサービスがリモートホストにインストールされる。
ローカルホスト側でpskllsvcという名前付きパイプが作成される。
WriteFileで名前付きパイプへデータの書き込みを行い、ReadFileで名前付きパイプからデータを読み込む。
リモートホストに作成されるPSKLLSVC.exeを確認してみる。
pskllsvcという名前付きパイプを作成し、ConnectNamedPipeでクライアントからの接続を待ち受ける。
ReadFileで名前付きパイプからデータを読み込み、WriteFileで名前付きパイプへデータを書き込む。
以上。