我如何创建简单的 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,而不是通用解决方案。
虽然我知道未标记 "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,而不是通用解决方案。