1

我正在尝试SetProcessMitigationPolicy在 Windows 10 上使用来启用ProcessStrictHandleCheckPolicy

如果处理无效的句柄,该进程将收到致命错误。

作为一般规则,严格的句柄检查一旦打开就不能关闭。因此,使用此策略调用SetProcessMitigationPolicy函数时,RaiseExceptionOnInvalidHandleReferenceHandleExceptionsPermanentlyEnabled子结构成员的值必须相同。不能仅临时启用无效句柄异常。

我可以启用许多其他缓解措施:

  • ProcessDynamicCodePolicy:进程的动态代码策略。开启后,进程无法生成动态代码或修改现有的可执行代码。
  • ProcessExtensionPointDisablePolicy:包含旧版扩展点 DLL 的进程缓解策略设置。
  • ProcessSignaturePolicy:可以将图像加载限制为由 Mi​​crosoft、Windows 应用商店或 Microsoft、Windows 应用商店和 Windows 硬件质量实验室 (WHQL) 签名的图像的进程策略。
  • ProcessFontDisablePolicy:关于进程字体加载的策略。开启后,进程无法加载非系统字体。
  • ProcessImageLoadPolicy:关于进程图像加载的策略,它决定了允许映射到进程中的可执行图像的类型。打开后,无法从某些位置加载图像,例如远程设备或具有低强制标签的文件。

但是ProcessStrictHandleCheckPolicy

PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY policy;
policy.RaiseExceptionOnInvalidHandleReference = 1;
policy.HandleExceptionsPermanentlyEnabled = 1;

BOOL res = SetProcessMitigationPolicy(ProcessStrictHandleCheckPolicy, policy, sizeof(policy));

if (!res) 
   RaiseLastWin32Error();

失败,错误代码 87:

ERROR_INVALID_PARAMETER
参数不正确

怎么了?

奖金喋喋不休

ProcessDynamicCodePolicy策略阻止嵌入式 Web 浏览器运行 Javascript :

  • ProhibitDynamicCode:设置(0x1)以防止进程生成动态代码或修改现有的可执行代码;否则保持未设置 (0x0)。
  • AllowThreadOptOut: 设置 (0x1) 以允许线程通过调用SetThreadInformation函数来选择退出动态代码生成的限制,并将 ThreadInformation 参数设置为ThreadDynamicCodePolicy;否则保持未设置 (0x0)。您不应同时使用AllowThreadOptOutThreadDynamicCodePolicy设置来提供强大的安全性。这些设置仅旨在使应用程序能够更轻松地调整其代码以适应完整的动态代码限制。

更多红利

我其实是在Delphi,所以语法和上面的C/C++/C#伪代码不同:

type
    //ProcessStrictHandleCheckPolicy - The process will receive a fatal error if it manipulates an invalid handle. Useful for preventing downstream problems in a process due to handle misuse.
    PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY = record
        Flags: DWORD;
                //DWORD RaiseExceptionOnInvalidHandleReference : 1;
                //DWORD HandleExceptionsPermanentlyEnabled : 1;
                //DWORD ReservedFlags : 30;
    end;

procedure SetMitigationPolicy;
var
    policy: PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY;
    res: BOOL;
begin
    policy.Flags := $00000002;
    res := SetProcessMitigationPolicy(ProcessStrictHandleCheckPolicy, @policy, sizeof(policy));
    if not res then
        RaiseLastWin32Error;
end;

它不会改变问题:

  • 有时当我发布 Delphi 代码时,它并不是严格与 Delphi 相关的,我收到评论说我应该包含 Delphi 标记
  • 有时当我发布 Delphi 代码时,它并不是严格与 Delphi 相关的,我会收到一些我不应该包含 Delphi 标签的评论

掷骰子

不要包含delphi delphi-xe6标签。

奖金阅读

4

1 回答 1

3

PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY文档中:

作为一般规则,严格的句柄检查一旦打开就不能关闭。因此,使用此策略调用 SetProcessMitigationPolicy 函数时,RaiseExceptionOnInvalidHandleReference 和 HandleExceptionsPermanentlyEnabled 子结构成员的值必须相同。不能仅临时启用无效句柄异常。

当你写道:

policy.Flags := $00000002;

您只设置了HandleExceptionsPermanentlyEnabled标志,但没有设置RaiseExceptionOnInvalidHandleReference标志。应该是这样,它设置了两个标志:

policy.Flags := $00000003;

我相当确定您从未真正运行过您的 C++ 代码,因为它无法编译。如果您修复了明显的编译错误,那么它将成功运行。

#define  _WIN32_WINNT 0x0602

#include <Windows.h>
#include <Processthreadsapi.h>
#include <iostream>

int main()
{
    PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY policy = { 0 };
    policy.RaiseExceptionOnInvalidHandleReference = 1;
    policy.HandleExceptionsPermanentlyEnabled = 1;

    BOOL res = SetProcessMitigationPolicy(ProcessStrictHandleCheckPolicy, &policy, 
        sizeof(policy));
    DWORD err = 0;
    if (!res)
        err = GetLastError();
    std::cout << res << ", " << err;
}

该程序1, 0按预期输出。如果你添加

policy.Flags = 0x00000002;

在调用 to 之前SetProcessMitigationPolicy,输出是0, 87.

于 2016-10-27T21:43:44.283 回答