gpt4 book ai didi

c++ - 尝试了解可由 SetProcessMitigationPolicy 函数设置的流程缓解策略

转载 作者:行者123 更新时间:2023-11-30 04:53:08 31 4
gpt4 key购买 nike

抱歉,这个问题太宽泛了。我想看看到底是什么 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();

    对不起,我太天真了,扩展点 DLL 是什么?我该如何测试?

  3. ProcessSignaturePolicy 声明它可以“将图像加载限制为由 Mi​​crosoft、Windows Store 或 Microsoft、Windows Store 和 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 is either not designed to run on Windows or it contains an error. Try installing the program again using the original installation media or contact your system administrator or the software vendor for support. Error status 0xc0000428.

    有趣的是,如果我在一些未签名的 System32 DLL 上调用它:

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

    它似乎工作正常。但是,如果我将测试 Dll1.dll 的拷贝放入 System32 文件夹并以这种方式加载它:

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

    它仍然失败并显示相同的消息框:

    enter image description here

    这很有趣。它如何区分 iologmsg.dllDll1_.dll 之间的区别?两个文件都没有签名。

    附言。如果应用(或服务)不希望在该处显示任何 UI,那么该模式消息框可能会造成非常严重的干扰。

  4. ProcessFontDisablePolicy 最后,我完全迷失了这个。它声明它“关闭进程加载非系统字体的能力。

    所以在我的 MFC GUI 应用程序中启用它之后:

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

    应用程序有一个 Richedit control我可以加载自定义字体。所以我上网下载了一个 totally random font .然后将其安装在 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

    那么我在该政策中遗漏了什么?

最佳答案

这是猜测,但由于函数文档中的许多链接都是 404,我相信以下内容是有效的:

1.可能还没有实现。

2.只是一个猜测(因为链接也是404),但它可能指的是在过时情况下使用的DLL(如XP及以下登录DLL,在Vista中被替换为Credential Providers)。

3.Windows DLL 被视为已签名(实际上没有附加数字签名),不仅因为它们驻留在 System32 中,而且因为 Windows 在内部为它们保留了一个映射。对于您的 DLL,它不起作用。此外,这在 CreateProcess() 中没有意义,因为新进程无法与您的进程交互(在您不知情的情况下),因此无法劫持它,其中加载了 LoadLibrary 的 DLL 可以做任何事情来破坏您的进程。

4.可能是指资源管理器没有安装的字体,是用AddFontResource添加的字体.

关于c++ - 尝试了解可由 SetProcessMitigationPolicy 函数设置的流程缓解策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53983079/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com