開発者の対象者とサンプル コード

マルウェア対策スキャン インターフェイスは、2 つの開発者グループが使用するように設計されています。

  • アプリ内からマルウェア対策製品を要求するアプリケーション開発者。
  • 製品がアプリケーションに最適な機能を持つことを望むマルウェア対策製品のサードパーティの作成者。

アプリケーション開発者

AMSI は、特に「ファイルレス マルウェア」と戦うために設計されています。 AMSI 技術を最適に活用できるアプリケーションの種類には、スクリプト エンジン、メモリ バッファーを使用する前にスキャンする必要があるアプリケーション、PE 以外の実行可能コード (Microsoft Word や Excel のマクロ、PDF ドキュメントなど) を含むことができるファイルを処理するアプリケーションがあります。 ただし、AMSI 技術の有用性は、それらの例に限定されません。

アプリケーションで AMSI とインターフェイスを設定するには、2 つの方法があります。

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}