我正在尝试在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
参数不正确
有什么问题?
ProcessDynamicCodePolicy 政策阻止嵌入式网络浏览器运行Javascript:
ProhibitDynamicCode
:设置(0x1)以防止进程生成动态代码或修改现有可执行代码;否则不设置(0x0)。AllowThreadOptOut
:设置(0x1)以允许线程通过调用SetThreadInformation函数并将ThreadInformation参数设置为 ThreadDynamicCodePolicy ;否则不设置(0x0)。您不应同时使用 AllowThreadOptOut 和 ThreadDynamicCodePolicy 设置来提供强大的安全性。这些设置仅用于使应用程序能够更轻松地调整其代码以实现完全动态代码限制。我实际上是在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-xe6 标记。
答案 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
。