AMSI(Antimalware Scan InterFace)
- Microsoftが開発したWindows10から標準で搭載されているMalware対策用インターフェース
- Powershell,VBscript,JavaScriptなどと統合されており、実行されるスクリプトのほとんどはAMSIを通じてWindowsDefenderに送られスキャンが行われる。
- AmsiProviderを独自で作成することでAMSIを通じて自身のProviderに実行されるスクリプトの情報を送ることが可能。そして、受け取ったスクリプトの情報から悪意のあるものか判別してスクリプトの動作を止めることができる。
PowerShellとAMSIの関係について主に勉強
- PowerShellで実行されるスクリプトはAMSIを通じてWindowsDefenderに送られる。
- AMSIは実行されるスクリプトの原文を送信
- 具体的には、PowerShellの中ではwin32APIの中のAmsiScanBuffer関数かAmsiScanString関数がAMSIにスキャン要請を出している。
引用元
https://docs.microsoft.com/en-us/windows/win32/amsi/how-amsi-helps
実際にいろいろ触ってみて得られた知見
- PowerShellを起動した際
裏で5回スクリプトが実行されており,初期処理が行われている.
(AMSIを通じてスクリプトが実行されていることを確認)
- スクリプト実行の際,エラーが起きた時
裏で5回スクリプトが実行されており,エラー処理が行われている.
(こちらもAMSIを通じてスクリプトが実行されていることを確認)
その後,エラー内容が表示されてプロンプトが起動する.
アプリケーション作成者のAMSI使用方法
- AmsiInitialize関数 初期化処理 ↓
- AmsiScanBuffer関数 スキャンを依頼する処理 ↓
- AmsiUninitialize関数 初期化前に戻す処理 ↓
この順番で実行することでスキャンを依頼できる。
- 関数の定義(c++)
使用の具体例(定義だけではわからない人向け)
- 変数定義
HAMSICONTEXT amsiContext = NULL;
HAMSISESSION amsiSession = NULL;
AMSI_RESULT result = AMSI_RESULT_NOT_DETECTED;
char buffer[]="スキャンしたい文字列"
- コード本体
AmsiInitialize(L"myapplication", &amsiContext);
AmsiScanBuffer(amsiContext,buffer,strlen(buffer), L"Scan Sample", amsiSession, &result);
AmsiUninitialize(amsiContext);
ここから先更新予定