このプロジェクトは、研究目的で「任意の*」プロセスを Anti Malware Protected-Process-Light (PPL) として実行できるようにするものです。(* 詳細については制限事項セクションを参照してください)
詳細とこのプロジェクトの背景にある理由については、私が書いたこのブログ記事を参照してください。
システム保護プロセスは、Windows におけるセキュリティモデルであり、システムプロセスやアンチウイルスプロセスを、管理者/SYSTEM によるものも含めて改ざんや内部検査から保護するように設計されています。
Anti Malware「Protected Process-Light」(PPL) として起動されたプロセスは、実行できる操作が制限され、署名済みコードのみを読み込むことができますが、非保護プロセスによるデバッグ、検査、停止はできません。さらに、Microsoft-Windows-Threat-Intelligence ETW Provider などの特別なデータにアクセスできる場合があります。
このプロジェクトは、Early-Launch Anti Malware (ELAM) ドライバーとユーザーモードサービスを作成します。このサービスは起動時に、設定可能な子プロセスを起動し、その子プロセスも PPL としてマークされます。
子バイナリは、サービスと同じ証明書で署名されている必要があり、その他いくつかの制限事項がありますが、それ以外は任意のバイナリやコマンドライン引数を選択できます。
正直なところ、ELAM と PPL が何であるかをうまく説明できていません。代わりに、ここから始めることをお勧めします:
PPLRunner サービスとカーネルモジュールのビルド済みかつ署名済みのバージョンを Releases から入手できます。リリースには、自動生成された証明書と秘密鍵が .pfx ファイルとして含まれており、パスワード password で保護されています。これは研究目的のみのためのものだと確かに言いましたよね?
独自のプロジェクトを生成してビルドするには:
Windows SDK がインストールされていることを確認してください。
generate_cert.ps1 と sign_file.ps1 を開き、$password 変数を別の値に変更してください (両者は一致している必要があります)。
generate_cert.ps1 を実行します。これにより、新しい秘密鍵と公開証明書を含む ppl_runner.pfx が生成されます。
これは、PPLRunner が使用するすべてのバイナリに署名するために使用されます。
ppl_runner.sln をビルドします。これにより 3 つのバイナリが生成されます:
証明書情報を含む ELAM カーネルドライバーです。 このドライバーは実際には何も行わず、実際に読み込まれることもありません。単に署名証明書の入れ物として使用されます。
サービスのインストーラー兼バイナリです。PPL サービスとして、起動すると子プロセスを PPL として起動し、その後停止して終了します。
ビルド時に Visual Studio によって正しい証明書で署名されるサンプル実行ファイルです。 PPLRunner はほぼ任意のバイナリを実行できますが、これは自動的に署名される単なるサンプルです。
注意 テストマシンにのみインストールしてください。本番環境や自宅の PC にはインストールしないでください。
ビルド後、elam_driver.sys と ppl_runner.exe をターゲットマシン上のフォルダーにコピーします。
管理者権限のプロンプトから以下を実行してテスト署名を有効にし、再起動します:
bcdedit /set testsigning on
ppl_runner.exe install
これにより ppl_runner という名前のサービスがインストールされます。
実行するバイナリに署名するには、sign_file.ps1 スクリプトを使用するか、signtool.exe を直接実行して、ppl_runner.pfx 証明書で署名します。signtool.exe をお持ちでない場合は、Windows SDK に含まれています。
レジストリキー HKLM\SOFTWARE\PPL_RUNNER を作成します。
デフォルト/空のキーを REG_SZ に設定し、実行するバイナリのフルパスと任意のコマンドライン引数を格納します。例として、コマンドラインから次のように実行します:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\binay --argument 1"
サービスに実行ファイルを起動させるには、管理者権限のプロンプトから次を実行するだけです:
net start ppl_runner
PPL サービスとして、起動されると ppl_runner はレジストリキーを読み取り、子プロセスを起動します。この子プロセスも PPL として起動され、その後 ppl_runner は停止して終了します。起動に成功しても the service failed to run と表示されますが、sc query ppl_runner で戻りコードを確認すると 0、つまり ERROR_SUCCESS になっているはずです。
子プロセスは表示されませんが、Debug Outputs と DBGView.exe を使って何らかの出力を取得できる場合があります(child_example のコードを参照)。
このサービスは Anti Malware PPL でもあるため、同様に高いレベルのプロセスによってのみ停止および削除できます。ただし、PPLRunner を使って自身を削除できます。レジストリキーのコマンドを次のように設定するだけです:
C:\path\to\ppl_runner.exe remove
そしてサービスを実行します。つまり、次を実行します:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\ppl_runner.exe remove"
net start ppl_runner
testsigning モードでのみ動作します。ppl_runner.exe install を再実行する必要がありますSysinternals の DBGView を実行し、Win32 Global をログ出力して *[PPL_RUNNER]* でフィルタリングします。
これにより、サービスとインストーラーからのすべてのログが表示されます。
未定 - Sealighter ブログ
James Forshaw は、既存の PPL プロセスにコードを注入するための素晴らしいプロジェクトを作成しました。
ELAM と PPL についてさらに学ぶには、Alex Ionescu をフォローするのがおそらく最良の方法です。 おそらくここから始めるとよいでしょう: https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
Matt Graeber と James Forshaw をフォローすることも、もう一つの素晴らしい方法です。
証明書から「To-Be-Signed」ハッシュを取得するための powershell スクリプトを提供してくれた Matt に多大なる感謝を捧げます。