0

虽然我了解未标记为“可执行”的代码会触发 DEP 崩溃,但我试图了解哪种类型的常见编码实践(在旧版 Windows 应用程序中)会导致这种类型的崩溃。

4

1 回答 1

4

像这样的东西:


int main()
{
    char* s = (char*)malloc(1);
    s[0] = '\xC3';
    void (*p)() = (void (*)())(s);
    p();
}

ATL 这样做是为了为WndProc. 此类 WndProc thunk 的目的是嵌入上下文参数并使用方法WndProc而不是不采用额外上下文参数的函数。

修复很简单,并不一定包括删除动态代码分配:

  • 一种方法是@Remy 指出分配使用VirtualAlloc和管理权限使用VirtualProtect以确保执行权存在。
  • 更简单的方法是创建一个堆HeapCreate并在该堆上传递HEAP_CREATE_ENABLE_EXECUTE、分配代码
  • 最后,还有ATL thunk helpers,从 Windows 10 开始,它们可以帮助避免在程序或库中实现代码生成。尽管这仅适用于 ATL thunk 之类的 thunk,而不是通用解决方案。
于 2020-05-04T04:42:07.707 回答