【问题标题】:How can I create simple C++ code that runs fine with no Data Execution Prevention (DEP) but will crash with DEP on?如何创建简单的 C++ 代码,在没有数据执行保护 (DEP) 的情况下运行良好,但在 DEP 开启时会崩溃?
【发布时间】:2020-08-18 11:11:00
【问题描述】:

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

【问题讨论】:

  • 在哪个操作系统上?
  • “常见”编码实践?希望没有,因为很少有“常见的”编码实践包括将代码放入数据或堆栈段中以供执行。唯一“常见”的地方是黑客、破解、病毒或其他类似的东西。
  • 如果用二进制机器代码指令填充无符号字符数组,然后尝试将其作为函数调用。类似于这家伙试图做的事情:stackoverflow.com/questions/55674951/…stackoverflow.com/questions/18476002/…
  • @Someprogrammerdude 至少在遗留 Windows 应用程序中是常见问题,包括相当主流的应用程序......我一直在调试/修补这个问题,但我从不从源代码工作,所以想知道它们是怎么回事首先创建

标签: c++ dep


【解决方案1】:

类似这样的:


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,而不是通用解决方案。

【讨论】:

  • 这很容易修复以支持 DEP。使用VirtualAlloc()代替malloc(),并使用VirtualProtect()在填充机器指令后授予内存执行权限。
  • 我已经详细阐述了可能的修复方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
相关资源
最近更新 更多