【问题标题】:GetProcessDEPPolicy says permanent but it's notGetProcessDEPPolicy 说是永久的,但不是
【发布时间】:2020-01-24 19:29:02
【问题描述】:

我有一个在 Windows 10 上运行的 32 位可执行文件。系统 DEP 设置为 OptIn。

我调用 GetProcessDEPPolicy 并返回:

dwFlags ==  0   // DEP is disabled
bPermanent == 184   // which means TRUE, so permanent

这意味着我不应该改变它。但是,这是在启动时正确的,所以我应该能够更改它。

在任何情况下,如果我忽略 bPermanent 并使用 PROCESS_DEP_ENABLE 调用 SetProcessDEPPolicy,然后再次调用 GetProcessDEPPolicy,它就会返回:

dwFlags == 1 // DEP is enabled
bPermanent == 1   // Also TRUE, so supposedly still permanent

如果我再次调用 SetProcessDEPPolicy,那么它会开始失败,我无法将其更改回来。

所以我的问题是:为什么 GetProcessDEPPolicy 在第一次调用时返回 bPermanent?它确实看起来像一个错误/回归,我认为这是行为上的变化,因为这段代码已经存在了十年,我确信它在 Windows 7 和 8 中可以正常工作。

【问题讨论】:

  • 它会返回bPermanent == 184 - 当然不是。更快 GetProcessDEPPolicy 返回 false 和垃圾 bPermanent 或者你看起来很糟糕
  • GetPRocessDEPPolicy 返回 1,所以成功,所以 bPermanent 应该是正确的。从情况的不准确性判断,184 很可能是垃圾,但 Windows API 使用 1 以外的标志和值来指示 TRUE 的情况并不少见。
  • 我绝对确定你的代码是错误的或者你看起来很糟糕
  • @RbMm,请参阅以下 Microsoft 的回复。您应该谨慎对待绝对确定性。
  • GetProcessMitigationPolicy not clear PROCESS_MITIGATION_DEP_POLICY.Permanent 如果选项不是永久性的,因为这里的堆栈是垃圾。但如果选项是永久性的 - api 正确地说 Permanent 为 true

标签: windows winapi dep


【解决方案1】:

这是 GetProcessDEPPolicy 函数中的一个缺陷。您可以改用 GetProcesMitigationPolicy 函数来解决它。

PROCESS_MITIGATION_DEP_POLICY policy = { 0 }; // important to preinitialize with 0
GetProcessMitigationPolicy(hProcess, ProcessDEPPolicy, &policy, sizeof(policy));

对不起。

【讨论】:

  • 缺陷不在 GetProcessDEPPolicy 中,而是在 GetProcessMitigationPolicy 函数中 - 如果 MEM_EXECUTE_OPTION_PERMANENT 未设置 ProcessExecuteFlags 返回的标志,则不会初始化 Permanent 字段。您在开始时通过零初始化来解决问题。但认为可能更准确地解释这种结果的位置和原因
猜你喜欢
  • 2012-08-26
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 2015-07-03
  • 2019-02-25
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多