다음을 통해 공유


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

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

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

애플리케이션 개발자

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

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

  • AMSI Win32 API를 사용합니다. AMSI(맬웨어 방지 검사 인터페이스) 함수를 참조 하세요.
  • AMSI COM 인터페이스를 사용합니다. IAmsiStream 인터페이스를 참조하세요.

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

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

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

Windows 10 버전 1709(2017년 가을 크리에이터스 업데이트) 이후 AMSI 공급자 DLL이 경로의 다른 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}

     (기본값) 샘플 AMSI 공급자 구현 REG_SZ

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32

     (기본값) %ProgramFiles%\TestProvider\SampleAmsiProvider.dll REG_EXPAND_SZ

     ThreadingModel REG_SZ 모두

일반 COM 등록 외에도 AMSI를 사용하여 공급자를 등록해야 합니다. 이렇게 하려면 다음 키에 항목을 추가합니다.

HKLM\SOFTWARE\Microsoft\AMSI\Providers

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

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

알려진 문제

프로세스가 서명 수준 요구 사항을 충족하지 않음

AMSI 공급자에서 로드를 시도하는 PPL(Windows Protected Process Light) 또는 맬웨어 방지 프로세스 라이트(맬웨어 방지 프로세스 표시등)인 비 Microsoft 맬웨어 방지 서비스가 있는 경우 코드 무결성 이벤트 로그에 다음 정보가 표시될 수 있습니다.

 
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. 

코드 무결성 이벤트 로그를 보려면 다음 단계를 수행합니다.

  1. 이벤트 뷰어를 엽니다.

  2. 탐색 창에서 애플리케이션 및 서비스 로그 Microsoft>확장한 다음 작동을 선택합니다.

또는 시스템 감사 무결성 감사를 사용하도록 설정한 경우 다음을 찾습니다.

  • 로그 이름: 보안
  • 출처: Microsoft Windows 보안
  • 이벤트 ID: 5038

파일 해시가 잘못되었습니다.

AMSI API는 보호되지 않는 프로세스에서 작동하도록 설계되었습니다. ISV는 ELAM/PPL 보안 프로세스에 로드할 수 있도록 AMSI 등록 DLL에 서명할 수 없습니다. 이러한 경우 Windows 보안 이벤트 로그에 다음 정보가 표시될 수 있습니다.


Description: 

Code integrity determined that the image hash of a file is not valid.  The file could be corrupt due to unauthorized modification, or the invalid hash could indicate a potential disk device error. 

File Name: \Device\HarddiskVolume3\<Folder> \<Folder w/ the ISV name> \<Folder w/ the product name>\<Your Amsi Provider>.dll 

Windows 보안 이벤트 로그를 보려면 다음 단계를 수행합니다.

  1. 이벤트 뷰어를 엽니다.

  2. 탐색 창에서 Windows 로그를 확장한 다음 보안을 선택합니다.

해결 방법:

다음 단계를 수행하여 이벤트를 필터링할 수 있습니다.

  1. 이벤트 ID 3033 또는 5038과 같은 이벤트를 필터링하려면 이벤트 뷰어를 엽니다.

  2. 탐색 창에서 애플리케이션 및 서비스 로그 Microsoft>확장한 다음 작동을 선택합니다.

  3. 동작을 마우스 오른쪽 버튼으로 클릭한 다음 현재 로그 필터...을 선택합니다.

  4. <모든 이벤트 ID> 상자에 -3033(또는 -5038)를 입력한 다음, 확인을 선택합니다.

또는 이벤트 뷰어에서 Windows 로그를 확장한 후 보안을 마우스 오른쪽 단추로 클릭하고, 현재 로그 필터링...을 선택한 다음, -3033 또는 -5038을 지정할 수 있습니다.

WEF(Windows 이벤트 전달)를 사용하는 경우 전달되는 이벤트 ID 또는 설명에 대한 세부 정보를 필터링할 수 있습니다. 자세한 내용은 기술 커뮤니티 블로그: Windows 이벤트 뷰어 고급 XML 필터링을 참조하세요.

SIEM에서 이벤트 3033 및 5038을 필터링하십시오.

조직에서 SIEM 서버를 사용하는 경우 SOC(보안 운영 센터) 분석가에게 유용하지 않은 정보를 수집하지 않도록 AMSI와 관련된 이벤트 ID 3033 및/또는 이벤트 ID 5038을 필터링해야 합니다. 자세한 내용은 Windows 이벤트 전달을 사용하여 침입 검색도움을 줍니다.