Попытка понять политики смягчения процесса, которые могут быть установлены функцией SetProcessMitigationPolicy - PullRequest
0 голосов
/ 31 декабря 2018

Извините, если это слишком широкий вопрос.Я пытаюсь понять, что именно функция SetProcessMitigationPolicy делает в Windows 10, но я не могу найти много об этом в Интернете (кроме моих предыдущих набегов на эту тему.) Я тестирую ее PROCESS_MITIGATION_POLICY опций по-одному, и у меня есть несколько вопросов по этому поводу:

  1. ProcessSystemCallDisablePolicy утверждает, что " Отключает возможность использовать NTUser/ GDI функционирует на самом нижнем уровне.".Итак, я проверяю его так:

    PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY pmscdp = {0};
    pmscdp.DisallowWin32kSystemCalls = 1;
    BOOL bR = ::SetProcessMitigationPolicy(ProcessSystemCallDisablePolicy, &pmscdp, sizeof(pmscdp));
    int err = ::GetLastError();
    
    ::GdiFlush();   //Try to trip it here
    

    Но он всегда терпит неудачу с кодом ошибки 19 или ERROR_WRITE_PROTECT.

    Так что именно он должен делать и как мне это делать?установить его?

  2. ProcessExtensionPointDisablePolicy заявляет, что он " ... предотвращает загрузку устаревших DLL-файлов точек расширения в процесс. "

    PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY pmepdp = {0};
    pmepdp.DisableExtensionPoints = 1;
    BOOL bR = ::SetProcessMitigationPolicy(ProcessExtensionPointDisablePolicy, &pmepdp, sizeof(pmepdp));
    int err = ::GetLastError();
    

    Извините за мою наивность, но что за extension point DLL?И как я могу проверить один?

  3. ProcessSignaturePolicy заявляет, что он может " ограничить загрузку изображений теми изображениями, которые либо подписаны Microsoft, Магазином Windows, либоMicrosoft, Магазин Windows и Лаборатории качества оборудования Windows (WHQL)".

    Во-первых, кажется, что он не влияет на CreateProcess и работает только с функциями LoadLibrary -типа.Поэтому, если я сделаю это:

    PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY pmbsp = {0};
    pmbsp.MicrosoftSignedOnly = 1;
    //pmbsp.StoreSignedOnly = 1;   //always seems to fail with this flag
    //pmbsp.MitigationOptIn = 1;   //Doesn't seem to have any effect
    BOOL bR = ::SetProcessMitigationPolicy(ProcessSignaturePolicy, &pmbsp, sizeof(pmbsp));
    BOOL err = ::GetLastError();
    

    И затем попытайтесь загрузить некоторые из моих тестовых DLL:

    HMODULE hModDll = ::LoadLibrary(L".\\Dll1.dll");
    

    Сбой функции LoadLibrary с MessageBox, который читает:

    Bad Image

    Dll-Name либо не предназначен для работы в Windows, либо содержит ошибку.Попробуйте установить программу еще раз, используя оригинальный установочный носитель, или обратитесь к системному администратору или поставщику программного обеспечения за поддержкой.Состояние ошибки 0xc0000428.

    Интересно, что если я вызываю ее на какой-то System32 DLL, которая не подписана:

    HMODULE hModDll = ::LoadLibrary(L"iologmsg.dll");
    

    , она, кажется, работает нормально.Но если я помещаю копию моего теста Dll1.dll в папку System32 и загружаю ее следующим образом:

    HMODULE hModDll = ::LoadLibrary(L"Dll1_.dll");
    

    , она все равно не работает с тем же окном сообщения:

    enter image description here

    Это интересно.Как это может отличить iologmsg.dll от Dll1_.dll?Оба файла не подписаны.

    PS.И это модальное окно сообщения может внести действительно неприятный рывок в микс, если приложение (или служба) не ожидает, что там будет показан какой-либо пользовательский интерфейс.

  4. ProcessFontDisablePolicy наконец,Я полностью потерян об этом.В нем говорится, что « отключает способность процесса загружать несистемные шрифты. »

    Поэтому после его включения в приложении с графическим интерфейсом MFC:

    PROCESS_MITIGATION_FONT_DISABLE_POLICY  pmfdp = {0};
    pmfdp.DisableNonSystemFonts = 1;
    BOOL bR = ::SetProcessMitigationPolicy(ProcessFontDisablePolicy, &pmfdp, sizeof(pmfdp));
    int err = ::GetLastError();
    

    приложение имеет элемент управления Richedit , в который я могу загрузить собственный шрифт. Поэтому я подключился к сети и загрузил абсолютно случайный шрифт .Затем установил его в проводнике Windows и попытался использовать его из приложения после включения этой политики:

    //Set format for the text window
    CHARFORMAT cf = { 0 };
    cf.cbSize = sizeof(cf);
    cf.dwMask = CFM_FACE | CFM_SIZE;
    cf.yHeight = 18 * 20;
    VERIFY(SUCCEEDED(::StringCchCopy(cf.szFaceName, _countof(cf.szFaceName), L"Action Man")));
    VERIFY(SetDefaultCharFormat(cf));
    

    Приложение смогло отобразить и использовать этот (явно не системный) шрифт без каких-либо проблем:

    enter image description here

    Так что же мне здесь не хватает в этой политике?

1 Ответ

0 голосов
/ 31 декабря 2018

Это предположение, но поскольку многие ссылки в документации по функции - 404-е, я считаю, что следующее будет правильным:

1. Возможно, еще не реализовано.

2. Толькопредположение (так как ссылка также 404), но это может относиться к библиотекам DLL, используемым в устаревших ситуациях (например, DLL для входа в XP и ниже, замененная в Vista на Поставщики учетных данных ).

3. Windows DLL обрабатываются как подписанные (фактически без цифровой подписи) не только потому, что они находятся в System32, но и потому, что Windows хранит внутреннюю карту для них.Для ваших DLL это не сработает.Кроме того, это не имеет смысла в CreateProcess (), потому что новый процесс не может взаимодействовать с вашим (без вашего ведома) и, следовательно, не может взломать его, где DLL, загруженная с помощью LoadLibrary, может сделать что угодно, чтобы испортить ваш процесс.

4. Это, вероятно, относится к шрифтам, не установленным в Explorer, но шрифты, добавленные с помощью AddFontResource .

...