개발자 대상 그룹 및 샘플 코드

맬웨어 방지 검사 인터페이스는 두 개발자 그룹에서 사용하도록 설계되었습니다.

  • 앱 내에서 맬웨어 방지 제품을 요청하려는 애플리케이션 개발자.
  • 제품이 애플리케이션에 최상의 기능을 제공하려는 맬웨어 방지 제품의 타사 작성자입니다.

애플리케이션 개발자

AMSI는 특히 "파일리스 맬웨어"에 대처하기 위해 설계되었습니다. AMSI 기술을 최적으로 활용할 수 있는 애플리케이션 유형에는 스크립트 엔진, 메모리 버퍼를 사용하기 전에 검사해야 하는 애플리케이션, PE가 아닌 실행 코드(예: Microsoft Word 및 Excel 매크로 또는 PDF 문서)를 포함할 수 있는 파일을 처리하는 애플리케이션이 포함됩니다. 그러나 AMSI 기술의 유용성은 이러한 예제에 국한되지 않습니다.

애플리케이션에서 AMSI와 인터페이스할 수 있는 두 가지 방법이 있습니다.

COM 애플리케이션 내에서 AMSI를 사용하는 방법을 보여 주는 샘플 코드는 IAmsiStream 인터페이스 샘플 애플리케이션을 참조하세요.

맬웨어 방지 제품의 타사 작성자

맬웨어 방지 제품의 작성자로서 AMSI 공급자로 작동하도록 고유한 DLL(In-Process COM 서버)을 작성하고 등록하도록 선택할 수 있습니다. 해당 AMSI 공급자는 IAntimalwareProvider 인터페이스를 구현해야 하며 프로세스에서 실행해야 합니다.

버전 1709(2017년 가을 크리에이터스 업데이트)가 Windows 10 후에는 동시에 로드할 경로의 다른 DLL에 의존하는 경우 AMSI 공급자 DLL이 작동하지 않을 수 있습니다. DLL 하이재킹을 방지하려면 공급자 DLL이 보안 LoadLibrary 호출 또는 동등한 호출을 사용하여 종속성을 명시적으로 로드(전체 경로 포함)하는 것이 좋습니다. LoadLibrary 검색 동작을 사용하는 대신 이 작업을 수행하는 것이 좋습니다.

아래 섹션에서는 AMSI 공급자를 등록하는 방법을 보여 줍니다. 고유한 AMSI 공급자 DLL을 작성하는 방법을 보여 주는 전체 샘플 코드는 IAntimalwareProvider 인터페이스 샘플 애플리케이션을 참조하세요.

AMSI에 공급자 DLL 등록

먼저 이러한 Windows 레지스트리 키가 있는지 확인해야 합니다.

  • HKLM\SOFTWARE\Microsoft\AMSI\Providers
  • HKLM\SOFTWARE\Classes\CLSID

AMSI 공급자는 In-process 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

    (기본값) %ProgramFiles%\TestProvider\SampleAmsiProvider.dllREG_EXPAND_SZ

    ThreadingModel REG_SZ 모두

일반 COM 등록 외에도 AMSI를 사용하여 공급자를 등록해야 합니다. 다음 키에 항목을 추가하여 이 작업을 수행합니다.

HKLM\SOFTWARE\Microsoft\AMSI\Providers

예를 들면 다음과 같습니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}