- Windows Security Center(WSC) サービス APIを直接活用して Windows Defender を無効化するツール defendnot の開発過程に関する体験共有
- プロジェクトは 以前の no-defender プロジェクトの技術的限界と法的問題を乗り越える過程で始まった
- 特殊な環境(MacBook arm64、リモートデバッグ、高遅延) など、さまざまな障害の中でリバースエンジニアリングとデバッグを進めた
- Defender 登録の回避とプロセス検証メカニズムを分析し、数々の失敗と試行の末に安定して動作するよう改善した
- 最終的に 自動実行機能まで実装し終えると同時に、プロジェクトの過程を振り返りながら大変だった点を打ち明けている
紹介
- Windows Defender を無効化する defendnot ツールの実装の道のりに関する体験共有
- 主要な技術的詳細の説明よりも、実際の環境で直面した問題や試行錯誤の経験を中心にまとめられている
- 正式なドキュメント化や技術的説明は、後日別途公開される予定
1年前の振り返り
- 約1年前に no-defender というプロジェクトを公開し、WSC API を通じて Windows Defender が無効化される仕組みを活用した
- このプロジェクトはアンチウイルスベンダーの サードパーティ製コードを参照することで、システムに別のアンチウイルスが登録されているように見せかけていた
- 公開後は大きな注目を集めて約1,500個の Star を獲得したが、関連アンチウイルス企業の DMCA 削除要請により、ソース削除とプロジェクト終了を決めた
プロジェクト開始のきっかけ
- 本稿執筆時点ではソウルの Airbnb に滞在中
- 主な開発環境は M4Pro MacBook で、必須となる x86 リバースエンジニアリング用の機器は別途持参していなかった
- CTF 大会と旅行日程のため、x86 デバイスなしで作業を進めなければならない状況が発生
- no-defender プロジェクトの「正常な」実装可能性を検討するとともに、AV 非依存の単独実装が可能かどうかの探求を始めた
初期調査(1日目)
- 友人の助けで wsc バイナリを提供してもらい、以前のプロジェクトと似た構成で WSC 登録の再実装を試みた
- WSC の COM APIを活用して実装したが、Access Denied エラーが発生
- エラー原因を、WSC が API 呼び出しプロセスの署名検証と認証を行っている点に見いだした
- AV プロセスにモジュールをインジェクションして登録を試みたところ、AV が正常に登録された
AV バイナリの代替と追加実験(1日目)
- 署名済みシステムプロセス(cmd.exe など)経由でツールの実行を試したが、PPL(Protected Process Light) 検証で失敗した
- 分析のため詳細な逆アセンブルと追跡を後日に回し、いったん中断した
環境構築(2日目)
- arm64 MacBook 環境の制約により、x86 Windows のデバッグが非常に困難な状況だった
- 米国に住む友人の PC をリモート(Parasec、Anydesk など)で利用し、高遅延環境下でデバッグと実験を進めた
- コードビルドと VM デバッグが複雑に行き交う過程で、速度低下と混乱を経験した
WSC サービスのデバッグ(2日目)
- WSC サービスが svchost によって実行される DLL構造であることを確認
- PPL 保護解除のため、特殊なドライバで回避を適用し、デバッガで関数への突入を確認した
- サービス内部で WinDefend SID トークンの確認が実行されていることを把握
- WinDefend SID を持つプロセスを模倣することで、認証手順を回避できるという理論を立てた
WinDefend SID の模倣(2日目)
- Windows のトークン構造と動作原理について追加学習を行った
- WinDefend SID を模倣するコードを実装して実行した結果、すべての COM 呼び出しで SUCCESS が返るにもかかわらず、実際には AV 登録が行われていない状況を確認した
検証アルゴリズムの再構成(3日目)
- AV バイナリで SID チェックが本当に通過しているのか慎重に再分析した
- SID チェック不通過時には、サービスが昇格済み権限状態、バイナリ署名、PE の DllCharacteristics フラグ(ForceIntegrity)なども追加で確認していることが分かった
- その構造を実行する関数を再現し、システム内の core バイナリに適用して実験を進めた
Taskmgr プロセスの活用(3日目)
- Taskmgr.exe を対象プロセスにして再実験したが、名前の受け渡し過程のエラーと IPC バグにより、WSC が要求を拒否する問題に直面した
- ファイルパス推論と AV 名の受け渡し方式を改善した後、正常動作を確認した
コード整理(3日目)
- 機能を整理し、自動実行(autorun) 機能の実装を試みた
- 自動実行の管理で断続的な失敗が発生し、原因究明のためにコードと環境の確認を繰り返した
自動実行の実装(4日目)
- タスク スケジューラ(Task Scheduler)のオプションのうち、ノート PC が AC 電源に接続されていない場合にタスクを実行しないチェックボックスが原因であることを確認した
- 該当設定を解除した後、自動実行は正常に動作した
- 最後にコードのクリーンアップとテストを行った
結論
- 制約が多く不便な環境でのリバースエンジニアリング作業は、心理的にも物理的にも非常に大変な経験だった
- 今後、より詳細な WSC 実装ドキュメントが別途公開される予定
謝辞
- Pindos: 夜間に PC を提供してデバッグを手伝い、部屋を暖めてくれた友人
- MrBruh: プロジェクト探求のきっかけを与え、アイデアへのフィードバックをくれた仲間
- プロジェクト期間中、連絡を取り合いながら支えてくれた知人たち
- キムチが大好きだと告白する
- 私たちの壁にグラフィティを残したアーティストにも感謝する
1件のコメント
Hacker Newsの意見
"C:\ProgramData\Microsoft\Windows Defender"フォルダ名を変更し、その場所に空ファイルを作ることnetcat.exeを使ってはいけない、みたいに誰かに監視されるのは嫌だ