開発者の対象者とサンプル コード
マルウェア対策スキャン インターフェイスは、2 つの開発者グループが使用するように設計されています。
- アプリ内からマルウェア対策製品を要求するアプリケーション開発者。
- 製品がアプリケーションに最適な機能を持つことを望むマルウェア対策製品のサードパーティの作成者。
アプリケーション開発者
AMSI は、特に「ファイルレス マルウェア」と戦うために設計されています。 AMSI 技術を最適に活用できるアプリケーションの種類には、スクリプト エンジン、メモリ バッファーを使用する前にスキャンする必要があるアプリケーション、PE 以外の実行可能コード (Microsoft Word や Excel のマクロ、PDF ドキュメントなど) を含むことができるファイルを処理するアプリケーションがあります。 ただし、AMSI 技術の有用性は、それらの例に限定されません。
アプリケーションで AMSI とインターフェイスを設定するには、2 つの方法があります。
- AMSI Win32 API を使用します。 マルウェア対策スキャン インターフェイス (AMSI) 関数を参照してください。
- AMSI COM インターフェイスを使用します。 IAmsiStream インターフェイスを参照してください。
COM アプリケーション内で AMSI を使用する方法を示すサンプル コードについては、 IAmsiStream インターフェイスのサンプル アプリケーションを参照してください。
マルウェア対策製品のサード パーティの作成者
マルウェア対策製品の作成者は、AMSI プロバイダーとして機能するために独自のインプロセス COM サーバー (DLL) を作成して登録することを選択できます。 その AMSI プロバイダーは IAntimalwareProvider インターフェイスを実装する必要があり、インプロセスで実行する必要があります。
Windows 10 バージョン 1709 (2017 年秋のクリエイター更新) 以降、AMSI プロバイダー DLL は、同時に読み込まれるパス内の他の DLL に依存している場合は動作しない可能性があることに注意してください。 DLL ハイジャックを防ぐために、プロバイダー DLL は、セキュリティで保護された LoadLibrary 呼び出しまたは同等の呼び出しを使用して、(フルパスで) 依存関係を明示的に読み込むことをお勧めします。 LoadLibrary 検索動作に依存する代わりに、これをお勧めします。
以下のセクションでは、AMSI プロバイダーを登録する方法を示します。 独自の AMSI プロバイダー DLL を作成する方法を示す全サンプル コードについては、IAntimalwareProvider インターフェイスのサンプル アプリケーションを参照してください。
プロバイダー DLL を AMSI に登録する
まず、これらの Windows レジストリ キーが存在することを確認する必要があります。
- HKLM\SOFTWARE\Microsoft\AMSI\Providers
- HKLM\SOFTWARE\Classes\CLSID
AMSI プロバイダーは、インプロセス COM サーバーです。 そのため、COM にそれ自体を登録する必要があります。 COM クラスは、HKLM\SOFTWARE\Classes\CLSID
に登録されます。
次のコードは、AMSI プロバイダーを登録する方法を示しています。その GUID (この例では) は2E5D8A62-77F9-4F7B-A90C-2744820139B2
であると仮定します。
#include <strsafe.h>
...
HRESULT SetKeyStringValue(_In_ HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR valueName, _In_ PCWSTR stringValue)
{
LONG status = RegSetKeyValue(key, subkey, valueName, REG_SZ, stringValue, (wcslen(stringValue) + 1) * sizeof(wchar_t));
return HRESULT_FROM_WIN32(status);
}
STDAPI DllRegisterServer()
{
wchar_t modulePath[MAX_PATH];
if (GetModuleFileName(g_currentModule, modulePath, ARRAYSIZE(modulePath)) >= ARRAYSIZE(modulePath))
{
return E_UNEXPECTED;
}
// Create a standard COM registration for our CLSID.
// The class must be registered as "Both" threading model,
// and support multithreaded access.
wchar_t clsidString[40];
if (StringFromGUID2(__uuidof(SampleAmsiProvider), clsidString, ARRAYSIZE(clsidString)) == 0)
{
return E_UNEXPECTED;
}
wchar_t keyPath[200];
HRESULT hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Classes\\CLSID\\%ls", clsidString);
if (FAILED(hr)) return hr;
hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, L"SampleAmsiProvider");
if (FAILED(hr)) return hr;
hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Classes\\CLSID\\%ls\\InProcServer32", clsidString);
if (FAILED(hr)) return hr;
hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, modulePath);
if (FAILED(hr)) return hr;
hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, L"ThreadingModel", L"Both");
if (FAILED(hr)) return hr;
// Register this CLSID as an anti-malware provider.
hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Microsoft\\AMSI\\Providers\\%ls", clsidString);
if (FAILED(hr)) return hr;
hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, L"SampleAmsiProvider");
if (FAILED(hr)) return hr;
return S_OK;
}
上記の例のように DLL が DllRegisterServer 関数を実装している場合は、Windows 提供の実行可能なregsvr32.exe
を使用して登録できます。 管理者特権でのコマンド プロンプトから、この形式のコマンドを発行します。
C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll
この例では、コマンドによって次のエントリが作成されます。
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
(既定値) REG_SZ サンプル AMSI プロバイダーの実装
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32
(既定値) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ Both
通常の COM 登録に加えて、プロバイダーを AMSI に登録する必要もあります。 次のキーにエントリを追加してこれを行います。
HKLM\SOFTWARE\Microsoft\AMSI\Providers
たとえば、 にします。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
既知の問題
Microsoft 以外のマルウェア対策サービスが Windows Protected Process Light (PPL) または Antimalware Protected Process Light (マルウェア対策 PPL) で AMSI プロバイダーに読み込もうとする場合は、コード整合性イベント ログに次の情報が表示されることがあります。
Log Name: Microsoft-Windows-CodeIntegrity/Operational
Source: Microsoft-Windows-CodeIntegrity
Event ID: 3033
Description:
Code Integrity determined that a process (\Device\HarddiskVolume3\<Folder>\<Folder w/ the ISV name>\<Folder w/ the product name>\<ProcessName>.exe) attempted to load \Device\HarddiskVolume3\<Folder>\<Folder w/ the ISV name>\<Folder w/ the product name>\<Your Amsi Provider>.dll that did not meet the Custom 3 / Antimalware signing level requirements.
コード整合性イベント ログを表示するには、次の手順に従います。
イベント ビューアーを開きます。
ナビゲーション ウィンドウで、 [アプリケーションとサービス ログ]>Microsoft>Windows>Code Integrity を展開し、 Operational を選択します。
または、システム監査の整合性監査が有効になっている場合は、次を探します。
- ログ名: セキュリティ
- ソース: Microsoft Windows セキュリティ
- イベント ID:
5038