IAntimalwareProvider
COM公式ドキュメント
マルウェア対策製品のプロバイダーを表します。(IAntimalwareProvider)
解説(Remarks)
Windows 10 バージョン 1903 以降、Windows にはプロバイダーに対する Authenticode 署名チェックを有効にする方法が追加されました。この機能は 32 ビットプロセスと 64 ビットプロセスの両方で既定では無効です。テスト目的でプロバイダーを作成する場合は、次の Windows レジストリ値を適切に設定することで署名チェックを有効または無効にできます。この値は DWORD です。
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\FeatureBits
| 値 | 動作 |
|---|---|
| 0x1 | 署名チェックは無効です。これが既定の動作です。テスト中に一時的にこの値を使用することもできます。 |
| 0x2 | Authenticode 署名のチェックが有効になります。 |
レジストリ値自体を削除した場合は、値 0x1 が設定されている場合と同じ動作になります。
プロバイダーとしては、Authenticode 証明書でクロス署名するために /ac スイッチ(SignTool と共に)を使用する必要があります。バイナリに署名したら、SignTool と /kp オプションを使用して検証できます。SignTool がエラーを返さなければ、バイナリは正しく署名されています。
この Windows レジストリ値はオペレーティングシステムによって保護されていませんが、コンピューターのウイルス対策プロバイダーがこの値を保護し、書き込み禁止にする場合があります。
プロバイダーが読み込まれているかどうかを確認するには、コード整合性イベントを表示できます。必ずコード整合性診断イベントの詳細ログを有効化してください。確認すべきイベント ID は 3040 と 3041 です。以下に例を示します。
Log Name: Microsoft-Windows-CodeIntegrity/Verbose
Source: Microsoft-Windows-CodeIntegrity
Date: M/DD/YYYY H:MM:SS PM
Event ID: 3040
Task Category: (14)
Level: Verbose
Keywords:
User: [DOMAIN_NAME]\Administrator
Computer: [COMPUTER_NAME]
Description:
Code Integrity started retrieving the cached data of [PATH_AND_FILENAME] file.
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-CodeIntegrity" Guid="{4ee76bd8-3cf4-44a0-a0ac-3937643e37a3}" />
<EventID>3040</EventID>
<Version>0</Version>
<Level>5</Level>
<Task>14</Task>
<Opcode>1</Opcode>
<Keywords>0x4000000000000000</Keywords>
<TimeCreated SystemTime="YYYY-MM-DDT02:26:48.875954700Z" />
<EventRecordID>7</EventRecordID>
<Correlation />
<Execution ProcessID="4972" ThreadID="7752" ProcessorID="1" KernelTime="14" UserTime="2" />
<Channel>Microsoft-Windows-CodeIntegrity/Verbose</Channel>
<Computer>[COMPUTER_NAME]</Computer>
<Security UserID="[USER_SID]" />
</System>
<EventData>
<Data Name="FileNameLength">40</Data>
<Data Name="FileNameBuffer">[PATH_AND_FILENAME]</Data>
</EventData>
</Event>
Log Name: Microsoft-Windows-CodeIntegrity/Verbose
Source: Microsoft-Windows-CodeIntegrity
Date: M/DD/YYYY H:MM:SS PM
Event ID: 3041
Task Category: (14)
Level: Verbose
Keywords:
User: [DOMAIN_NAME]\Administrator
Computer: [COMPUTER_NAME]
Description:
Code Integrity completed retrieval of file cache. Status 0xC0000225.
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-CodeIntegrity" Guid="{4ee76bd8-3cf4-44a0-a0ac-3937643e37a3}" />
<EventID>3041</EventID>
<Version>2</Version>
<Level>5</Level>
<Task>14</Task>
<Opcode>2</Opcode>
<Keywords>0x4000000000000000</Keywords>
<TimeCreated SystemTime="YYYY-MM-DDT02:26:48.875964700Z" />
<EventRecordID>8</EventRecordID>
<Correlation />
<Execution ProcessID="4972" ThreadID="7752" ProcessorID="1" KernelTime="14" UserTime="2" />
<Channel>Microsoft-Windows-CodeIntegrity/Verbose</Channel>
<Computer>[COMPUTER_NAME]</Computer>
<Security UserID="[USER_SID]" />
</System>
<EventData>
<Data Name="Status">0xc0000225</Data>
<Data Name="CachedFlags">0x0</Data>
<Data Name="CacheSource">0</Data>
<Data Name="CachedPolicy">0</Data>
</EventData>
</Event>
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コンテンツのストリームをスキャンします。(IAntimalwareProvider.Scan)
| stream | IAmsiStream* | in | スキャン対象の IAmsiStream ストリームです。 |
| result | AMSI_RESULT* | out | スキャンの結果です。AMSI_RESULT を参照してください。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 1 つ以上の引数が無効です。 | |
|
オブジェクトが初期化されていません。 |
セッションを閉じます。(IAntimalwareProvider.CloseSession)
| session | ULONGLONG | in | 閉じるセッションの ID / ハンドルです。 |
表示されるマルウェア対策プロバイダーの名前です。
| displayName | LPWSTR* | out | 表示名を格納する LPWSTR へのポインターです。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 引数が無効です。 | |
|
オブジェクトが初期化されていません。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAntimalwareProvider "{B2CABFE3-FE04-42B1-A5DF-08D483D4D125}" #usecom global IAntimalwareProvider IID_IAntimalwareProvider "{}" #comfunc global IAntimalwareProvider_Scan 3 sptr,var #comfunc global IAntimalwareProvider_CloseSession 4 int64 #comfunc global IAntimalwareProvider_DisplayName 5 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IAntimalwareProvider "{B2CABFE3-FE04-42B1-A5DF-08D483D4D125}" #usecom global IAntimalwareProvider IID_IAntimalwareProvider "{}" #comfunc global IAntimalwareProvider_Scan 3 sptr,sptr #comfunc global IAntimalwareProvider_CloseSession 4 int64 #comfunc global IAntimalwareProvider_DisplayName 5 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。