在C中切换堆栈

前端之家收集整理的这篇文章主要介绍了在C中切换堆栈前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些旧的代码用C语言编写的16位使用Borland C,它使用longjmps在多个堆栈之间切换.它通过执行malloc创建一个新堆栈,然后使用内联汇编程序将SS和SP寄存器设置为malloc’d区域地址的段和偏移量.我想将它转换为Win32,看起来两个指令应该由设置ESP的单个指令替换.这两条指令被CLI / STI对包围,但在Win32中这些指令给出了“特权指令”,所以我现在已将它们删除了.谈到 Windows,我是一个真正无辜的人,所以,我对我的第一个测试用例起作用感到非常惊讶!所以,我相当模糊的问题是在这里向专家询问我在做什么是a)太危险而不能继续,或者b)如果我添加一些代码,采取一些预防措施等会有效?如果是后者,应该添加什么,以及我在哪里可以找到它?我是否必须担心任何其他寄存器,如SS,EBX等?我没有使用优化…感谢您提供给我的任何提示.

解决方法

由于操作环境的不同,删除CLI / STI仍然有效.

在16位DOS上,可能会发生中断,并且此中断最初将在同一堆栈上运行.如果在操作过程中被中断,则中断可能会崩溃,因为您只更新了s而不是sp.

在Windows和任何其他现代环境中,每个用户模式线程都有自己的堆栈.如果您的线程因任何原因而中断,它的堆栈和上下文将被安全地保留 – 您不必担心在您的线程和堆栈上运行其他东西.在这种情况下,cli / sti将保护您免受操作系统已经受到保护的攻击.

正如Greg所说,在Windows上交换堆栈的安全,支持的方式是CreateFiber / SwitchToFiber.这确实会产生改变整个上下文的副作用,因此它不仅仅是切换堆栈.

这确实提出了你想做什么的问题.很多时候,切换堆栈是通过有限的堆栈空间获得的,在16位DOS上为64k.在Windows上,您有1 MB的堆栈,您可以分配更大的堆栈.你为什么试图切换堆栈?

原文链接:/c/120055.html

猜你在找的C&C++相关文章