虽然我了解未标记为“可执行”的代码会触发 DEP 崩溃,但我试图了解哪种类型的常见编码实践(在旧版 Windows 应用程序中)会导致这种类型的崩溃。
问问题
200 次
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 回答