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
.
Так что именно он должен делать и как мне это делать?установить его?
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");
, она все равно не работает с тем же окном сообщения:
Это интересно.Как это может отличить iologmsg.dll
от Dll1_.dll
?Оба файла не подписаны.
PS.И это модальное окно сообщения может внести действительно неприятный рывок в микс, если приложение (или служба) не ожидает, что там будет показан какой-либо пользовательский интерфейс.
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));
Приложение смогло отобразить и использовать этот (явно не системный) шрифт без каких-либо проблем:
Так что же мне здесь не хватает в этой политике?