加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中切换堆栈

发布时间:2020-12-16 04:54:31 所属栏目:百科 来源:网络整理
导读:我有一些旧的代码用C语言编写的16位使用Borland C,它使用longjmps在多个堆栈之间切换.它通过执行malloc创建一个新堆栈,然后使用内联汇编程序将SS和SP寄存器设置为malloc’d区域地址的段和偏移量.我想将它转换为Win32,看起来两个指令应该由设置ESP的单个指令
我有一些旧的代码用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的堆栈,您可以分配更大的堆栈.你为什么试图切换堆栈?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读