我如何创建简单的 C++ 代码,它在没有数据执行保护 (DEP) 的情况下运行良好,但在启用 DEP 时会崩溃?

How can I create simple C++ code that runs fine with no Data Execution Prevention (DEP) but will crash with DEP on?

虽然我知道未标记 "executable" 的代码会触发 DEP 崩溃,但我正在尝试了解哪种类型的常见编码实践(在遗留 Windows 应用程序中)会导致这种类型崩溃。

像这样:


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

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

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

  • 一种方法是@Remy 指出使用 VirtualAlloc 分配并使用 VirtualProtect 管理权限以确保执行权存在。
  • 更简单的方法是使用 HeapCreate 创建一个堆并传递 HEAP_CREATE_ENABLE_EXECUTE,在该堆上分配代码
  • 最后,还有 ATL thunk helpers,从 Windows 10 开始,它们可以帮助避免在程序或库中实现代码生成。虽然这只适用于像 ATL thunk 这样的 thunk,而不是通用解决方案。