尝试设置ProcessStrictHandleCheckPolicy返回87 - 不正确的函数

时间:2016-10-27 21:14:25

标签: winapi code-security

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

  

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

     

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

我可以启用其他一些缓解措施:

  • ProcessDynamicCodePolicy :流程的动态代码政策。打开时,该过程无法生成动态代码或修改现有的可执行代码。
  • ProcessExtensionPointDisablePolicy :包含旧版扩展点DLL的流程缓解策略设置。
  • ProcessSignaturePolicy :可以将图像加载限制为由Microsoft,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
  参数不正确

有什么问题?

Bonus Chatter

ProcessDynamicCodePolicy 政策阻止嵌入式网络浏览器运行Javascript:

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

更多Bonuser

我实际上是在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 标记。

奖金阅读

1 个答案:

答案 0 :(得分: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;

在调用SetProcessMitigationPolicy之前,输出为0, 87